Merge main, and regenerate the library menu it left stale

main's legend work added library/components/legends/SemanticTreeLegend.vue
without re-running the derived index, so check:library-index was failing on a
file none of this branch's work touched. Regenerated: 94 items catalogued.

public/doxa-maps/index.html conflicted. It is generated, so it was resolved by
regenerating the pipeline rather than by hand-merging two machine-written
files: build the bundle, rebuild the tree, re-hash. fix:sri then reports all
111 hashes already in agreement, which is the evidence the tree is coherent
rather than merely conflict-free.
This commit is contained in:
doxa-maps-88655c70 2026-09-24 13:31:15 +00:00
commit 273e6054fa
69 changed files with 973 additions and 487 deletions

View file

@ -0,0 +1,159 @@
#!/usr/bin/env node
// check-aria-labels-localized — no control may announce a RAW I18N KEY, and the
// accessible names must change with the locale.
//
// ★ THE ONE STRING A SIGHTED TESTER NEVER SEES. Every other untranslated string in
// this tree got caught because somebody looked at the screen. aria-label is only ever
// spoken aloud, so it survived every visual QA pass. Measured 2026-09-24 on the served
// upg-100-list leaf: the legend's toggle button announced the literal string
// "aria.toggleLegend" — in English too, not just translated locales — because vue-i18n
// ECHOES THE KEY when a lookup misses and `toggleLegend` was absent from aria.json
// while its two siblings (backToLegend, closeDetailView) were present. Six call sites
// across LegendDesktop.vue and LegendMobile.vue, desktop AND mobile, every locale.
//
// A second instance in the same sweep had the opposite shape: SemanticTreeLegend's
// collapse button hardcoded 'Collapse legend' / 'Expand legend' with no t() at all, so
// it was correct English and untranslatable. One key missing FROM the catalog, one
// string never routed TO it — the gate below catches both, because it compares what is
// ANNOUNCED across locales rather than reading the source.
//
// ⚠ TWO ASSERTIONS, NOT ONE. "No raw keys" alone passes a hardcoded English label, and
// "labels differ across locales" alone passes a raw key (a key is identical in every
// locale — which is exactly why the SEPARABILITY floor below is per-locale).
//
// ⚠ A RAW KEY HAS A SHAPE NO HUMAN LABEL HAS: dotted, camelCase, no spaces. That is the
// whole detector, and it is locale-independent — it works on Arabic and Chinese pages
// where no English word list could.
//
// Usage: node internal/check-aria-labels-localized.mjs <leafUrl> [locales]
import { chromium } from 'playwright'
const URL_ = process.argv[2] || process.env.ARIA_URL
if (!URL_) {
console.log('ARIA-LABELS-LOCALIZED: SKIP — no leaf url given.')
console.log(' Pass one, or set ARIA_URL. Serve the TREE ROOT (public/) and point at a leaf,')
console.log(' e.g. doxa-maps/my-upg-100-list/upg-100-list/index.html')
process.exit(0)
}
const UNDER_TEST = (process.argv[3] || 'es,ar,zh').split(',').map((s) => s.trim()).filter(Boolean)
// A raw vue-i18n key: starts lowercase, dotted, no whitespace. Human labels have spaces
// ("Zoom in") or are non-Latin; neither matches.
const RAW_KEY = /^[a-z][a-zA-Z0-9]*(\.[a-zA-Z0-9]+)+$/
// How many accessible names MUST change when the locale changes. Measured on the
// upg-100-list leaf 2026-09-24: 6 of 13, desktop and mobile alike. The rest are map-
// engine controls (Mapbox's own zoom/fullscreen buttons) whose labels this tree does
// not own. Override for a leaf with a different control set.
const LOCALIZED_FLOOR = Number(process.env.ARIA_LOCALIZED_FLOOR || 6)
async function readLabels(browser, lang, viewport, mobile) {
const page = await browser.newPage({ viewport, isMobile: mobile, hasTouch: mobile })
const errs = []
page.on('pageerror', (e) => errs.push(String(e).slice(0, 120)))
await page.goto(`${URL_}?lang=${lang}`, { waitUntil: 'load', timeout: 45000 })
await page.waitForTimeout(9000)
const labels = await page.evaluate(() => {
const walk = (root, out = []) => {
for (const el of root.querySelectorAll('*')) { out.push(el); if (el.shadowRoot) walk(el.shadowRoot, out) }
return out
}
// Shadow-piercing: these controls live several shadow roots deep.
return walk(document)
.filter((e) => e.getAttribute && e.getAttribute('aria-label') !== null)
.map((e) => (e.getAttribute('aria-label') || '').trim())
})
await page.close()
return { labels, errs }
}
const browser = await chromium.launch({ args: ['--use-gl=swiftshader', '--enable-unsafe-swiftshader'] })
const VIEWPORTS = [
{ name: 'desktop', viewport: { width: 1500, height: 1000 }, mobile: false },
{ name: 'mobile', viewport: { width: 390, height: 844 }, mobile: true },
]
const seen = {}
try {
for (const vp of VIEWPORTS) {
seen[vp.name] = {}
for (const loc of ['en', ...UNDER_TEST]) {
seen[vp.name][loc] = await readLabels(browser, loc, vp.viewport, vp.mobile)
}
}
} finally {
await browser.close()
}
const fails = []
const report = []
for (const vp of VIEWPORTS) {
const byLoc = seen[vp.name]
const en = byLoc.en
// PRECONDITION: a page with no aria-labels at all makes every assertion vacuous. A
// bundle that failed to execute renders nothing with zero page errors (the stale-SRI
// signature), and would otherwise read as "nothing untranslated".
if (!en.labels.length) {
fails.push(`${vp.name}: no aria-labels rendered at all — either the wrong url, or the `
+ 'bundle did not execute (a stale SRI hash refuses the script SILENTLY; run '
+ '`bun run tree` after `BUNDLE=<n> bun x vite build`)')
continue
}
for (const loc of ['en', ...UNDER_TEST]) {
const s = byLoc[loc]
// ASSERTION 1 — NO RAW KEYS, in every locale INCLUDING English. A missing catalog
// entry is announced as its own key name, which is gibberish to a screen reader.
const raw = [...new Set(s.labels.filter((t) => RAW_KEY.test(t)))]
if (raw.length) {
fails.push(`${vp.name}/${loc}: ${raw.length} control(s) announce a RAW I18N KEY — `
+ `${JSON.stringify(raw)} — vue-i18n echoes the key when the lookup misses, so a `
+ 'screen reader reads the key name aloud')
}
// NEVER BLANK either: an empty aria-label is worse than none, it suppresses the
// fallback to the element's own text.
const blank = s.labels.filter((t) => !t).length
if (blank) fails.push(`${vp.name}/${loc}: ${blank} EMPTY aria-label(s)`)
if (s.errs.length) fails.push(`${vp.name}/${loc}: ${s.errs.length} page error(s): ${s.errs[0]}`)
}
// ASSERTION 2 — THE LOCALE MUST MOVE THEM. Raw-key-free is not the same as localized:
// a hardcoded English label passes assertion 1 forever. At least one accessible name
// must differ from English in each locale, or nothing on this surface is translated.
for (const loc of UNDER_TEST) {
const s = byLoc[loc]
const diff = s.labels.filter((t, i) => en.labels[i] && t !== en.labels[i]).length
if (s.labels.length && diff === 0) {
fails.push(`${vp.name}/${loc}: NOT ONE of ${s.labels.length} aria-label(s) differs from `
+ 'English — the accessible names are hardcoded, not catalogued')
}
// ⚠ A FLOOR, NOT JUST "> 0". `diff === 0` alone is decoration: it prints a count and
// only fails when EVERY label regresses. Measured 2026-09-24 — hardcoding ONE label
// back to English dropped this from 6 to 5 and the gate still passed, which is the
// exact shape ("a number printed but not asserted on") this tree keeps rediscovering.
// The floor is the count that currently holds, so any single regression goes red.
// RAISE IT when you localize more; never lower it to make a red build green.
if (s.labels.length && diff < LOCALIZED_FLOOR) {
fails.push(`${vp.name}/${loc}: only ${diff} of ${s.labels.length} aria-label(s) differ from `
+ `English, expected at least ${LOCALIZED_FLOOR} — a label that used to be catalogued `
+ 'has been hardcoded back to English (it leaves no raw key behind, so assertion 1 '
+ 'cannot see it)')
}
report.push(` ${vp.name.padEnd(8)} ${loc.padEnd(3)}: ${diff}/${s.labels.length} differ from English, `
+ `${s.labels.filter((t) => RAW_KEY.test(t)).length} raw key(s), ${s.labels.filter((t) => !t).length} blank`)
}
}
console.log('ARIA-LABELS-LOCALIZED')
console.log(` leaf : ${URL_}`)
console.log(` labels : ${seen.desktop?.en?.labels.length ?? 0} desktop / ${seen.mobile?.en?.labels.length ?? 0} mobile (English)`)
for (const line of report) console.log(line)
if (fails.length) {
console.error(`\nARIA-LABELS-LOCALIZED: FAIL — ${fails.length} problem(s)`)
for (const f of fails) console.error(' - ' + f)
process.exit(1)
}
console.log('\nARIA-LABELS-LOCALIZED: PASS — no control announces a raw i18n key, none is blank, '
+ 'and choosing a locale changes what a screen reader says.')

View file

@ -0,0 +1,148 @@
#!/usr/bin/env node
// check-legend-info-localized — the legend's INFO POPOVERS must translate, in the
// real served page, not in a reimplementation of the lookup.
//
// ★ WHY THIS EXISTS BESIDE check:tabs-localized. That gate proves the dynamic-key
// mechanism reaches tabs.json — genuinely valuable, and it passes. But it tests SEVEN
// HARDCODED research-map tabs and it REIMPLEMENTS tabLabel() inside page.evaluate with
// catalogs fed in by hand. So it proves "tab localization works, for these seven",
// which is not the same claim as "this profile's tabs are localized". The UPG-100
// legend's three tabs were absent from tabs.json entirely and that gate stayed green.
//
// ⚠ AND IT NEVER LOOKED AT `info` AT ALL. SemanticTreeLegend rendered `tab.info` RAW in
// all three places it appears (the button's title=, and the popover body) while the tab
// LABEL beside it went through the catalog. Measured 2026-09-24 on the served leaf:
// ?lang=es changed 2 of 76 rendered strings ("POPULATION" -> "POBLACIÓN") and left all
// three tabs AND all three info popovers in English. The mechanism worked; the strings
// were never catalogued. The Driver named this affordance specifically — "the tab itself
// gives you a little information button that will explain what a UPG-100 list is" —
// which is exactly the sentence a reader who does not read English cannot use.
//
// ⚠ IT RENDERS THE REAL PAGE. A catalog-only check cannot tell a shipped translation
// from a dead one, and a reimplemented lookup cannot tell you the component actually
// calls it. This opens the served leaf, switches locale the way a reader does (?lang=),
// CLICKS each info button and reads the popover that paints.
//
// ⚠ WAIT FOR THE FLUSH. showInfo() sets a ref; reading the DOM in the same tick as the
// click finds no popover and reads as "the affordance is broken". Measured: the first
// version of this probe reported "(no popover)" in every locale against a working build.
//
// Usage: node internal/check-legend-info-localized.mjs <leafUrl> [locales]
import { chromium } from 'playwright'
import { readFileSync, existsSync } from 'node:fs'
import { join, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const REPO = join(dirname(fileURLToPath(import.meta.url)), '..')
const LOCALES = join(REPO, 'library/i18n/locales')
const URL_ = process.argv[2] || process.env.LEGEND_URL
if (!URL_) {
console.log('LEGEND-INFO-LOCALIZED: SKIP — no leaf url given.')
console.log(' Pass one, or set LEGEND_URL. Serve the TREE ROOT (public/doxa-maps) and point')
console.log(' at a profile whose legend carries per-tab info buttons, e.g.')
console.log(' my-upg-100-list/upg-100-list/index.html')
process.exit(0)
}
const UNDER_TEST = (process.argv[3] || 'es,ar,zh').split(',').map((s) => s.trim()).filter(Boolean)
const legendCat = (loc) => {
const p = join(LOCALES, loc, 'legend.json')
return existsSync(p) ? JSON.parse(readFileSync(p, 'utf8')) : null
}
// Read each locale's info popovers from the REAL page, clicking every info button.
async function readLegend(page, url, lang) {
const errs = []
page.on('pageerror', (e) => errs.push(String(e).slice(0, 120)))
await page.goto(`${url}?lang=${lang}`, { waitUntil: 'load', timeout: 45000 })
await page.waitForTimeout(9000)
const walkFn = () => {
const walk = (root, out = []) => {
for (const el of root.querySelectorAll('*')) { out.push(el); if (el.shadowRoot) walk(el.shadowRoot, out) }
return out
}
return walk(document)
}
const count = await page.evaluate(`(${walkFn.toString()})().filter(e => (e.className||'').toString().includes('stl-tab-info')).length`)
const pops = []
for (let i = 0; i < count; i++) {
await page.evaluate(`(${walkFn.toString()})().filter(e => (e.className||'').toString().includes('stl-tab-info'))[${i}]?.click()`)
// ⚠ showInfo() sets a ref — read AFTER Vue flushes, or every popover reads empty.
await page.waitForTimeout(400)
pops.push(await page.evaluate(`(() => { const el = (${walkFn.toString()})().find(e => (e.className||'').toString().includes('stl-info-pop')); return el ? (el.innerText||'').trim() : '' })()`))
}
const tabs = await page.evaluate(`(${walkFn.toString()})().filter(e => (e.className||'').toString().includes('stl-tab-chip')).map(c => (c.innerText||'').trim().split('\\n')[0]).filter(Boolean)`)
return { tabs, pops, errs }
}
const browser = await chromium.launch({ args: ['--use-gl=swiftshader', '--enable-unsafe-swiftshader'] })
const seen = {}
try {
for (const loc of ['en', ...UNDER_TEST]) {
const page = await browser.newPage({ viewport: { width: 1500, height: 1000 } })
seen[loc] = await readLegend(page, URL_, loc)
await page.close()
}
} finally {
await browser.close()
}
const en = seen.en
const fails = []
// PRECONDITION: this page must actually HAVE the affordance, or every assertion below
// is vacuous. A leaf whose bundle failed to execute renders zero tabs with zero page
// errors — the stale-SRI signature — and would otherwise pass as "nothing untranslated".
if (!en.pops.length) {
console.error('\nLEGEND-INFO-LOCALIZED: FAIL — no info buttons rendered at all in English.')
console.error(' Either this profile has no per-tab info affordance (wrong url), or the bundle')
console.error(' did not execute. A stale SRI hash refuses the script SILENTLY, with no page')
console.error(` error and zero tabs — run \`bun run tree\` after \`BUNDLE=<n> bun x vite build\`.`)
console.error(` tabs rendered: ${JSON.stringify(en.tabs)} page errors: ${en.errs.length}`)
process.exit(1)
}
// THE LOAD-BEARING ASSERTION. A chosen locale must CHANGE the info text — that is the
// difference between a translation that ships and one that merely exists on disk.
const separable = {}
for (const loc of UNDER_TEST) {
const s = seen[loc]
if (!s.pops.length) { fails.push(`${loc}: no info popovers rendered (English had ${en.pops.length})`); continue }
if (s.pops.length !== en.pops.length) {
fails.push(`${loc}: ${s.pops.length} info popover(s), English had ${en.pops.length}`)
}
// NEVER BLANK. The whole point of a per-key fallback is that an untranslated key
// shows English rather than nothing.
const blank = s.pops.filter((t) => !t.trim()).length
if (blank) fails.push(`${loc}: ${blank} info popover(s) rendered BLANK — the fallback should show English`)
// Count how many DIFFER from English. Zero means the catalog is not reached: either
// the entries are missing, or the component renders the raw prop as it used to.
const diff = s.pops.filter((t, i) => t && en.pops[i] && t !== en.pops[i]).length
separable[loc] = diff
const cat = legendCat(loc)
const catKeys = cat && cat.tabInfo ? Object.keys(cat.tabInfo).length : 0
if (catKeys > 0 && diff === 0) {
fails.push(`${loc}: legend.json declares ${catKeys} tabInfo key(s) but NOT ONE info popover `
+ 'differs from English — the catalog is present and unreached (the raw-prop bug)')
}
if (s.errs.length) fails.push(`${loc}: ${s.errs.length} page error(s): ${s.errs[0]}`)
}
console.log('LEGEND-INFO-LOCALIZED')
console.log(` leaf : ${URL_}`)
console.log(` info popups: ${en.pops.length} (English)`)
console.log(` tabs : ${en.tabs.join(' · ')}`)
for (const loc of UNDER_TEST) {
const s = seen[loc]
console.log(` ${loc.padEnd(10)}: ${separable[loc] ?? 0}/${s.pops.length} info text(s) differ from English, `
+ `${s.pops.filter((t) => !t.trim()).length} blank tabs: ${s.tabs.join(' · ')}`)
}
if (fails.length) {
console.error(`\nLEGEND-INFO-LOCALIZED: FAIL — ${fails.length} problem(s)`)
for (const f of fails) console.error(' - ' + f)
process.exit(1)
}
console.log('\nLEGEND-INFO-LOCALIZED: PASS — choosing a locale changes the rendered info text, so '
+ 'the legend\'s explanations reach the reader in their own language, never blank.')

View file

@ -186,6 +186,32 @@ const r = await page.evaluate(() => {
rhythms: RHYTHMS.filter((w) => body.includes(w)).length,
rhythmsTotal: RHYTHMS.length,
wheelSegs: document.querySelectorAll('svg path[fill^="hsl"]').length,
// ⚠ COUNT THE WHEEL'S OWN LABELS, SCOPED TO THE WHEEL SHEET. `rhythms` below
// searches document.body.innerText, and the SAME rhythm vocabulary is rendered
// TWICE — once per wheel segment, and once per prayer point (each point prints
// tr(p.rhythm) as its heading). So "every rhythm word appears in the document" is
// satisfied by the POINTS page alone and says nothing about the wheel.
// Measured 2026-09-24: blanking every wheel segment label left the gate reporting
// "12 segments, 11/11 rhythms, content intact — PASS" on a prayer wheel that was a
// twelve-colour pie chart with no words on it. Both numbers stayed true: the
// segments are <path> elements and survive, and the words were still on the points
// page. The Driver's spec names the wheel as one of the packet's four sections.
//
// COUNT ELEMENTS, NOT DISTINCT WORDS. `order` renders 12 segments from 12 keys, but
// `praise` and `praise_end` collapse to the same word in English (which is why the
// line below prints 11/11, not 12/12) — and that collision is LOCALE-DEPENDENT. A
// distinct-word count would be a different number per language.
wheelLabels: (() => {
const title = document.querySelector('.wheel-title')
const sheet = title ? title.closest('.sheet') : null
const svg = sheet ? sheet.querySelector('svg') : null
if (!svg) return -1
// The segment labels are the non-numeric <text> runs: the pips are all "5" and
// the footer reads "5 <minutes> x 12".
return [...svg.querySelectorAll('text')]
.map((t) => (t.textContent || '').trim())
.filter((s) => s && !/^\d+$/.test(s) && !/^\d[\s\S]*×\s*12$/.test(s)).length
})(),
// ⚠ NOT body.includes('Gadarenes'). That was an ENGLISH proper noun, so this
// assertion would go RED on a correctly-translated packet and stays green today
// only because every locale falls back to English for this key. The check and the
@ -268,6 +294,17 @@ if (r.cards && expectPhotos && r.imgs === 0) {
+ 'PACKET_EXPECT_PHOTOS=0 to declare this a deliberately photo-less packet.')
}
if (r.wheelSegs !== 12) fails.push(`prayer wheel has ${r.wheelSegs} segments, expected 12`)
// A SEGMENT WITHOUT ITS WORD IS A COLOUR. 12 labels, one per segment, on the wheel
// sheet itself — not merely somewhere in the document.
const WHEEL_LABELS = 12
if (r.wheelLabels !== WHEEL_LABELS) {
fails.push(r.wheelLabels === -1
? 'no prayer-wheel svg found (no .wheel-title sheet) — the wheel page did not render'
: `the prayer wheel paints ${r.wheelLabels} segment label(s), expected ${WHEEL_LABELS} — `
+ 'the rhythm words are rendered TWICE in this packet (wheel segments and prayer-point '
+ 'headings), so the document-wide rhythm check below passes on the points page alone '
+ 'and cannot see an unlabelled wheel')
}
if (r.rhythms !== r.rhythmsTotal) fails.push(`only ${r.rhythms}/${r.rhythmsTotal} prayer rhythms present`)
// Mark 5:1-20 in full is a Driver requirement for point 4: "it actually lists out the
// full scripture, because prayer point number four is actually read the word." The
@ -437,7 +474,7 @@ if (r.ranges.length) {
console.log(` sheets/PDF pages : ${r.sheets} / ${pages}`)
console.log(` people cards : ${r.cards} (${r.imgs} photos, ${r.nophoto} typographic)`)
console.log(` prayer points : ${r.points} / ${POINTS_EXPECT}`)
console.log(` wheel segments : ${r.wheelSegs}`)
console.log(` wheel segments : ${r.wheelSegs} (${r.wheelLabels}/${WHEEL_LABELS} labelled)`)
console.log(` Mark 5 in full : ${r.mark5Len} chars`
+ `${scriptureIsEnglish ? ' ⚠ UNTRANSLATED (English fallback)' : ''}`)
console.log(` metacamp.org : ${r.metacamp}`)

View file

@ -41,6 +41,25 @@ function tabLabel(tab) {
return tab && te(key) ? t(key) : (tab?.label ?? '')
}
// THE INFO TEXT IS THE PART A NON-ENGLISH READER NEEDS MOST, and it was the one part
// that never went through the catalog. `tab.info` rendered RAW in all three places it
// appears (the button's title=, and the popover body), so a Spanish reader saw a
// translated tab chip beside an English explanation of what that chip means. Measured
// 2026-09-24 on the served upg-100-list leaf: ?lang=es changed 2 of 76 rendered strings
// ("POPULATION" -> "POBLACIÓN") and left all three legend tabs AND all three info
// popovers in English — the locale switch works, the strings were simply never in a
// catalog. The Driver named this affordance specifically ("the tab itself gives you a
// little information button that will explain what a UPG-100 list is"), which is exactly
// the sentence a reader who does not read English cannot use.
//
// Same shape as tabLabel: `legend.tabInfo.<i18nKey|id>`, te() guard, falling back to the
// hardcoded English `info` so a tab with no catalog entry renders unchanged rather than
// blank. PER KEY, so a half-finished translation shows its finished entries.
function tabInfo(tab) {
const key = 'legend.tabInfo.' + (tab?.i18nKey || tab?.id)
return tab && te(key) ? t(key) : (tab?.info ?? '')
}
const props = defineProps({
nodes: { type: Array, default: () => [] },
tabs: { type: Array, default: null },
@ -1039,8 +1058,8 @@ useShadowStyles(`
v-if="!$slots['title-caret']"
class="stl-collapse-btn"
:class="{ closed: !panelOpen }"
:title="panelOpen ? 'Collapse legend' : 'Expand legend'"
:aria-label="panelOpen ? 'Collapse legend' : 'Expand legend'"
:title="panelOpen ? t('aria.collapseLegend') : t('aria.expandLegend')"
:aria-label="panelOpen ? t('aria.collapseLegend') : t('aria.expandLegend')"
:aria-expanded="String(panelOpen)"
@click="panelOpen = !panelOpen; emit('update:open', panelOpen)">
<svg width="9" height="9" viewBox="0 0 12 12" fill="none">
@ -1136,12 +1155,12 @@ useShadowStyles(`
<div v-for="(tab, idx) in tabList" :key="tab.id"
class="stl-tab-chip" :class="{ active: activeTab === idx }">
<button class="stl-tab" @click="switchTab(idx)">{{ tabLabel(tab) }}</button>
<button v-if="tab.info" class="stl-tab-info" :title="tab.info"
<button v-if="tab.info" class="stl-tab-info" :title="tabInfo(tab)"
@click="showInfo(idx, $event)">i</button>
</div>
</div>
<div v-if="showInfoForTab !== null && tabList[showInfoForTab]?.info" class="stl-info-pop">
{{ tabList[showInfoForTab].info }}
{{ tabInfo(tabList[showInfoForTab]) }}
</div>
</div>

View file

@ -1,4 +1,7 @@
{
"backToLegend": "العودة إلى المفتاح",
"closeDetailView": "إغلاق عرض التفاصيل"
"closeDetailView": "إغلاق عرض التفاصيل",
"collapseLegend": "طيّ وسيلة الإيضاح",
"expandLegend": "توسيع وسيلة الإيضاح",
"toggleLegend": "إظهار وسيلة الإيضاح أو إخفاؤها"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "الشعوب",
"wagfRegions": "مناطق WAGF",
"languages": "اللغات"
},
"tabInfo": {
"upg100Region": "المنطقة — ترتّب قوائم UPG-100 حسب منطقة العالم (أفريقيا، الهند، الشرق الأوسط، الصمّ، …). الأعداد هي مجموع UUPG والسكان لكل قائمة تحتها.",
"upg100Zone": "قوائم UPG-100 — كل واحدة هي قائمة صلاة للشعوب غير الموصول إليها في منطقة ما، وهي ما ترسمه الخريطة وتلوّنه. تُطبع كل قائمة ككُتيّب خاص بها.",
"upg100Group": "مجموعة شعبية — المجموعات غير الموصول إليها داخل القائمة، الأكثر حاجة للصلاة أولاً. كل نقطة على الخريطة هي واحدة منها."
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "الشعب في الدولة",
"region": "منطقة WAGF",
"block": "كتلة WAGF",
"country": "الدولة"
}
"country": "الدولة",
"upg100Region": "المنطقة",
"upg100Zone": "قوائم UPG-100",
"upg100Group": "مجموعة شعبية"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "Zurück zur Legende",
"closeDetailView": "Detailansicht schließen"
"closeDetailView": "Detailansicht schließen",
"collapseLegend": "Legende einklappen",
"expandLegend": "Legende ausklappen",
"toggleLegend": "Legende ein- oder ausblenden"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "Völker",
"wagfRegions": "WAGF-Regionen",
"languages": "Sprachen"
},
"tabInfo": {
"upg100Region": "Region — sortiert die UPG-100-Listen nach Weltgegend (Afrika, Indien, Naher Osten, Gehörlose, …). Die Zahlen sind die UUPGs und die Bevölkerung aller darunterliegenden Listen zusammen.",
"upg100Zone": "UPG-100-Listen — jede ist eine Gebetsliste der unerreichten Volksgruppen eines Gebiets und das, was die Karte zeichnet und einfärbt. Jede Liste wird als eigenes Heft gedruckt.",
"upg100Group": "Volksgruppe — die einzelnen unerreichten Gruppen innerhalb einer Liste, größter Gebetsbedarf zuerst. Jeder Kartenpunkt ist eine davon."
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "Volksgruppe im Land",
"region": "WAGF-Region",
"block": "WAGF-Block",
"country": "Land"
}
"country": "Land",
"upg100Region": "Region",
"upg100Zone": "UPG-100-Listen",
"upg100Group": "Volksgruppe"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "Back to Legend",
"closeDetailView": "Close detail view"
"closeDetailView": "Close detail view",
"collapseLegend": "Collapse legend",
"expandLegend": "Expand legend",
"toggleLegend": "Show or hide the legend"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "People Groups",
"wagfRegions": "WAGF Regions",
"languages": "Languages"
},
"tabInfo": {
"upg100Region": "Region — sort the UPG-100 lists by world area (Africa, India, Middle East, Deaf, …). Counts are the UUPGs and population summed across every list beneath it.",
"upg100Zone": "UPG-100 Lists — each one is a prayer list of the unreached people groups in an area, and is what the map paints and colours. Every list prints as its own packet.",
"upg100Group": "People Group — the individual unreached groups inside a list, largest prayer need first. Each map dot is one of these."
}
}

View file

@ -16,5 +16,8 @@
"pgic": "PG in Country",
"region": "WAGF Region",
"block": "WAGF Bloc",
"country": "Country"
}
"country": "Country",
"upg100Region": "Region",
"upg100Zone": "UPG-100 Lists",
"upg100Group": "People Group"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "Volver a la leyenda",
"closeDetailView": "Cerrar vista de detalle"
"closeDetailView": "Cerrar vista de detalle",
"collapseLegend": "Contraer la leyenda",
"expandLegend": "Expandir la leyenda",
"toggleLegend": "Mostrar u ocultar la leyenda"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "Pueblos",
"wagfRegions": "Regiones WAGF",
"languages": "Idiomas"
},
"tabInfo": {
"upg100Region": "Región — ordena las listas UPG-100 por área mundial (África, India, Oriente Medio, Sordos, …). Los totales son los UUPG y la población sumados de todas las listas que contiene.",
"upg100Zone": "Listas UPG-100 — cada una es una lista de oración de los grupos étnicos no alcanzados de un área, y es lo que el mapa pinta y colorea. Cada lista se imprime como su propio paquete.",
"upg100Group": "Grupo étnico — los grupos no alcanzados dentro de una lista, primero los de mayor necesidad de oración. Cada punto del mapa es uno de ellos."
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "Pueblo en país",
"region": "Región WAGF",
"block": "Bloque WAGF",
"country": "País"
}
"country": "País",
"upg100Region": "Región",
"upg100Zone": "Listas UPG-100",
"upg100Group": "Grupo étnico"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "Retour à la légende",
"closeDetailView": "Fermer la vue détaillée"
"closeDetailView": "Fermer la vue détaillée",
"collapseLegend": "Réduire la légende",
"expandLegend": "Développer la légende",
"toggleLegend": "Afficher ou masquer la légende"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "Peuples",
"wagfRegions": "Régions WAGF",
"languages": "Langues"
},
"tabInfo": {
"upg100Region": "Région — trie les listes UPG-100 par zone du monde (Afrique, Inde, Moyen-Orient, Sourds, …). Les totaux sont les UUPG et la population additionnés sur toutes les listes qu’elle contient.",
"upg100Zone": "Listes UPG-100 — chacune est une liste de prière des groupes de peuples non atteints d’une zone, et c’est ce que la carte dessine et colore. Chaque liste s’imprime comme son propre livret.",
"upg100Group": "Groupe de peuples — les groupes non atteints au sein d’une liste, les plus grands besoins de prière en premier. Chaque point de la carte en est un."
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "Peuple dans le pays",
"region": "Région WAGF",
"block": "Bloc WAGF",
"country": "Pays"
}
"country": "Pays",
"upg100Region": "Région",
"upg100Zone": "Listes UPG-100",
"upg100Group": "Groupe de peuples"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "लेजेंड पर वापस जाएं",
"closeDetailView": "विवरण दृश्य बंद करें"
"closeDetailView": "विवरण दृश्य बंद करें",
"collapseLegend": "लेजेंड संक्षिप्त करें",
"expandLegend": "लेजेंड विस्तृत करें",
"toggleLegend": "लेजेंड दिखाएँ या छिपाएँ"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "जनसमूह",
"wagfRegions": "WAGF क्षेत्र",
"languages": "भाषाएँ"
},
"tabInfo": {
"upg100Region": "क्षेत्र — UPG-100 सूचियों को विश्व क्षेत्र के अनुसार क्रमित करता है (अफ़्रीका, भारत, मध्य पूर्व, बधिर, …)। संख्याएँ उसके नीचे की हर सूची के UUPG और जनसंख्या का योग हैं।",
"upg100Zone": "UPG-100 सूचियाँ — हर एक किसी क्षेत्र के अनपहुँचे जनसमूहों की प्रार्थना सूची है, और यही मानचित्र बनाता और रंगता है। हर सूची अपने अलग पैकेट के रूप में छपती है।",
"upg100Group": "जनसमूह — किसी सूची के भीतर के अलग-अलग अनपहुँचे समूह, सबसे बड़ी प्रार्थना आवश्यकता पहले। मानचित्र का हर बिंदु इनमें से एक है।"
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "देश में जनसमूह",
"region": "WAGF क्षेत्र",
"block": "WAGF ब्लॉक",
"country": "देश"
}
"country": "देश",
"upg100Region": "क्षेत्र",
"upg100Zone": "UPG-100 सूचियाँ",
"upg100Group": "जनसमूह"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "Torna alla legenda",
"closeDetailView": "Chiudi vista dettaglio"
"closeDetailView": "Chiudi vista dettaglio",
"collapseLegend": "Comprimi la legenda",
"expandLegend": "Espandi la legenda",
"toggleLegend": "Mostra o nascondi la legenda"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "Popoli",
"wagfRegions": "Regioni WAGF",
"languages": "Lingue"
},
"tabInfo": {
"upg100Region": "Regione — ordina le liste UPG-100 per area del mondo (Africa, India, Medio Oriente, Sordi, …). I totali sono gli UUPG e la popolazione sommati di ogni lista sottostante.",
"upg100Zone": "Liste UPG-100 — ognuna è una lista di preghiera dei gruppi etnici non raggiunti di un’area, ed è ciò che la mappa disegna e colora. Ogni lista si stampa come il proprio fascicolo.",
"upg100Group": "Gruppo etnico — i singoli gruppi non raggiunti dentro una lista, prima quelli con maggiore bisogno di preghiera. Ogni punto della mappa è uno di questi."
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "Popolo nel paese",
"region": "Regione WAGF",
"block": "Blocco WAGF",
"country": "Paese"
}
"country": "Paese",
"upg100Region": "Regione",
"upg100Zone": "Liste UPG-100",
"upg100Group": "Gruppo etnico"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "Voltar à legenda",
"closeDetailView": "Fechar vista de detalhe"
"closeDetailView": "Fechar vista de detalhe",
"collapseLegend": "Recolher a legenda",
"expandLegend": "Expandir a legenda",
"toggleLegend": "Mostrar ou ocultar a legenda"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "Povos",
"wagfRegions": "Regiões WAGF",
"languages": "Idiomas"
},
"tabInfo": {
"upg100Region": "Região — ordena as listas UPG-100 por área do mundo (África, Índia, Oriente Médio, Surdos, …). Os totais são os UUPG e a população somados de todas as listas abaixo dela.",
"upg100Zone": "Listas UPG-100 — cada uma é uma lista de oração dos grupos étnicos não alcançados de uma área, e é o que o mapa pinta e colore. Cada lista é impressa como seu próprio pacote.",
"upg100Group": "Grupo étnico — os grupos não alcançados dentro de uma lista, primeiro os de maior necessidade de oração. Cada ponto do mapa é um deles."
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "Povo no país",
"region": "Região WAGF",
"block": "Bloco WAGF",
"country": "País"
}
"country": "País",
"upg100Region": "Região",
"upg100Zone": "Listas UPG-100",
"upg100Group": "Grupo étnico"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "Înapoi la legendă",
"closeDetailView": "Închide vizualizarea detaliată"
"closeDetailView": "Închide vizualizarea detaliată",
"collapseLegend": "Restrânge legenda",
"expandLegend": "Extinde legenda",
"toggleLegend": "Afișează sau ascunde legenda"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "Popoare",
"wagfRegions": "Regiuni WAGF",
"languages": "Limbi"
},
"tabInfo": {
"upg100Region": "Regiune — sortează listele UPG-100 după zona lumii (Africa, India, Orientul Mijlociu, Surzi, …). Totalurile sunt UUPG-urile și populația însumate din fiecare listă de dedesubt.",
"upg100Zone": "Liste UPG-100 — fiecare este o listă de rugăciune a grupurilor etnice neatinse dintr-o zonă și este ceea ce harta desenează și colorează. Fiecare listă se tipărește ca propriul pachet.",
"upg100Group": "Grup etnic — grupurile neatinse dintr-o listă, mai întâi cele cu cea mai mare nevoie de rugăciune. Fiecare punct de pe hartă este unul dintre ele."
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "Popor în țară",
"region": "Regiune WAGF",
"block": "Bloc WAGF",
"country": "Țară"
}
"country": "Țară",
"upg100Region": "Regiune",
"upg100Zone": "Liste UPG-100",
"upg100Group": "Grup etnic"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "Назад к легенде",
"closeDetailView": "Закрыть подробный вид"
"closeDetailView": "Закрыть подробный вид",
"collapseLegend": "Свернуть легенду",
"expandLegend": "Развернуть легенду",
"toggleLegend": "Показать или скрыть легенду"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "Народы",
"wagfRegions": "Регионы WAGF",
"languages": "Языки"
},
"tabInfo": {
"upg100Region": "Регион — сортирует списки UPG-100 по частям света (Африка, Индия, Ближний Восток, Глухие, …). Числа — это UUPG и население, просуммированные по всем спискам внутри.",
"upg100Zone": "Списки UPG-100 — каждый представляет собой молитвенный список непросвещённых народов области и именно он отображается и раскрашивается на карте. Каждый список печатается отдельным буклетом.",
"upg100Group": "Народ — отдельные непросвещённые народы внутри списка, сначала с наибольшей нуждой в молитве. Каждая точка на карте — один из них."
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "Народ в стране",
"region": "Регион WAGF",
"block": "Блок WAGF",
"country": "Страна"
}
"country": "Страна",
"upg100Region": "Регион",
"upg100Zone": "Списки UPG-100",
"upg100Group": "Народ"
}

View file

@ -1,4 +1,7 @@
{
"backToLegend": "返回图例",
"closeDetailView": "关闭详情视图"
"closeDetailView": "关闭详情视图",
"collapseLegend": "收起图例",
"expandLegend": "展开图例",
"toggleLegend": "显示或隐藏图例"
}

View file

@ -54,5 +54,10 @@
"peopleGroups": "民族",
"wagfRegions": "WAGF 区域",
"languages": "语言"
},
"tabInfo": {
"upg100Region": "区域 — 按世界区域排列 UPG-100 名单(非洲、印度、中东、聋人……)。数字是其下每份名单的 UUPG 与人口总和。",
"upg100Zone": "UPG-100 名单 — 每一份都是某地区未得之民的祷告名单,也是地图所绘制和上色的内容。每份名单印成独立的祷告册。",
"upg100Group": "族群 — 名单内各个未得之民群体,祷告需要最大的排在前面。地图上每个点就是其中之一。"
}
}
}

View file

@ -16,5 +16,8 @@
"pgic": "国内民族",
"region": "WAGF 区域",
"block": "WAGF 板块",
"country": "国家"
}
"country": "国家",
"upg100Region": "区域",
"upg100Zone": "UPG-100 名单",
"upg100Group": "族群"
}

View file

@ -112,6 +112,8 @@
"verify:browser-all": "node internal/verify-browser-all.mjs # runs EVERY browser gate in the GATES array over the built tree in one command (needs `bun run serve` on 4173 + MAPBOX_TOKEN). Deliberately does NOT state a count: GATES lives in the .mjs and grows, so a number here rots on the next append — it said \"ALL 7\" while the array held 9. The script prints its own GATES.length at runtime; trust that. Every gate listed was RUN before being listed. The `verify:browser-all:plugin-gallery` mode is separate because it needs the vite dev server.",
"check:shot-fonts": "node internal/check-shot-fonts.mjs # can THIS machine render the emoji the UI uses? Run BEFORE `bun run shots` — no font = tofu boxes in every committed PNG, which every other shot gate passes. Deliberately NOT in build:unlocked: it reports an ENVIRONMENT condition (this box has no emoji font), and a gate that always fails in the build makes the build useless.",
"smoke:share-all": "sh -c 'B=${BASE_URL:-http://127.0.0.1:4173}; exec node internal/share-roundtrip-smoke.mjs --url \"$B/doxa-maps/prayer-walk-planner/prayer-walk-planner/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/all-people-groups/all-people-groups/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/cities-internet/connectivity-map/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/country-posters/country-posters-mfe/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/demo-map/demo-map/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/doxa-research-map/research-map/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/doxa-simple-map/doxa-simple-map/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/gospel-resources/resources-map/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/research-dashboard/research-dashboard/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/dashboard-plus-grid/dashboard-plus-grid/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/research-map-plus-grid/research-map-plus-grid/index.html?tk=$MAPBOX_TOKEN\" --url \"$B/doxa-maps/my-upg-100-list/upg-100-mfe/index.html?tk=$MAPBOX_TOKEN\" --browser chromium'",
"smoke:legend-info": "sh -c 'B=${BASE_URL:-http://127.0.0.1:4173}; exec node internal/check-legend-info-localized.mjs \"$B/doxa-maps/my-upg-100-list/upg-100-list/index.html\" es,ar,zh'",
"smoke:aria-labels": "sh -c 'B=${BASE_URL:-http://127.0.0.1:4173}; exec node internal/check-aria-labels-localized.mjs \"$B/doxa-maps/my-upg-100-list/upg-100-list/index.html\" es,ar,zh'",
"check:sfc-parse": "node internal/check-sfc-script-parses.mjs # every .vue script block must parse as the BUILD parses it — catches the LIVE-CSS backtick that check:template-literal cannot see (it reads CSS comments only). 0 false positives on 83 files, where 3 lookahead heuristics scored 98 and 136.",
"check:url-resolver": "node internal/check-url-resolver.mjs # cap-5 resolve() must not prefix a rooted URL (the dev-surface 404 class)",
"smoke:studio": "node internal/smoke-studio.mjs # 5s DEV-surface check: / mounts the studio, tabs>0, 0 4xx (exit 2 = dev server down)",

File diff suppressed because one or more lines are too long

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <cities-internet-map> custom element. -->
<script src="../cities-internet.js" integrity="sha384-qK1s7qgMF7DaMDxJXnS8StZi7vTRWSgWe564NFF2HUO889PW8Sp+uHaTd2LjdI7S" crossorigin="anonymous"></script>
<script src="../cities-internet.js" integrity="sha384-nzv5X2WdO5IqlVUqnmsDPDSq2uHRbJGyoDIEjHz915D7nAeS428kzYSeaRyAIEf2" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <cities-internet-map> custom element. -->
<script src="../cities-internet.js" integrity="sha384-qK1s7qgMF7DaMDxJXnS8StZi7vTRWSgWe564NFF2HUO889PW8Sp+uHaTd2LjdI7S" crossorigin="anonymous"></script>
<script src="../cities-internet.js" integrity="sha384-nzv5X2WdO5IqlVUqnmsDPDSq2uHRbJGyoDIEjHz915D7nAeS428kzYSeaRyAIEf2" 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 <cities-internet-map> custom element. -->
<script src="../cities-internet.js" integrity="sha384-qK1s7qgMF7DaMDxJXnS8StZi7vTRWSgWe564NFF2HUO889PW8Sp+uHaTd2LjdI7S" crossorigin="anonymous"></script>
<script src="../cities-internet.js" integrity="sha384-nzv5X2WdO5IqlVUqnmsDPDSq2uHRbJGyoDIEjHz915D7nAeS428kzYSeaRyAIEf2" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-5NIVhkaYneMmaHPBew8npZq0dQTh17eS/HtI9F1tmkILC4YWB0564qqO51BKisn+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-+uSJg/LdhuPzecJG34oeevbtghdX7Pqaop+MyNzs4tyqd3/1frmrwQimIJgcv/yo" 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-5NIVhkaYneMmaHPBew8npZq0dQTh17eS/HtI9F1tmkILC4YWB0564qqO51BKisn+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-+uSJg/LdhuPzecJG34oeevbtghdX7Pqaop+MyNzs4tyqd3/1frmrwQimIJgcv/yo" 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-5NIVhkaYneMmaHPBew8npZq0dQTh17eS/HtI9F1tmkILC4YWB0564qqO51BKisn+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-+uSJg/LdhuPzecJG34oeevbtghdX7Pqaop+MyNzs4tyqd3/1frmrwQimIJgcv/yo" 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

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

View file

@ -27,7 +27,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-research-map> custom element. -->
<script src="../../doxa-research-map.js" integrity="sha384-FvBITE71wOJQKfD92Hau8dqn8CvQ5A2mYid8aTjKvXSLxZR4OqjpJaPsbWjlCPF8" crossorigin="anonymous"></script>
<script src="../../doxa-research-map.js" integrity="sha384-hCsiL74WyyjIlg577zCcAhG7fD0iUzqdvsnZMGvpiS3ra3NpSEoDczoHMWK2eF6x" 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 <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js" integrity="sha384-aQtM9ysPsVk31JRUVi+94JaADl2FBlQLfivtL56FKsK42HVgkyECwJz+UsOROs47" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-FtEGLeSRNfBCdmK26IURIxCldSnfKphxRT74XgjftFGzNpvube+ov/EVBFi2gXjo" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js" integrity="sha384-aQtM9ysPsVk31JRUVi+94JaADl2FBlQLfivtL56FKsK42HVgkyECwJz+UsOROs47" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-FtEGLeSRNfBCdmK26IURIxCldSnfKphxRT74XgjftFGzNpvube+ov/EVBFi2gXjo" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../doxa-simple-map.js" integrity="sha384-aQtM9ysPsVk31JRUVi+94JaADl2FBlQLfivtL56FKsK42HVgkyECwJz+UsOROs47" crossorigin="anonymous"></script>
<script src="../doxa-simple-map.js" integrity="sha384-FtEGLeSRNfBCdmK26IURIxCldSnfKphxRT74XgjftFGzNpvube+ov/EVBFi2gXjo" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js" integrity="sha384-aQtM9ysPsVk31JRUVi+94JaADl2FBlQLfivtL56FKsK42HVgkyECwJz+UsOROs47" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-FtEGLeSRNfBCdmK26IURIxCldSnfKphxRT74XgjftFGzNpvube+ov/EVBFi2gXjo" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz" 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

@ -101,7 +101,7 @@
"bundle": "cities-internet",
"scriptUrl": "./cities-internet/cities-internet.js",
"output": "doxa-maps/cities-internet/cities-internet.js",
"integrity": "sha384-qK1s7qgMF7DaMDxJXnS8StZi7vTRWSgWe564NFF2HUO889PW8Sp+uHaTd2LjdI7S",
"integrity": "sha384-nzv5X2WdO5IqlVUqnmsDPDSq2uHRbJGyoDIEjHz915D7nAeS428kzYSeaRyAIEf2",
"elements": [
"cities-internet-map"
],
@ -117,7 +117,7 @@
"scriptUrl": "./cities-internet/cities-internet.js",
"embed": {
"iframe": "<iframe src=\"./cities-internet/connectivity-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=\"./cities-internet/cities-internet.js\" integrity=\"sha384-qK1s7qgMF7DaMDxJXnS8StZi7vTRWSgWe564NFF2HUO889PW8Sp+uHaTd2LjdI7S\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-nzv5X2WdO5IqlVUqnmsDPDSq2uHRbJGyoDIEjHz915D7nAeS428kzYSeaRyAIEf2\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
}
},
{
@ -131,7 +131,7 @@
"scriptUrl": "./cities-internet/cities-internet.js",
"embed": {
"iframe": "<iframe src=\"./cities-internet/connectivity-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=\"./cities-internet/cities-internet.js\" integrity=\"sha384-qK1s7qgMF7DaMDxJXnS8StZi7vTRWSgWe564NFF2HUO889PW8Sp+uHaTd2LjdI7S\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-nzv5X2WdO5IqlVUqnmsDPDSq2uHRbJGyoDIEjHz915D7nAeS428kzYSeaRyAIEf2\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
}
},
{
@ -145,7 +145,7 @@
"scriptUrl": "./cities-internet/cities-internet.js",
"embed": {
"iframe": "<iframe src=\"./cities-internet/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=\"./cities-internet/cities-internet.js\" integrity=\"sha384-qK1s7qgMF7DaMDxJXnS8StZi7vTRWSgWe564NFF2HUO889PW8Sp+uHaTd2LjdI7S\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-nzv5X2WdO5IqlVUqnmsDPDSq2uHRbJGyoDIEjHz915D7nAeS428kzYSeaRyAIEf2\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
}
}
]
@ -154,7 +154,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "doxa-maps/country-posters/country-posters.js",
"integrity": "sha384-5NIVhkaYneMmaHPBew8npZq0dQTh17eS/HtI9F1tmkILC4YWB0564qqO51BKisn+",
"integrity": "sha384-+uSJg/LdhuPzecJG34oeevbtghdX7Pqaop+MyNzs4tyqd3/1frmrwQimIJgcv/yo",
"elements": [
"country-posters-map"
],
@ -174,7 +174,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-5NIVhkaYneMmaHPBew8npZq0dQTh17eS/HtI9F1tmkILC4YWB0564qqO51BKisn+\" 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-+uSJg/LdhuPzecJG34oeevbtghdX7Pqaop+MyNzs4tyqd3/1frmrwQimIJgcv/yo\" 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>"
}
},
{
@ -188,7 +188,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-5NIVhkaYneMmaHPBew8npZq0dQTh17eS/HtI9F1tmkILC4YWB0564qqO51BKisn+\" 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-+uSJg/LdhuPzecJG34oeevbtghdX7Pqaop+MyNzs4tyqd3/1frmrwQimIJgcv/yo\" 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>"
}
},
{
@ -202,7 +202,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-5NIVhkaYneMmaHPBew8npZq0dQTh17eS/HtI9F1tmkILC4YWB0564qqO51BKisn+\" 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-+uSJg/LdhuPzecJG34oeevbtghdX7Pqaop+MyNzs4tyqd3/1frmrwQimIJgcv/yo\" 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>"
}
}
]
@ -349,7 +349,7 @@
"bundle": "doxa-research-map",
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"output": "doxa-maps/doxa-research-map/doxa-research-map.js",
"integrity": "sha384-FvBITE71wOJQKfD92Hau8dqn8CvQ5A2mYid8aTjKvXSLxZR4OqjpJaPsbWjlCPF8",
"integrity": "sha384-hCsiL74WyyjIlg577zCcAhG7fD0iUzqdvsnZMGvpiS3ra3NpSEoDczoHMWK2eF6x",
"elements": [
"doxa-research-map"
],
@ -365,7 +365,7 @@
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"embed": {
"iframe": "<iframe src=\"./doxa-research-map/research-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=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-FvBITE71wOJQKfD92Hau8dqn8CvQ5A2mYid8aTjKvXSLxZR4OqjpJaPsbWjlCPF8\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-hCsiL74WyyjIlg577zCcAhG7fD0iUzqdvsnZMGvpiS3ra3NpSEoDczoHMWK2eF6x\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
},
"instances": [
{
@ -391,7 +391,7 @@
"bundle": "doxa-simple-map",
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
"output": "doxa-maps/doxa-simple-map/doxa-simple-map.js",
"integrity": "sha384-aQtM9ysPsVk31JRUVi+94JaADl2FBlQLfivtL56FKsK42HVgkyECwJz+UsOROs47",
"integrity": "sha384-FtEGLeSRNfBCdmK26IURIxCldSnfKphxRT74XgjftFGzNpvube+ov/EVBFi2gXjo",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -408,7 +408,7 @@
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
"embed": {
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-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=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-aQtM9ysPsVk31JRUVi+94JaADl2FBlQLfivtL56FKsK42HVgkyECwJz+UsOROs47\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-FtEGLeSRNfBCdmK26IURIxCldSnfKphxRT74XgjftFGzNpvube+ov/EVBFi2gXjo\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-map>"
},
"instances": [
{
@ -591,7 +591,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ",
"integrity": "sha384-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz",
"elements": [
"gospel-resources-map"
],
@ -607,7 +607,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-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ\" 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-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz\" 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>"
}
},
{
@ -621,7 +621,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-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ\" 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-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz\" 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>"
}
},
{
@ -635,7 +635,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-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ\" 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-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz\" 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>"
}
},
{
@ -649,7 +649,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": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-dWZte5DwJYtc7xJvuh3VHD3zC9WQxOfcteCKTUgx6Oa3C0E2exWVijbT/asHxkjZ\" 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": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-r2AwOhX5crwXsnT2MsiQN8+nn2Ea/l2rYdsVL5BGTKR12W9+u7ggkHtDzv7neAPz\" 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>"
}
}
]
@ -658,7 +658,7 @@
"bundle": "my-upg-100-list",
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"output": "doxa-maps/my-upg-100-list/my-upg-100-list.js",
"integrity": "sha384-BoJ6i9UlcNIEw76OeLFJP2FJYItC1dRcOxbAm94MpsrtEG5f63MTLrnuUPnLX28r",
"integrity": "sha384-KF3XG9q4VdSvuLQEeK0P1gsKg1cpNOvkLYK5MAIMCUwSsO07z5dI4ffGuc4U6Y+p",
"elements": [
"my-upg-100-list-map"
],
@ -678,7 +678,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": {
"iframe": "<iframe src=\"./my-upg-100-list/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=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-BoJ6i9UlcNIEw76OeLFJP2FJYItC1dRcOxbAm94MpsrtEG5f63MTLrnuUPnLX28r\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-KF3XG9q4VdSvuLQEeK0P1gsKg1cpNOvkLYK5MAIMCUwSsO07z5dI4ffGuc4U6Y+p\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
}
},
{
@ -692,7 +692,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": {
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-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=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-BoJ6i9UlcNIEw76OeLFJP2FJYItC1dRcOxbAm94MpsrtEG5f63MTLrnuUPnLX28r\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-KF3XG9q4VdSvuLQEeK0P1gsKg1cpNOvkLYK5MAIMCUwSsO07z5dI4ffGuc4U6Y+p\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
}
},
{
@ -706,7 +706,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": {
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-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=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-BoJ6i9UlcNIEw76OeLFJP2FJYItC1dRcOxbAm94MpsrtEG5f63MTLrnuUPnLX28r\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-KF3XG9q4VdSvuLQEeK0P1gsKg1cpNOvkLYK5MAIMCUwSsO07z5dI4ffGuc4U6Y+p\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
}
}
]
@ -856,7 +856,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-4wHsJRC20pbwhDrZq3Rjop9CrHeO3WBd7qJW21zY/SNjBhJXHgmkCx0EMRs3Q7EI",
"integrity": "sha384-ytQtETEeE4XyDOiMQwksdiiRD6dD55yw+8DO3Xqk0fCfQkpjjNPvA0DTdtMMIFQo",
"elements": [
"regions-dashboard"
],
@ -876,7 +876,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-4wHsJRC20pbwhDrZq3Rjop9CrHeO3WBd7qJW21zY/SNjBhJXHgmkCx0EMRs3Q7EI\" 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-ytQtETEeE4XyDOiMQwksdiiRD6dD55yw+8DO3Xqk0fCfQkpjjNPvA0DTdtMMIFQo\" 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>"
}
},
{
@ -890,7 +890,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-4wHsJRC20pbwhDrZq3Rjop9CrHeO3WBd7qJW21zY/SNjBhJXHgmkCx0EMRs3Q7EI\" 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-ytQtETEeE4XyDOiMQwksdiiRD6dD55yw+8DO3Xqk0fCfQkpjjNPvA0DTdtMMIFQo\" 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>"
}
},
{
@ -904,7 +904,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-4wHsJRC20pbwhDrZq3Rjop9CrHeO3WBd7qJW21zY/SNjBhJXHgmkCx0EMRs3Q7EI\" 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-ytQtETEeE4XyDOiMQwksdiiRD6dD55yw+8DO3Xqk0fCfQkpjjNPvA0DTdtMMIFQo\" 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>"
}
}
]

File diff suppressed because one or more lines are too long

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js" integrity="sha384-BoJ6i9UlcNIEw76OeLFJP2FJYItC1dRcOxbAm94MpsrtEG5f63MTLrnuUPnLX28r" crossorigin="anonymous"></script>
<script src="../my-upg-100-list.js" integrity="sha384-KF3XG9q4VdSvuLQEeK0P1gsKg1cpNOvkLYK5MAIMCUwSsO07z5dI4ffGuc4U6Y+p" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js" integrity="sha384-BoJ6i9UlcNIEw76OeLFJP2FJYItC1dRcOxbAm94MpsrtEG5f63MTLrnuUPnLX28r" crossorigin="anonymous"></script>
<script src="../my-upg-100-list.js" integrity="sha384-KF3XG9q4VdSvuLQEeK0P1gsKg1cpNOvkLYK5MAIMCUwSsO07z5dI4ffGuc4U6Y+p" 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 <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js" integrity="sha384-BoJ6i9UlcNIEw76OeLFJP2FJYItC1dRcOxbAm94MpsrtEG5f63MTLrnuUPnLX28r" crossorigin="anonymous"></script>
<script src="../my-upg-100-list.js" integrity="sha384-KF3XG9q4VdSvuLQEeK0P1gsKg1cpNOvkLYK5MAIMCUwSsO07z5dI4ffGuc4U6Y+p" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-4wHsJRC20pbwhDrZq3Rjop9CrHeO3WBd7qJW21zY/SNjBhJXHgmkCx0EMRs3Q7EI" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-ytQtETEeE4XyDOiMQwksdiiRD6dD55yw+8DO3Xqk0fCfQkpjjNPvA0DTdtMMIFQo" 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-4wHsJRC20pbwhDrZq3Rjop9CrHeO3WBd7qJW21zY/SNjBhJXHgmkCx0EMRs3Q7EI" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-ytQtETEeE4XyDOiMQwksdiiRD6dD55yw+8DO3Xqk0fCfQkpjjNPvA0DTdtMMIFQo" 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-4wHsJRC20pbwhDrZq3Rjop9CrHeO3WBd7qJW21zY/SNjBhJXHgmkCx0EMRs3Q7EI" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-ytQtETEeE4XyDOiMQwksdiiRD6dD55yw+8DO3Xqk0fCfQkpjjNPvA0DTdtMMIFQo" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: