Update from source a1c8f3f6
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions

This commit is contained in:
Doxa Maps 2026-09-27 02:57:03 +00:00
parent 0646cce8ef
commit c08421f886
89 changed files with 3092 additions and 806 deletions

View file

@ -121,6 +121,8 @@ and a change here can break other maps.
`import … from '@map/composables/useCsvExport.js'`
- **useDashboardLayout** — useDashboardLayout.js — reusable drag-resize + persistence engine for the CMV dashboard grid.
`import … from '@map/composables/useDashboardLayout.js'`
- **useDashboardSearch** — useDashboardSearch.js — the ONE free-text search the whole dashboard shares.
`import … from '@map/composables/useDashboardSearch.js'`
- **useDocumentFont** — useDocumentFont.js — register a self-hosted @font-face at DOCUMENT level, once per page.
`import … from '@map/composables/useDocumentFont.js'`
- **useEdgeScrollAffordance** — useEdgeScrollAffordance — the gray "you can scroll past this" edge strips.

View file

@ -37,6 +37,14 @@ check('a rendered (tile-rounded) feature still finds its co-located groups', col
const twin = buildColocationIndex([...rows, { name: 'Koraga', latitude: 40, longitude: 40 }, { name: 'Other', latitude: 40, longitude: 40 }])
const renderedFar = { type: 'Feature', properties: { name: 'Koraga' }, geometry: { type: 'Point', coordinates: [40.0007, 39.9994] } }
check('a repeated name resolves to the nearest roster point', colocatedWith(twin, renderedFar).join() === 'Other', colocatedWith(twin, renderedFar))
// The rows a map DRAWS are normalized people groups (name + latitude/longitude, no geometry), and every
// map built on useMapData must offer them to its legends: the prayer map did not, so its legends read the
// raw API cache and neither the shared-point sentence nor the standing note appeared (rega, row 46 at 835ec1ac).
const drawn = [{ name: 'A', latitude: 12.85, longitude: 75.25 }, { name: 'B', latitude: '12.85', longitude: '75.25' }]
const clickedA = { type: 'Feature', properties: { name: 'A' }, geometry: { type: 'Point', coordinates: [75.2504, 12.8497] } }
check('normalized rows (no geometry) index and match a clicked pin', colocatedWith(buildColocationIndex(drawn), clickedA).join() === 'B', colocatedWith(buildColocationIndex(drawn), clickedA))
const umd = readFileSync(join(ROOT, 'library/composables/useMapData.js'), 'utf8').replace(/\/\*[\s\S]*?\*\//g, '').replace(/^\s*\/\/.*$/gm, '')
check('useMapData provides the rows it draws to the legends', /provide\(\s*'normalizedPeopleGroups'\s*,\s*normalizedPeopleGroups\s*\)/.test(umd), 'no provide in useMapData')
const { createServer } = await import('vite')
const { default: vue } = await import('@vitejs/plugin-vue')

View file

@ -0,0 +1,64 @@
#!/usr/bin/env node
/**
* check-i18n-stopped-scope.mjs — createAppI18n() must succeed while a STOPPED effect scope is current.
*
* WHY (P0, the agent's console, 2026-09-27): in Plugin Studio's gallery every tab after the first threw
* "SyntaxError: Unexpected error" from createI18n inside createAppI18n. vue-i18n's createGlobal() runs in
* scope.run() and throws UNEXPECTED_ERROR when that returns undefined; Vue 3.5 creates a new EffectScope
* INACTIVE when the currently active one is stopped; and a custom element's connectedCallback ->
* configureApp -> createAppI18n can run while the released tab's stopped scope is still current.
*
* The CONTROL comes first: a bare createI18n() inside the same stopped scope must THROW, or this harness
* does not reproduce the failure and a green result would prove nothing. Then createAppI18n() inside it
* must succeed, translate, and keep reacting to a locale change.
*/
import { join, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
let bad = 0
const check = (name, ok, got) => { if (!ok) bad++; console.log(` ${ok ? 'ok ' : 'FAIL'} ${name}${ok ? '' : ' — ' + got}`) }
const { createServer } = await import('vite')
const server = await createServer({ root: ROOT, configFile: false, logLevel: 'error', appType: 'custom',
server: { middlewareMode: true, hmr: false, ws: false, watch: null }, resolve: { alias: { '@map': join(ROOT, 'library') } } })
try {
globalThis.__INTLIFY_JIT_COMPILATION__ = true
const { effectScope } = await import('vue')
const { createI18n } = await import('vue-i18n')
const mod = await server.ssrLoadModule('/library/i18n/index.js')
// Set AFTER vue loads (runtime-dom probes `document` at import). These are the two page facts
// createAppI18n reads, the URL and <html lang>, as a plain English page would give them.
globalThis.window ??= { location: { search: '' } }
globalThis.document ??= { documentElement: { lang: 'en', dir: '' } }
// A scope that ran, was stopped, and is still the current one — the released tab's.
const stopped = effectScope()
stopped.run(() => {})
stopped.stop()
const inStopped = (fn) => { stopped.on(); try { return fn() } finally { stopped.off() } }
let controlThrew = false
try { inStopped(() => createI18n({ legacy: false, locale: 'en', messages: { en: { a: 'b' } } })) } catch { controlThrew = true }
check('CONTROL: a bare createI18n() inside a stopped scope throws (the harness reproduces the bug)', controlThrew, 'it did not throw')
let i18n = null, err = null
try { i18n = inStopped(() => mod.createAppI18n()) } catch (e) { err = e }
check('createAppI18n() succeeds inside a stopped scope', !!i18n && !err, err && String(err))
if (i18n) {
check('and it translates', i18n.global.t('buttons.close') !== 'buttons.close', i18n.global.t('buttons.close'))
i18n.global.locale.value = 'ar'
await new Promise((r) => setTimeout(r, 0))
check('and its locale watcher is live (the static reader follows a runtime switch)', mod.getRuntimeLocale() === 'ar', mod.getRuntimeLocale())
// The bundle entries that still provide appI18n themselves after app.use(i18n) must not make Vue warn.
const { createApp } = await import('vue')
const warns = []; const warn = console.warn; console.warn = (...a) => warns.push(a.join(' '))
try { const app = createApp({}); app.use(i18n); app.provide('appI18n', i18n) } finally { console.warn = warn }
check('a bundle providing appI18n again after app.use(i18n) raises no Vue warning', !warns.some((w) => /appI18n/.test(w)), warns.join(' | '))
}
} finally {
await server.close()
}
if (bad) { console.error(`\nI18N-STOPPED-SCOPE: FAIL — ${bad} assertion(s)`); process.exit(1) }
console.log('\nI18N-STOPPED-SCOPE: PASS — the app i18n is created live even while a stopped effect scope is current.')

View file

@ -101,7 +101,7 @@ ok(!/locales\/en\//.test(codeOnly(src)), 'CONTROL: and it imports NO per-area En
// the shared guard, and that it still carries ITS OWN fallback rather than silently inheriting the
// catalogue. The second matters more than it looks: routing these through tStatic would change what
// seven bare-host bundles render, and would start translating strings that are English today.
import { readFileSync as rf } from 'node:fs'
import { readFileSync as rf, readdirSync } from 'node:fs'
const SITES = [
// file, helper it must use, a fragment of the fallback it must still pass
['library/components/legends/ApproxPinNote.vue', 'useOptionalT', 'APPROX_FALLBACK[key]'],
@ -140,10 +140,13 @@ const SITES = [
['plugin-designs/cities-internet/data-tables.vue', 'useOptionalT', null],
// wave 3d — all-people-groups. Treated as UNOWNED (studio agreed), so the conservative reading wins:
// its inline EN map stays the fallback rather than switching to the catalogue, because nobody is
// available to decide that this bundle should start honouring the locale on a bare host. An unowned
// file is the wrong place to make a product decision by default.
// available to decide that this bundle should start honouring the locale on a bare host -- THEN
// dx-shepherd RULED the locale-honouring fallback everywhere (2026-09-27; the agent's goal (d), a
// bare-host embed with ?lang=ar must render Arabic, now the embed contract in COMMON.md). So it takes
// the catalogue default, its duplicate EN map is deleted, and section 9 keeps the ruling's PRECONDITION
// true rather than measured once.
// First site on the {t, te, locale} form: it needs locale for toLocaleString.
['plugin-designs/all-people-groups/all-people-groups.vue', 'useOptionalI18n', 'fallback: (full) =>'],
['plugin-designs/all-people-groups/all-people-groups.vue', 'useOptionalI18n', null],
// wave 3c — my-upg-100-list (owner: upg100-plugin). No namespace, since callers pass full keys.
// ⚠ THE THIRD COLUMN IS null, NOT 'humanizeKey(k)', and that is a DEPARTURE from 4c05e589, which
// kept the fallback. Correct as regions-plugin wrote it; wrong the moment dx-shepherd took the
@ -200,18 +203,20 @@ for (const [file, helper, fallbackFrag] of SITES) {
// catalogue; gospel's four used to resolve through enLookup's ENGLISH and were MOVED here by their
// owner's decision. Saying "as it always did" for those four would be a false statement inside a
// gate message, which is the one place a reader has no reason to doubt.
// ⚠ AND my-upg-100-list's TWO ARE ALSO "moved", added 2026-09-27. They used humanizeKey until
// dx-shepherd took the product call (UPGHK) to delete it, so "as it always did" would have been
// false for them the moment they were registered — the exact failure this branch already guards
// against for gospel's four. A register that is right about the assertion and wrong in the sentence
// it prints is still teaching the next reader something untrue.
const MOVED_TO_CATALOGUE = ['gospel-resources', 'my-upg-100-list']
const moved = MOVED_TO_CATALOGUE.some((m) => file.includes(m))
const who = file.includes('gospel-resources')
? "gospel-plugin moved it here from enLookup's English"
: 'upg100-plugin moved it here from humanizeKey, a title-cased key segment'
ok(!/fallback:/.test(code), moved
? `${short}: takes the locale-honouring CATALOGUE fallback (${who})`
// Which sites were MOVED to the catalogue by a decision, vs which always resolved there. Saying "as it
// always did" about a moved file is a false statement inside a gate message, the one place a reader has
// no reason to doubt. gospel-resources and cities-internet moved by their owners' decisions,
// my-upg-100-list by dx-shepherd's product call (UPGHK) deleting humanizeKey, and all-people-groups by
// the embed-contract ruling (locale-honouring everywhere, 2026-09-27).
const MOVED_BY = {
'gospel-resources': "gospel-plugin moved it here from enLookup's English",
'cities-internet': "exp-shepherd moved it here from enLookup's English",
'my-upg-100-list': 'upg100-plugin moved it here from humanizeKey, a title-cased key segment',
'all-people-groups': "dx-shepherd's embed-contract ruling moved it here from its inline English map",
}
const mover = Object.keys(MOVED_BY).find((d) => file.includes(d))
ok(!/fallback:/.test(code), mover
? `${short}: takes the locale-honouring CATALOGUE fallback (${MOVED_BY[mover]})`
: `${short}: takes the CATALOGUE fallback, as it always did`)
}
}
@ -248,6 +253,52 @@ for (const [file, helper, fallbackFrag] of SITES) {
'ENGLISH REMAINS THE LAST RESORT: an unknown locale falls back to en, as gospel required')
}
// ── 9. THE RULING'S PRECONDITION, kept true rather than measured once ───────────────────────────
// Dropping a site's own English fallback is only safe while the catalogue HAS every key that site asks
// for. Before the switch I measured it by hand: 11 keys, 11 locales, 0 gaps. A hand measurement protects
// the day it is taken; this protects every day after, which is the whole difference between a check and
// a note. If a key is added to the source and not catalogued, a bare host now renders the raw dotted
// key -- the exact failure upg100 described, and the reason they had advised keeping a fallback at all.
{
const src = rf(new URL('../plugin-designs/all-people-groups/all-people-groups.vue', import.meta.url), 'utf8')
// ★ RAW SOURCE, NOT codeOnly, AND THE ASYMMETRY IS THE REASON. For "does the catalogue hold every key
// this file asks for", over-including a key (one that only appears in a comment) makes the check
// STRICTER and can only cause a false red that a human resolves in seconds. UNDER-including one makes
// it claim completeness it does not have, which is the failure this section exists to prevent.
// It matters concretely: codeOnly loses `tr('pray')` in this file. That call lives inside a template
// literal whose `https://` was read as a line comment, because the scanner had already lost template
// state further up a 1000-line SFC. See the limitation note in strip-code.mjs. Six keys became seven
// the moment the census stopped stripping.
const code = src
const literal = [...new Set([...code.matchAll(/\btr\(\s*'([A-Za-z][\w.]*)'/g)].map((m) => m[1]))]
// ★ LITERALS ARE NOT ALL OF THEM, and a census that stopped here would have claimed completeness while
// blind to a third of the keys. This file also calls tr(cat.id) and tr(c.id) -- the category ids from
// the CATS array -- so four keys (doxa, frontier, unreached, reached) never appear as a literal
// argument. Extract those ids too, and assert BOTH that they were found and that the dynamic call
// sites still look the way this extraction assumes.
const catIds = [...new Set([...code.matchAll(/\{\s*id:\s*'([a-z]+)'\s*,\s*color:/g)].map((m) => m[1]))]
const dynamic = [...new Set([...code.matchAll(/\btr\(\s*([A-Za-z_$][\w.$]*)/g)].map((m) => m[1]))]
ok(dynamic.length === 0 || catIds.length > 0,
`the dynamic tr() arguments (${dynamic.join(', ') || 'none'}) are covered by the CATS ids (${catIds.join(', ') || 'NONE FOUND'})`)
ok(catIds.length === 4,
`found ${catIds.length} category ids -- if this changes, the dynamic keys this census covers have changed with it`)
const used = [...new Set([...literal, ...catIds])]
ok(used.length > literal.length,
`all-people-groups: ${used.length} keys verified = ${literal.length} literal + ${catIds.length} reached only through tr(cat.id)`)
const locales = readdirSync(new URL('../library/i18n/locales', import.meta.url))
const gaps = []
for (const k of used) for (const loc of locales) {
let v
try { v = JSON.parse(rf(new URL(`../library/i18n/locales/${loc}/allPeopleGroups.json`, import.meta.url), 'utf8'))[k] } catch (_) { v = undefined }
if (v === undefined || v === '') gaps.push(`${loc}:${k}`)
}
ok(gaps.length === 0,
`every key it asks for exists in all ${locales.length} locales${gaps.length ? ` -- MISSING ${gaps.slice(0, 6).join(', ')}` : ''}`)
let invented
try { invented = JSON.parse(rf(new URL('../library/i18n/locales/en/allPeopleGroups.json', import.meta.url), 'utf8')).definitelyNotACataloguedKey } catch (_) {}
ok(invented === undefined, 'NEG CONTROL: an invented key is absent, so the lookup above can actually fail')
}
// ── 8. the fallback option and te/locale, behaviourally ────────────────────────────────────────
{
const { useOptionalT, useOptionalI18n } = make(tStatic, throwingI18n)

View file

@ -54,7 +54,7 @@ const BUNDLES = [
'dashboard-plus-grid', 'research-dashboard', 'research-map-plus-grid', 'doxa-research-map', 'people-groups-grid',
'regions-dashboard', 'my-upg-100-list', 'doxa-simple-map', 'cities-internet', 'gospel-resources',
'all-people-groups', 'country-posters', 'doxa-vision-card', 'pplr-data-maps', 'prayer-walk-planner',
'upg-neighbor', 'wall-of-people-groups', 'key-cities',
'upg-neighbor', 'wall-of-people-groups', 'key-cities', 'gospel-internet',
]
const ALLOW = {
'prayer-walk-planner:ENG-PIN': 'keyless by design: always MapLibre, needs no token (index.js header)',

View file

@ -526,7 +526,9 @@ const showPullTab = computed(() => uiStore.showPullTab)
const legendMode = computed(() => uiStore.legendMode)
const selectedPeopleGroup = computed(() => uiStore.selectedPeopleGroup)
// APPROXPIN: the other groups on the selected pin's coordinate, from the roster THIS map draws.
const drawnPeopleGroups = inject('normalizedPeopleGroups', null)
const colocation = computed(() => {
if (drawnPeopleGroups?.value?.length) return buildColocationIndex(drawnPeopleGroups.value)
const rows = []
for (const id in (dataStore?.sources || {})) { const src = dataStore.sources[id]; if (src?.features?.length) rows.push(...src.features) }
return buildColocationIndex(rows)

View file

@ -24,6 +24,7 @@ import { useShadowStyles } from '../../composables/useShadowStyles.js'
import { useInstance } from '../../composables/usePplrInstance.js'
import LegendProgressBar from './LegendProgressBar.vue'
import ApproxPinNote from './ApproxPinNote.vue'
import { pointOf, nameOf } from '../../utils/colocation.js'
// .stl-export-backdrop is an invisible click-catcher ("captures the next click"), so when it is
// clipped nothing LOOKS wrong — but inside the cap-5 shell contain:layout on .vtl-content limits
// it to the content pane (measured 1024x793 @ (256,107) at 1280x900), so a click on the rail or
@ -126,14 +127,15 @@ const progressData = computed(() => props.progress ?? unref(injectedProgress) ??
const displayTitle = computed(() => progressData.value ? t('legend.progress.title') : props.title)
const stlIsDark = computed(() => (instance?.theme.value || 'dark') === 'dark')
const pinDataStore = inject('dataStore', null)
const drawnPeopleGroups = inject('normalizedPeopleGroups', null)
// A people-group pin is a row (or GeoJSON feature) with a name AND a position. The rows the map draws are
// asked first; the dataStore cache is the fallback (it can hold raw API rows or GeoJSON features).
const isPin = (r) => !!(r && nameOf(r) && pointOf(r))
const showPinNote = computed(() => {
if (props.pinNote !== null) return props.pinNote
if (drawnPeopleGroups?.value?.length) return drawnPeopleGroups.value.slice(0, 20).some(isPin)
const sources = pinDataStore?.sources || {}
for (const id in sources) {
const f = sources[id]?.features?.[0]
const p = f?.properties || {}
if (f?.geometry?.type === 'Point' && (p.name || p.peopleName || p.PeopNameInCountry)) return true
}
for (const id in sources) if ((sources[id]?.features || []).slice(0, 20).some(isPin)) return true
return false
})
// A click on a bar span selects the matching legend row through the SAME handler

View file

@ -90,6 +90,10 @@ import { ref, unref, onMounted, onBeforeUnmount } from 'vue'
// existing layout survives the change; nothing writes to it. Delete it once no reader can plausibly
// still be carrying one.
const LEGACY_SHARED_KEY = 'rd-dashboard-layout'
// The default key, named once so the legacy read-through can ask "am I the default?" instead of
// re-typing the literal — a fallback comparing against a copy of its own default is a fallback that
// silently stops matching the day someone bumps the version suffix.
const DEFAULT_STORAGE_KEY = 'rd-dashboard-layout-v6'
// Tree rail WIDER than the charts rail — see the rail-balance note in research-dashboard.vue.
// These must stay in lockstep with the CSS `:host` defaults, since reset() snaps back to them.
@ -170,7 +174,7 @@ export function useDashboardLayout(options = {}) {
// in the commit that first trips over it.
// The caller passes its own id (the shell uses config.id). The default keeps a caller that
// passes nothing working, and still namespaces it away from any caller that does.
storageKey = 'rd-dashboard-layout-v6',
storageKey = DEFAULT_STORAGE_KEY,
} = options
const defaults = { ...DEFAULTS, ...(options.defaults || {}) }
@ -271,7 +275,14 @@ export function useDashboardLayout(options = {}) {
// every reader's saved layout. Read-only and never written back: the new key is written on
// the next drag-end, and the old value is simply left where it is rather than migrated and
// deleted — a migration that also deletes is one that cannot be rolled back.
const raw = localStorage.getItem(storageKey) || localStorage.getItem(LEGACY_SHARED_KEY)
// ★ ONLY FOR THE DEFAULT KEY (go-int, 2026-09-27) — and this was my own regression from kit
// landing 2. I added the read-through so namespacing would not discard a reader's saved
// layout, and applied it unconditionally: so a caller that passes its OWN storageKey, which
// is the entire point of namespacing, still inherited Big Picture's rail widths on first
// load. The migration meant to protect one dashboard's layout was handing it to every other
// dashboard. A fallback that ignores the key it is falling back FROM is not a fallback.
const legacyOk = storageKey === DEFAULT_STORAGE_KEY
const raw = localStorage.getItem(storageKey) || (legacyOk ? localStorage.getItem(LEGACY_SHARED_KEY) : null)
if (!raw) return false
const s = JSON.parse(raw)
if (Number.isFinite(s.facetW)) facetW.value = clamp(s.facetW, clamps.facetW)
@ -333,6 +344,18 @@ export function useDashboardLayout(options = {}) {
const startX = e.clientX
const startFacet = facetW.value
const startRail = railW.value
// ★ THE X DELTA HAS A READING DIRECTION (go-int, 2026-09-27). Under dir=rtl the grid mirrors —
// the facet rail sits on the RIGHT — so dragging its handle toward the map INCREASES clientX
// where in LTR it decreases it. The maths below was written once, in LTR, and the result in
// Arabic is that dragging the facet handle shrinks the CHARTS rail: both handles fight, and
// neither does what the cursor says. This reaches Big Picture in ar today, not only go-int.
// Read per drag rather than cached: a host can flip dir between gestures (our own composites
// set it on the custom-element host from the runtime locale), and a cached sign would be wrong
// for the rest of the session.
const rtl = (() => {
try { return getComputedStyle(unref(shellRef)).direction === 'rtl' } catch (_) { return false }
})()
const xSign = rtl ? -1 : 1
const handleEl = e.currentTarget
// ── PAGE-SCROLL AXIS SWITCH (BUG-TABLE-RESIZE-HANDLE-DOES-NOTHING) ──────────────────────
// In page-scroll mode (research-dashboard.vue's pageScroll / dashboard-plus-grid.vue) the
@ -405,11 +428,11 @@ export function useDashboardLayout(options = {}) {
pending = null
if (axis === 'facet') {
// left facet edge → dragging right widens the facet column
facetW.value = Math.round(clamp(startFacet + (ev.clientX - startX), clamps.facetW))
facetW.value = Math.round(clamp(startFacet + xSign * (ev.clientX - startX), clamps.facetW))
customized.value = true
} else if (axis === 'rail') {
// right rail's LEFT edge → dragging left widens the rail column
railW.value = Math.round(clamp(startRail - (ev.clientX - startX), clamps.railW))
railW.value = Math.round(clamp(startRail - xSign * (ev.clientX - startX), clamps.railW))
customized.value = true
} else if (isTablePageScroll) {
// page-scroll: the handle sits pinned to the MAP's own bottom edge (.rd-rz-table is
@ -519,7 +542,16 @@ export function useDashboardLayout(options = {}) {
const K = e.key
let dir = 0
if (axis === 'table' || axis === 'shell') { if (K === 'ArrowUp') dir = -1; else if (K === 'ArrowDown') dir = 1 }
else { if (K === 'ArrowLeft') dir = -1; else if (K === 'ArrowRight') dir = 1 }
else {
// ★ AND THE ARROWS FOLLOW THE SAME SIGN (go-int). The pointer path now mirrors under rtl; if
// the keyboard did not, the two input methods would disagree about which way widens — and a
// keyboard user in Arabic would find the arrows inverted relative to the drag they just
// watched. aria-valuenow reports the same ref for both, so a disagreement here would also
// make the announced value move the wrong way.
let kSign = 1
try { if (getComputedStyle(unref(shellRef)).direction === 'rtl') kSign = -1 } catch (_) { /* no element */ }
if (K === 'ArrowLeft') dir = -1 * kSign; else if (K === 'ArrowRight') dir = 1 * kSign
}
if (dir) { e.preventDefault(); stepResize(axis, dir); return }
if (K === 'Home' || K === 'End') {
e.preventDefault()

View file

@ -0,0 +1,100 @@
/**
* useDashboardSearch.js — the ONE free-text search the whole dashboard shares.
*
* ★ EXTRACTED FROM useDashboardShell (dashboard-kit landing 4a) BECAUSE EIGHT THINGS IMPORT IT.
* These three functions were exported from the shell, and every panel reached into the shell to get
* them: the table, the map panel, the charts rail, the facet rail, the research filters, the top bar,
* the profile and the config. That is not a shell concern; it is a module in its own right that
* happened to live inside one.
*
* It also unblocks the facet rail. Landing 4 was supposed to move the rail, and the rail imports
* these helpers — so moving the rail first would have meant a library component importing a plugin
* composable, which check:no-cross-plugin-imports rightly refuses. The dependency had to come first;
* SPEC-DASHBOARD-KIT section 8 did not notice that, and now says so.
*
* Nothing here is domain-specific: the accessors come from `config.facets`, `config.columns` and
* `config.searchKeys`, and the matching comes from the shared @map/components/search/fuzzy.js. A
* dashboard with different facets gets its own search for free.
*
* Bodies are verbatim from the shell — this is a move, not a rewrite.
*/
import { exactMatches, fuzzyMatches, resolveFuzzyValues } from '@map/components/search/fuzzy.js'
// tiny lodash-free mapValues: { k: v } -> { k: fn(v, k) }
const mapValues = (obj, fn) =>
Object.fromEntries(Object.entries(obj || {}).map(([k, v]) => [k, fn(v, k)]))
/**
* Build the free-text search accessors for a dashboard config (header-1 search bar).
* config.searchKeys (facet keys) → those facet accessors; else the string columns' accessors.
* ONE declaration reused by the shell (KPIs) AND every panel (table/map/charts/facets) so the
* searchable text can never drift from what the panels show, and the substring match is not
* copy-pasted into each panel (kills the very duplication DOXA-LIB-2 removed).
*/
export function buildSearchAccessors(config) {
const FACET_ACC = mapValues(config.facets, (f) => f.get)
const COL_ACC = Object.fromEntries((config.columns || []).map((c) => [c.key, c.get]))
const keys = Array.isArray(config.searchKeys) ? config.searchKeys : null
if (keys) return keys.map((k) => FACET_ACC[k] || COL_ACC[k]).filter((fn) => typeof fn === 'function')
return (config.columns || []).filter((c) => c.type !== 'num' && typeof c.get === 'function').map((c) => c.get)
}
/**
* Reusable predicate: does `row` match the bus's current free-text search term?
* Returns true when there is no term (identical to pre-search behaviour). `accessors` is the
* array from buildSearchAccessors(config). Case-insensitive substring over each accessor's value.
*/
export function makeSearchMatcher(bus, accessors) {
// ★ FUZZY, NOT SUBSTRING (the agent 2026-09-23: "add an n to the end of a country name" must
// still find it -- check what DX-life's search bar bakes in). DX-life runs real Fuse.js with
// { threshold: 0.4, ignoreLocation: true, minMatchCharLength: 3 } (UupgsList.vue:288), so its
// search tolerates typos. This matcher was a plain .includes() -- the one search surface that
// silently lost that behaviour in the migration (measured: 'Bhutan' 13 rows, 'Bhutann' 0).
// It now delegates to the shared fuzzyMatches() in @map fuzzy.js -- the same matcher the
// grid's Fuse uses -- with the same DX-life options, so every search surface agrees.
// Row-level predicates for the TIERED contract (see fuzzy.js exactMatches): the caller
// (filterRowsBySearch below) runs the exact tier over the whole row set first and falls back
// to the fuzzy tier only when exact yields nothing, so an exact term agrees with the facet.
const test = (row, pred) => {
const needle = (bus?.searchTerm?.value || '').trim()
if (!needle) return true
for (const acc of accessors) {
const v = acc(row)
if (v != null && pred(String(v), needle, { threshold: 0.4, minMatchCharLength: 3 })) return true
}
return false
}
const matcher = (row) => test(row, fuzzyMatches)
matcher.exact = (row) => test(row, exactMatches)
matcher.active = () => !!(bus?.searchTerm?.value || '').trim()
matcher.term = () => (bus?.searchTerm?.value || '').trim()
matcher.accessors = accessors
return matcher
}
/**
* Apply the TIERED search to a row set:
* 1. exact substring -- an exact term returns exactly the rows the equivalent facet selects.
* 2. facet-VALUE resolution (the agent: "Austrian or Canadian... a selection of that country --
* the table under the map shows the result for that country"): the term is resolved by
* whole-value edit distance against each accessor's DISTINCT values, and the rows returned
* are those carrying a resolved value -- byte-identical to picking it as a filter.
* 3. the generic windowed fuzzy rescue, only when nothing resolves.
*/
export function filterRowsBySearch(rows, matcher) {
if (!matcher.active()) return rows
const exact = rows.filter(matcher.exact)
if (exact.length) return exact
const term = matcher.term()
// ONE pool across every accessor's distinct values, so the GLOBAL best match wins (see
// resolveFuzzyValues: ties at the minimal distance stay, everything farther drops --
// 'Canadian' resolves to Canada, not to 47 rows of <=3-edit neighbours across facets).
const distinct = new Set()
for (const acc of matcher.accessors) for (const r of rows) { const v = acc(r); if (v != null && v !== '') distinct.add(String(v)) }
const winners = new Set(resolveFuzzyValues(term, [...distinct], { threshold: 0.4 }))
if (winners.size) {
const resolved = rows.filter((r) => matcher.accessors.some((acc) => { const v = acc(r); return v != null && winners.has(String(v)) }))
if (resolved.length) return resolved
}
return rows.filter(matcher)
}

View file

@ -3,7 +3,7 @@
// Vue 3 Composition API - ES Module with NPM packages
// Import Vue functions from NPM package
import { ref, computed } from 'vue';
import { ref, computed, provide, getCurrentInstance } from 'vue';
import { applyLocalPrayer } from './usePrayedLocally.js';
// Static lookup: language label (e.g. "Telugu") → language family ("Dravidian").
// Used to derive `languageFamily` for pray-tools rows where the upstream returns
@ -136,6 +136,12 @@ export function useMapData(options) {
// Data arrays (will be marked as raw for performance)
const peopleGroups = ref([]);
const normalizedPeopleGroups = ref([]);
// THE ROWS THE MAP DRAWS, offered to the legends below it. research-map and countries-map provided
// this themselves; the prayer map did not, so its legends fell back to the raw API cache, whose field
// names the pin-note co-location index cannot read, and the shared-point sentence and the standing
// pin note never showed there (rega, row 46). Providing it here covers every map built on useMapData;
// a component that also provides it passes this same ref.
if (getCurrentInstance()) provide('normalizedPeopleGroups', normalizedPeopleGroups);
const regionsData = ref(null);
const languageFamiliesData = ref([]);
const doxaRegionsData = ref([]);

View file

@ -19,6 +19,9 @@
* NARROWS scope — panels render excluded context by FADING, never removing.
* - selectionSet : explicit set of slugs (table checkbox / map lasso / chart pick).
* MARKS individuals — panels render with RING/OUTLINE.
* - hoverKey : the ONE record the pointer is over, or null (D3).
* POINTS at one — panels may fade or outline; they may not fly, select or
* filter. Hover is not a commitment, so nothing irreversible may follow it.
*
* Export priority (later phases): selectionSet (if non-empty) > filterSet result > full dataset.
* Every panel is both publisher and subscriber. All client-side over one in-memory row store
@ -99,6 +102,24 @@ export function createSelectionBus() {
// facet filterSet: it applies a substring/label match across the config's `searchKeys` in
// useDashboardShell.filteredRows. Empty string = no text predicate (identical to before).
const searchTerm = ref('')
// ── hoverKey (SPEC-DASHBOARD-KIT D3) ────────────────────────────────────────────────────────
// THE THIRD COORDINATED CHANNEL, and the only one this bus was missing. filterSet narrows scope
// and selectionSet marks individuals; HOVER points at one record without committing to it, so a
// reader can sweep a table and watch the map answer. kepler.gl treats hover as a configured
// interaction alongside filters for the same reason.
//
// ★ IT IS A PLAIN ref AND NOT A SET, AND THAT IS THE WHOLE DESIGN. Hover fires on every
// mousemove across a 2,107-row table. selectionSet had to be a plain Set with a version counter
// precisely because a reactive collection fires per element (see the performance contract
// above); a single ref has none of that problem — one dependency, one write, no iteration. Any
// future "hover several things" must be argued for against that, not assumed.
//
// ★ HOVER IS NOT SELECTION, AND MUST NEVER BECOME IT. It does not enter selectionSet, does not
// bump selectionVersion, and therefore does not move the camera: useSelectionCamera watches the
// version, and a camera that chased the pointer across a table would be the resize-strobe bug
// wearing a new hat, on the agent who is photosensitive. A panel may fade or outline on hover; it
// may not fly, select or filter.
const hoverKey = ref(null)
const subs = new Map() // event -> Set<cb>
function on(event, cb) {
@ -156,6 +177,18 @@ export function createSelectionBus() {
}
// ── free-text search (header-1) ──
/** Point at one record, or `null` for nothing. The value is whatever the profile's primary key
* is (`config.data.primaryKey`, a slug here) so every panel is pointing at the same thing.
* Deliberately NOT debounced in the bus: what a hover costs depends on what the panel does with
* it, so the panel that repaints owns that decision. The bus's job is to be cheap enough that
* it never needs one. */
function setHover(key) {
const next = key === undefined ? null : key
if (hoverKey.value === next) return // a no-op must not wake every panel watching the ref
hoverKey.value = next
emit('hover', next)
}
function setSearch(term) {
searchTerm.value = term == null ? '' : String(term)
emit('search', searchTerm.value)
@ -220,8 +253,8 @@ export function createSelectionBus() {
}
return {
filterSet, selectionSet, selectionVersion, searchTerm, on, emit,
setFilter, clearFilters, setSearch, configureHierarchy,
filterSet, selectionSet, selectionVersion, searchTerm, hoverKey, on, emit,
setFilter, clearFilters, setSearch, setHover, configureHierarchy,
toggleSelect, clearSelection, selectMany, deselectMany, setSelection,
toggleFilterValue, facetMatches, isFilterActive, rowMatchesFilters,
}

View file

@ -45,7 +45,7 @@
* See documentation/feedback.md → Section A for the design rationale.
*/
import { watch } from 'vue'
import { watch, effectScope } from 'vue'
import { createI18n } from 'vue-i18n'
// Eager glob — all locale subfolders inlined at build time
@ -154,7 +154,14 @@ export function createAppI18n() {
document.documentElement.dir = 'rtl'
}
} catch { /* no document (SSR/tests) — nothing to reflect */ }
const i18n = createI18n({
// ★ A DETACHED EFFECT SCOPE (P0, the agent's console, 2026-09-27). vue-i18n's createGlobal() runs
// inside scope.run() and throws UNEXPECTED_ERROR ("SyntaxError: Unexpected error") when that returns
// undefined; Vue 3.5 creates a new EffectScope INACTIVE when the currently active scope is STOPPED.
// A custom element's connectedCallback -> configureApp -> here can run while a released tab's stopped
// scope is still current (Plugin Studio's gallery, every tab after the first). effectScope(true) never
// inherits the ambient scope, so this instance and its locale watcher are always created live.
const i18nScope = effectScope(true)
const i18n = i18nScope.run(() => createI18n({
legacy: false,
globalInjection: true,
locale,
@ -162,7 +169,7 @@ export function createAppI18n() {
messages,
missingWarn: false,
fallbackWarn: false,
})
}))
// ★ INSTALLING i18n ALSO PROVIDES IT, so a bundle CANNOT forget. This is the durable half of a
// bug that is invisible by construction.
@ -195,12 +202,17 @@ export function createAppI18n() {
// Watching the instance's own locale ref is the single choke point: ProfileLoader, the SPA's
// picker and the studio's picker all move THIS ref, so none of them has to remember to also tell
// the static reader.
watch(i18n.global.locale, (l) => setRuntimeLocale(l), { immediate: true })
i18nScope.run(() => watch(i18n.global.locale, (l) => setRuntimeLocale(l), { immediate: true }))
const install = i18n.install.bind(i18n)
i18n.install = (app, ...rest) => {
const out = install(app, ...rest)
app.provide('appI18n', i18n)
// Several bundle entries still call app.provide('appI18n', i18n) themselves after app.use(i18n). The
// value is the same instance, but Vue warns "App already provides property with key appI18n" on every
// mount. A second provide of THIS instance under that key is made a no-op; anything else passes through.
const provide = app.provide.bind(app)
app.provide = (key, value) => (key === 'appI18n' && value === i18n ? app : provide(key, value))
return out
}
return i18n

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "أقل من 25% متصلون",
"nodata": "لا توجد بيانات",
"partial": "25–59% متصلون",
"yes": "60% أو أكثر متصلون"
},
"charts": {
"accessByBand": "الوصول بلغتهم، حسب استخدام الإنترنت في البلد",
"aria": "رسوم بيانية",
"bandCaveat": "استخدام الإنترنت رقم البلد (البنك الدولي)، وليس رقم المجموعة أبدًا.",
"groups": "المجموعات",
"groupsN": "{n} مجموعة",
"measure": "العدّ",
"messagingTop": "تطبيق المراسلة الأول، حسب البلدان ضمن النطاق",
"notMeasured": "غير مقيس",
"people": "الأشخاص",
"peopleN": "{n} شخص",
"socialTop": "منصة التواصل الأولى، حسب البلدان ضمن النطاق",
"unitCountries": "بلدان",
"unitGroups": "مجموعة عرقية",
"unitPeople": "شخص",
"zeroByBand": "لا شيء بلغتهم، حسب استخدام الإنترنت في البلد",
"zeroCaveat": "لكل واحدة منها مدخل: لغة جسر، أو لغة مرشّحة، أو جسر بلغة الإشارة."
},
"col": {
"access": "بلغتهم",
"band": "فئة الإنترنت",
"bridgeTraining": "تدريب (لغة الجسر)",
"country": "البلد",
"deafPublisher": "ناشر بلغة الإشارة",
"internet": "البلد متصل",
"internetYear": "السنة",
"language": "اللغة",
"messaging": "تطبيق المراسلة الأول (البلد، iOS)",
"mobile": "الهواتف المحمولة لكل 100",
"platform": "المنصة الأولى (البلد)",
"praying": "المصلّون",
"province": "الولاية / المقاطعة (تقريبية)",
"resources": "الموارد التي وُجدت",
"stateMen": "الولاية متصلة: الرجال",
"stateWomen": "الولاية متصلة: النساء",
"training": "تدريب (بلغتهم)",
"translatedBy": "ترجمة",
"wayIn": "المدخل"
},
"detail": {
"hear": "يشاهدون أو يسمعون ولا يقرؤون",
"none": "لم يُعثر على شيء",
"read": "يقرؤون",
"read_watch": "يقرؤون ويشاهدون",
"stories": "قصص فقط"
},
"drawer": {
"approx": "تقريبي",
"bridgeHas": "بلغة الجسر",
"conn": "الاتصال",
"copied": "تم نسخ الرابط",
"copyLink": "انسخ رابط هذه المجموعة",
"deafLink": "الكتاب المقدس بلغة الإشارة",
"foundNote": "وُجد في المصادر التي فُحصت.",
"messaging": "تطبيقات المراسلة (تنزيلات iOS)",
"mobileNote": "اشتراكات لكل 100 شخص ({year})؛ قد يملك الشخص الواحد عدة اشتراكات.",
"nfhsNote": "NFHS-5، 2019–21، الأعمار 15–49: رقم الولاية، لا رقم المجموعة.",
"noFeed": "هذا البلد غير موجود في موجز Apple: تطبيقات المراسلة فيه غير معروفة هنا، لا غائبة.",
"noneNote": "لم يُعثر على شيء بلغتهم في المصادر التي فُحصت. وهذا ليس ادعاءً بأنه لا يوجد شيء.",
"own": "بلغتهم",
"people": "{n} شخص",
"platformNote": "حصة الزيارات القادمة من منصات التواصل الاجتماعي المرصودة في البلد (StatCounter). تطبيقات المراسلة مثل واتساب غير مقيسة.",
"platforms": "المنصات في البلد",
"praying": "{n} شخص يصلّون على DOXA",
"social": "منصات التواصل (إحالات الويب)",
"stateOnline": "{state}: استخدموا الإنترنت من قبل",
"way": "المدخل",
"wayIn": "المدخل",
"wayNote": "لغة مجاورة وليست توصية: هل تتكلمها المجموعة؟ سؤال يجيب عنه شخص على الأرض.",
"wbSource": "البنك الدولي، {year}: رقم البلد",
"womenMen": "النساء {w} · الرجال {m}"
},
"facet": {
"access": "الوصول بلغتهم",
"all": "عرض الكل ({n})",
"aria": "عوامل التصفية",
"band": "استخدام الإنترنت في البلد",
"bandNote": "رقم البلد (البنك الدولي)، وليس رقم المجموعة أبدًا.",
"country": "البلد",
"fewer": "عرض أقل",
"find": "ابحث…",
"findIn": "ابحث في {what}",
"language": "اللغة",
"messaging": "تطبيق المراسلة الأول (البلد)",
"messagingNote": "الأكثر تنزيلًا في متجر App Store الخاص بالبلد: iOS فقط، ترتيب تنزيلات لا استخدام.",
"province": "الهند والصين: الولاية أو المقاطعة",
"provinceNote": "تقريبي: بحسب مكان وجود الشعب، لا بحسب مدينة.",
"region": "المنطقة",
"religion": "الديانة",
"wayIn": "المدخل حين لا يوجد شيء بلغتهم"
},
"grid": {
"aria": "المجموعات العرقية ضمن النطاق",
"columns": "الأعمدة",
"count": "{n} من {total} مجموعة عرقية",
"empty": "لا توجد مجموعة عرقية تطابق عوامل التصفية هذه.",
"exported": "تم تصدير {n} صف (نُسخت ونُزّلت).",
"selectRow": "اختيار {name}"
},
"headline": {
"a": "{zero} من {total} مجموعة عرقية لم يُعثر لها على شيء بلغتها؛",
"b": "{online} منها تعيش في بلدان يستخدم فيها 60% أو أكثر الإنترنت."
},
"kind": {
"audio": "صوت",
"film": "فيلم",
"scripture": "الكتاب المقدس",
"stories": "قصص",
"video": "فيديو"
},
"legend": {
"band": "استخدام الإنترنت في البلد (البنك الدولي)",
"hide": "إخفاء مفتاح الخريطة",
"modeMen": "الإنترنت: الرجال",
"modeWomen": "الإنترنت: النساء",
"modeZero": "لا شيء بلغتهم",
"nfhs": "الهند فقط: نسبة النساء أو الرجال بين 15 و49 عامًا الذين استخدموا الإنترنت من قبل، حسب الولاية. NFHS-5، 2019–21. لا يوجد مصدر موثّق على مستوى المقاطعات للصين.",
"pins": "بلغتهم",
"provinces": "الهند والصين حسب المقاطعة",
"show": "مفتاح الخريطة"
},
"level": {
"bridge": "لا شيء بلغتهم · جسر فقط",
"own": "شيء ما بلغتهم",
"zero": "لا شيء بلغتهم · لا مدخل بعد"
},
"listChip": "قائمة المجموعات العرقية التي اختارتها هذه الصفحة",
"loadError": "لم يتم تحميل بيانات اللوحة.",
"map": {
"aria": "خريطة المجموعات العرقية، مظلّلة بحسب نسبة استخدام الإنترنت في كل بلد"
},
"notice": {
"pin": "تشير النقطة إلى مكان وجود هذا الشعب في {country}، لا إلى مدينة.",
"pins": "تشير النقطة إلى مكان وجود الشعب في بلده، لا إلى مدينة. {n} مجموعة تشترك في نقطة مع مجموعة أخرى.",
"shares": "تشترك في نقطتها مع {n} مجموعة أخرى.",
"sources": "المصادر:",
"standing": "النقاط تقريبية (مكان وجود الشعب في بلده، لا مدينة). أرقام الإنترنت هي أرقام البلد أو الولاية الهندية، لا أرقام المجموعة أبدًا. «وُجد» تعني وُجد في المصادر التي فُحصت."
},
"panel": {
"charts": "رسوم بيانية",
"filters": "عوامل التصفية",
"grid": "المجموعات",
"map": "الخريطة"
},
"strength": {
"moderate": "متوسطة",
"strong": "قوية"
},
"title": "الوصول إلى الإنجيل عبر الإنترنت",
"view": {
"aria": "العرض",
"board": "اللوحة",
"platforms": "المنصات",
"province": "الهند والصين حسب المقاطعة",
"zero": "لا شيء بلغتهم"
},
"wayIn": {
"bridge": "لغة جسر",
"candidate": "لغة مرشّحة",
"candidateText": "{lang} (مرشّحة، {pct}% من البلد)",
"deaf": "جسر بلغة الإشارة",
"deafText": "{lang} (لغة الإشارة)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "Unter 25 % online",
"nodata": "Keine Daten",
"partial": "25–59 % online",
"yes": "60 % oder mehr online"
},
"charts": {
"accessByBand": "Zugang in eigener Sprache, nach Internetnutzung im Land",
"aria": "Diagramme",
"bandCaveat": "Die Internetnutzung ist die Zahl des Landes (Weltbank), nie die der Gruppe.",
"groups": "Gruppen",
"groupsN": "{n} Gruppen",
"measure": "Zählen",
"messagingTop": "Top-Messenger nach Land im Auswahlbereich",
"notMeasured": "Nicht gemessen",
"people": "Menschen",
"peopleN": "{n} Menschen",
"socialTop": "Top-Social-Plattform nach Land im Auswahlbereich",
"unitCountries": "Länder",
"unitGroups": "Volksgruppen",
"unitPeople": "Menschen",
"zeroByBand": "Nichts in ihrer eigenen Sprache, nach Internetnutzung im Land",
"zeroCaveat": "Jede dieser Gruppen hat einen Zugang: eine Brückensprache, eine Kandidatensprache oder eine Gebärdensprach-Brücke."
},
"col": {
"access": "In eigener Sprache",
"band": "Internet-Stufe",
"bridgeTraining": "Schulung (Brücke)",
"country": "Land",
"deafPublisher": "Gebärdensprach-Verlag",
"internet": "Land online",
"internetYear": "Jahr",
"language": "Sprache",
"messaging": "Top-Messenger (Land, iOS)",
"mobile": "Mobilfunk pro 100",
"platform": "Top-Plattform (Land)",
"praying": "Betende Menschen",
"province": "Bundesstaat / Provinz (ungefähr)",
"resources": "Gefundene Ressourcen",
"stateMen": "Bundesstaat online: Männer",
"stateWomen": "Bundesstaat online: Frauen",
"training": "Schulung (eigene Sprache)",
"translatedBy": "Übersetzt von",
"wayIn": "Zugang"
},
"detail": {
"hear": "Sehen oder hören, nicht lesen",
"none": "Nichts gefunden",
"read": "Lesen",
"read_watch": "Lesen und sehen",
"stories": "Nur Geschichten"
},
"drawer": {
"approx": "ungefähr",
"bridgeHas": "In der Brückensprache",
"conn": "Konnektivität",
"copied": "Link kopiert",
"copyLink": "Link zu dieser Gruppe kopieren",
"deafLink": "Bibel in Gebärdensprache",
"foundNote": "In den geprüften Quellen gefunden.",
"messaging": "Messenger (iOS-Downloads)",
"mobileNote": "Verträge pro 100 Menschen ({year}); eine Person kann mehrere haben.",
"nfhsNote": "NFHS-5, 2019–21, 15–49 Jahre: die Zahl des Bundesstaats, nicht der Gruppe.",
"noFeed": "Dieses Land ist nicht in Apples Feed: Seine Messenger sind hier unbekannt, nicht abwesend.",
"noneNote": "In den geprüften Quellen wurde nichts in ihrer eigenen Sprache gefunden. Das ist keine Behauptung, dass nichts existiert.",
"own": "In ihrer eigenen Sprache",
"people": "{n} Menschen",
"platformNote": "Anteil der Web-Verweise unter den erfassten sozialen Plattformen im Land (StatCounter). Messenger wie WhatsApp werden nicht gemessen.",
"platforms": "Plattformen im Land",
"praying": "{n} Menschen beten auf DOXA",
"social": "Soziale Plattformen (Web-Verweise)",
"stateOnline": "{state}: jemals das Internet genutzt",
"way": "Zugang",
"wayIn": "Zugang",
"wayNote": "Eine benachbarte Sprache, keine Empfehlung: Ob eine Gruppe sie spricht, kann nur jemand vor Ort beantworten.",
"wbSource": "Weltbank, {year}: die Zahl des Landes",
"womenMen": "Frauen {w} · Männer {m}"
},
"facet": {
"access": "Zugang in ihrer eigenen Sprache",
"all": "Alle {n} anzeigen",
"aria": "Filter",
"band": "Internetnutzung im Land",
"bandNote": "Die Zahl des Landes (Weltbank), nie die der Gruppe.",
"country": "Land",
"fewer": "Weniger anzeigen",
"find": "Suchen…",
"findIn": "In {what} suchen",
"language": "Sprache",
"messaging": "Top-Messenger (Land)",
"messagingNote": "Am meisten heruntergeladen im Apple App Store des Landes: nur iOS, ein Download-Rang, keine Nutzung.",
"province": "Indien und China: Bundesstaat oder Provinz",
"provinceNote": "Ungefähr: danach zugeordnet, wo ein Volk lebt, nicht nach einem Ort.",
"region": "Region",
"religion": "Religion",
"wayIn": "Zugang, wenn nichts in ihrer Sprache vorliegt"
},
"grid": {
"aria": "Volksgruppen im Auswahlbereich",
"columns": "Spalten",
"count": "{n} von {total} Volksgruppen",
"empty": "Keine Volksgruppe entspricht diesen Filtern.",
"exported": "{n} Zeilen exportiert (kopiert und heruntergeladen).",
"selectRow": "{name} auswählen"
},
"headline": {
"a": "{zero} von {total} Volksgruppen haben nichts in ihrer eigenen Sprache;",
"b": "{online} davon leben in Ländern, in denen 60 % oder mehr das Internet nutzen."
},
"kind": {
"audio": "Audio",
"film": "Film",
"scripture": "Bibel",
"stories": "Geschichten",
"video": "Video"
},
"legend": {
"band": "Internetnutzung im Land (Weltbank)",
"hide": "Legende ausblenden",
"modeMen": "Internet: Männer",
"modeWomen": "Internet: Frauen",
"modeZero": "Nichts in eigener Sprache",
"nfhs": "Nur Indien: Anteil der Frauen bzw. Männer von 15–49 Jahren, die jemals das Internet genutzt haben, nach Bundesstaat. NFHS-5, 2019–21. Für China gibt es keine geprüfte Quelle auf Provinzebene.",
"pins": "In ihrer eigenen Sprache",
"provinces": "Indien und China nach Provinz",
"show": "Legende"
},
"level": {
"bridge": "Nichts in eigener Sprache · nur Brücke",
"own": "Etwas in eigener Sprache",
"zero": "Nichts in eigener Sprache · noch kein Zugang"
},
"listChip": "Volksgruppenliste, von dieser Seite gewählt",
"loadError": "Die Daten der Übersicht wurden nicht geladen.",
"map": {
"aria": "Karte der Volksgruppen, schattiert danach, wie viele Menschen im Land das Internet nutzen"
},
"notice": {
"pin": "Der Punkt markiert, wo dieses Volk in {country} lebt, nicht einen Ort.",
"pins": "Ein Punkt markiert, wo ein Volk in seinem Land lebt, nicht einen Ort. {n} Gruppen teilen sich einen Punkt mit einer anderen Gruppe.",
"shares": "Er teilt seinen Punkt mit {n} anderen Gruppe(n).",
"sources": "Quellen:",
"standing": "Punkte sind ungefähr (wo ein Volk in seinem Land lebt, nicht ein Ort). Internetzahlen gelten für das Land oder den indischen Bundesstaat, nie für die Gruppe. „Gefunden“ heißt: in den geprüften Quellen gefunden."
},
"panel": {
"charts": "Diagramme",
"filters": "Filter",
"grid": "Gruppen",
"map": "Karte"
},
"strength": {
"moderate": "mittel",
"strong": "stark"
},
"title": "Zugang zum Evangelium über das Internet",
"view": {
"aria": "Ansicht",
"board": "Übersicht",
"platforms": "Plattformen",
"province": "Indien & China nach Provinz",
"zero": "Nichts in eigener Sprache"
},
"wayIn": {
"bridge": "Brückensprache",
"candidate": "Kandidatensprache",
"candidateText": "{lang} (Kandidat, {pct} % des Landes)",
"deaf": "Gebärdensprach-Brücke",
"deafText": "{lang} (Gebärdensprache)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "Under 25% online",
"nodata": "No data",
"partial": "25-59% online",
"yes": "60% or more online"
},
"charts": {
"accessByBand": "Own-language access, by country internet use",
"aria": "Charts",
"bandCaveat": "Internet use is the country's figure (World Bank), never the group's.",
"groups": "Groups",
"groupsN": "{n} groups",
"measure": "Count",
"messagingTop": "Top messaging app, by country in scope",
"notMeasured": "Not measured",
"people": "People",
"peopleN": "{n} people",
"socialTop": "Top social platform, by country in scope",
"unitCountries": "countries",
"unitGroups": "people groups",
"unitPeople": "people",
"zeroByBand": "Nothing in their own language, by country internet use",
"zeroCaveat": "Every one of these has a way in: a bridge language, a candidate or a Deaf bridge."
},
"col": {
"access": "In own language",
"band": "Internet band",
"bridgeTraining": "Training (bridge)",
"country": "Country",
"deafPublisher": "Sign-language publisher",
"internet": "Country online",
"internetYear": "Year",
"language": "Language",
"messaging": "Top messaging app (country, iOS)",
"mobile": "Mobile per 100",
"platform": "Top platform (country)",
"praying": "People praying",
"province": "State / province (approx.)",
"resources": "Resources found",
"stateMen": "State online: men",
"stateWomen": "State online: women",
"training": "Training (own language)",
"translatedBy": "Translated by",
"wayIn": "Way in"
},
"detail": {
"hear": "Watch or hear, cannot read",
"none": "Nothing found",
"read": "Read",
"read_watch": "Read and watch",
"stories": "Stories only"
},
"drawer": {
"approx": "approximate",
"bridgeHas": "In the bridge language",
"conn": "Connectivity",
"copied": "Link copied",
"copyLink": "Copy link to this group",
"deafLink": "Signed Scripture",
"foundNote": "Found in the sources checked.",
"messaging": "Messaging apps (iOS downloads)",
"mobileNote": "Subscriptions per 100 people ({year}); one person may hold several.",
"nfhsNote": "NFHS-5, 2019-21, ages 15-49: the state's figure, not the group's.",
"noFeed": "This country is not in Apple's feed: its messaging apps are unknown here, not absent.",
"noneNote": "Nothing found in their own language in the sources checked. That is not a claim that nothing exists.",
"own": "In their own language",
"people": "{n} people",
"platformNote": "Share of web referrals among tracked social platforms in the country (StatCounter). Messaging apps such as WhatsApp are not measured.",
"platforms": "Platforms in the country",
"praying": "{n} people praying on DOXA",
"social": "Social platforms (web referrals)",
"stateOnline": "{state}: ever used the internet",
"way": "Way in",
"wayIn": "Way in",
"wayNote": "A neighbouring language, not a recommendation: whether a group speaks it is a question for someone on the ground.",
"wbSource": "World Bank, {year}: the country's figure",
"womenMen": "women {w} · men {m}"
},
"facet": {
"access": "Access in their own language",
"all": "Show all {n}",
"aria": "Filters",
"band": "Country internet use",
"bandNote": "The country's figure (World Bank), never the group's.",
"country": "Country",
"fewer": "Show fewer",
"find": "Find…",
"findIn": "Find in {what}",
"language": "Language",
"messaging": "Top messaging app (country)",
"messagingNote": "Most downloaded in the country's Apple App Store: iOS only, a download rank, not use.",
"province": "India and China: state or province",
"provinceNote": "Approximate: placed from where a people is found, not a town.",
"region": "Region",
"religion": "Religion",
"wayIn": "Way in when nothing is in their language"
},
"grid": {
"aria": "People groups in scope",
"columns": "Columns",
"count": "{n} of {total} people groups",
"empty": "No people groups match these filters.",
"exported": "{n} rows exported (copied and downloaded).",
"selectRow": "Select {name}"
},
"headline": {
"a": "{zero} of {total} people groups have nothing found in their own language;",
"b": "{online} of them live in countries where 60% or more use the internet."
},
"kind": {
"audio": "Audio",
"film": "Film",
"scripture": "Scripture",
"stories": "Stories",
"video": "Video"
},
"legend": {
"band": "Country internet use (World Bank)",
"hide": "Hide the legend",
"modeMen": "Internet: men",
"modeWomen": "Internet: women",
"modeZero": "Nothing in own language",
"nfhs": "India only: share of women or men aged 15-49 who have ever used the internet, by state. NFHS-5, 2019-21. China has no verified provincial source.",
"pins": "In their own language",
"provinces": "India and China by province",
"show": "Legend"
},
"level": {
"bridge": "Nothing in own language · bridge only",
"own": "Something in own language",
"zero": "Nothing in own language · no way in yet"
},
"listChip": "People-group list, chosen by this page",
"loadError": "The board's data did not load.",
"map": {
"aria": "Map of people groups, shaded by how much of each country uses the internet"
},
"notice": {
"pin": "The dot marks where this people is found in {country}, not a town.",
"pins": "A dot marks where a people is found in its country, not a town. {n} groups share a point with another group.",
"shares": "It shares its point with {n} other group(s).",
"sources": "Sources:",
"standing": "Dots are approximate (where a people is found in its country, not a town). Internet figures are the country's, or the Indian state's, never the group's. \"Found\" means found in the sources checked."
},
"panel": {
"charts": "Charts",
"filters": "Filters",
"grid": "Groups",
"map": "Map"
},
"strength": {
"moderate": "moderate",
"strong": "strong"
},
"title": "Gospel access through the internet",
"view": {
"aria": "View",
"board": "Board",
"platforms": "Platforms",
"province": "India & China by province",
"zero": "Nothing in own language"
},
"wayIn": {
"bridge": "Bridge language",
"candidate": "Candidate language",
"candidateText": "{lang} (candidate, {pct}% of country)",
"deaf": "Deaf bridge",
"deafText": "{lang} (sign language)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "Menos del 25 % en línea",
"nodata": "Sin datos",
"partial": "25–59 % en línea",
"yes": "60 % o más en línea"
},
"charts": {
"accessByBand": "Acceso en su idioma, según el uso de internet del país",
"aria": "Gráficos",
"bandCaveat": "El uso de internet es la cifra del país (Banco Mundial), nunca la del grupo.",
"groups": "Grupos",
"groupsN": "{n} grupos",
"measure": "Contar",
"messagingTop": "App de mensajería principal, por país en la selección",
"notMeasured": "No medido",
"people": "Personas",
"peopleN": "{n} personas",
"socialTop": "Red social principal, por país en la selección",
"unitCountries": "países",
"unitGroups": "grupos étnicos",
"unitPeople": "personas",
"zeroByBand": "Nada en su propio idioma, según el uso de internet del país",
"zeroCaveat": "Cada uno tiene una vía de entrada: un idioma puente, un idioma candidato o un puente en lengua de señas."
},
"col": {
"access": "En su idioma",
"band": "Nivel de internet",
"bridgeTraining": "Capacitación (puente)",
"country": "País",
"deafPublisher": "Editorial en lengua de señas",
"internet": "País en línea",
"internetYear": "Año",
"language": "Idioma",
"messaging": "App de mensajería principal (país, iOS)",
"mobile": "Móviles por 100",
"platform": "Plataforma principal (país)",
"praying": "Personas orando",
"province": "Estado / provincia (aprox.)",
"resources": "Recursos encontrados",
"stateMen": "Estado en línea: hombres",
"stateWomen": "Estado en línea: mujeres",
"training": "Capacitación (idioma propio)",
"translatedBy": "Traducido por",
"wayIn": "Vía de entrada"
},
"detail": {
"hear": "Ver u oír, no leer",
"none": "Nada encontrado",
"read": "Leer",
"read_watch": "Leer y ver",
"stories": "Solo historias"
},
"drawer": {
"approx": "aproximado",
"bridgeHas": "En el idioma puente",
"conn": "Conectividad",
"copied": "Enlace copiado",
"copyLink": "Copiar enlace a este grupo",
"deafLink": "Escrituras en lengua de señas",
"foundNote": "Encontrado en las fuentes consultadas.",
"messaging": "Apps de mensajería (descargas iOS)",
"mobileNote": "Suscripciones por cada 100 personas ({year}); una persona puede tener varias.",
"nfhsNote": "NFHS-5, 2019–21, 15–49 años: la cifra del estado, no la del grupo.",
"noFeed": "Este país no está en el feed de Apple: sus apps de mensajería son desconocidas aquí, no ausentes.",
"noneNote": "No se encontró nada en su propio idioma en las fuentes consultadas. Eso no afirma que no exista nada.",
"own": "En su propio idioma",
"people": "{n} personas",
"platformNote": "Proporción de visitas web desde las redes sociales registradas en el país (StatCounter). No se miden apps de mensajería como WhatsApp.",
"platforms": "Plataformas en el país",
"praying": "{n} personas orando en DOXA",
"social": "Redes sociales (visitas web)",
"stateOnline": "{state}: ha usado internet alguna vez",
"way": "Vía de entrada",
"wayIn": "Vía de entrada",
"wayNote": "Un idioma vecino, no una recomendación: si un grupo lo habla es una pregunta para alguien sobre el terreno.",
"wbSource": "Banco Mundial, {year}: la cifra del país",
"womenMen": "mujeres {w} · hombres {m}"
},
"facet": {
"access": "Acceso en su propio idioma",
"all": "Mostrar los {n}",
"aria": "Filtros",
"band": "Uso de internet del país",
"bandNote": "La cifra del país (Banco Mundial), nunca la del grupo.",
"country": "País",
"fewer": "Mostrar menos",
"find": "Buscar…",
"findIn": "Buscar en {what}",
"language": "Idioma",
"messaging": "App de mensajería principal (país)",
"messagingNote": "La más descargada en la App Store de Apple del país: solo iOS, un ranking de descargas, no de uso.",
"province": "India y China: estado o provincia",
"provinceNote": "Aproximado: ubicado según dónde vive un pueblo, no una ciudad.",
"region": "Región",
"religion": "Religión",
"wayIn": "Vía de entrada cuando no hay nada en su idioma"
},
"grid": {
"aria": "Grupos étnicos en la selección",
"columns": "Columnas",
"count": "{n} de {total} grupos étnicos",
"empty": "Ningún grupo étnico coincide con estos filtros.",
"exported": "{n} filas exportadas (copiadas y descargadas).",
"selectRow": "Seleccionar {name}"
},
"headline": {
"a": "{zero} de {total} grupos étnicos no tienen nada en su propio idioma;",
"b": "{online} de ellos viven en países donde el 60 % o más usa internet."
},
"kind": {
"audio": "Audio",
"film": "Película",
"scripture": "Escrituras",
"stories": "Historias",
"video": "Video"
},
"legend": {
"band": "Uso de internet del país (Banco Mundial)",
"hide": "Ocultar la leyenda",
"modeMen": "Internet: hombres",
"modeWomen": "Internet: mujeres",
"modeZero": "Nada en su idioma",
"nfhs": "Solo India: proporción de mujeres u hombres de 15 a 49 años que alguna vez usaron internet, por estado. NFHS-5, 2019–21. China no tiene una fuente provincial verificada.",
"pins": "En su propio idioma",
"provinces": "India y China por provincia",
"show": "Leyenda"
},
"level": {
"bridge": "Nada en su idioma · solo puente",
"own": "Algo en su idioma",
"zero": "Nada en su idioma · aún sin vía de entrada"
},
"listChip": "Lista de grupos étnicos elegida por esta página",
"loadError": "No se cargaron los datos del tablero.",
"map": {
"aria": "Mapa de grupos étnicos, sombreado según cuánto usa internet cada país"
},
"notice": {
"pin": "El punto marca dónde vive este pueblo en {country}, no una ciudad.",
"pins": "Un punto marca dónde vive un pueblo en su país, no una ciudad. {n} grupos comparten un punto con otro grupo.",
"shares": "Comparte su punto con {n} grupo(s) más.",
"sources": "Fuentes:",
"standing": "Los puntos son aproximados (dónde vive un pueblo en su país, no una ciudad). Las cifras de internet son del país o del estado indio, nunca del grupo. «Encontrado» significa encontrado en las fuentes consultadas."
},
"panel": {
"charts": "Gráficos",
"filters": "Filtros",
"grid": "Grupos",
"map": "Mapa"
},
"strength": {
"moderate": "moderada",
"strong": "fuerte"
},
"title": "Acceso al evangelio a través de internet",
"view": {
"aria": "Vista",
"board": "Tablero",
"platforms": "Plataformas",
"province": "India y China por provincia",
"zero": "Nada en su idioma"
},
"wayIn": {
"bridge": "Idioma puente",
"candidate": "Idioma candidato",
"candidateText": "{lang} (candidato, {pct} % del país)",
"deaf": "Puente en lengua de señas",
"deafText": "{lang} (lengua de señas)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "Moins de 25 % en ligne",
"nodata": "Pas de données",
"partial": "25–59 % en ligne",
"yes": "60 % ou plus en ligne"
},
"charts": {
"accessByBand": "Accès dans leur langue, selon l’usage d’internet du pays",
"aria": "Graphiques",
"bandCaveat": "L’usage d’internet est le chiffre du pays (Banque mondiale), jamais celui du groupe.",
"groups": "Groupes",
"groupsN": "{n} groupes",
"measure": "Compter",
"messagingTop": "Messagerie principale, par pays sélectionné",
"notMeasured": "Non mesuré",
"people": "Personnes",
"peopleN": "{n} personnes",
"socialTop": "Réseau social principal, par pays sélectionné",
"unitCountries": "pays",
"unitGroups": "groupes ethniques",
"unitPeople": "personnes",
"zeroByBand": "Rien dans leur propre langue, selon l’usage d’internet du pays",
"zeroCaveat": "Chacun d’eux a une porte d’entrée : une langue passerelle, une langue candidate ou une passerelle en langue des signes."
},
"col": {
"access": "Dans leur langue",
"band": "Niveau internet",
"bridgeTraining": "Formation (passerelle)",
"country": "Pays",
"deafPublisher": "Éditeur en langue des signes",
"internet": "Pays en ligne",
"internetYear": "Année",
"language": "Langue",
"messaging": "Messagerie principale (pays, iOS)",
"mobile": "Mobile pour 100",
"platform": "Plateforme principale (pays)",
"praying": "Personnes qui prient",
"province": "État / province (approx.)",
"resources": "Ressources trouvées",
"stateMen": "État en ligne : hommes",
"stateWomen": "État en ligne : femmes",
"training": "Formation (propre langue)",
"translatedBy": "Traduit par",
"wayIn": "Porte d’entrée"
},
"detail": {
"hear": "Voir ou entendre, sans lire",
"none": "Rien trouvé",
"read": "Lire",
"read_watch": "Lire et voir",
"stories": "Récits seulement"
},
"drawer": {
"approx": "approximatif",
"bridgeHas": "Dans la langue passerelle",
"conn": "Connectivité",
"copied": "Lien copié",
"copyLink": "Copier le lien vers ce groupe",
"deafLink": "Écritures en langue des signes",
"foundNote": "Trouvé dans les sources consultées.",
"messaging": "Messageries (téléchargements iOS)",
"mobileNote": "Abonnements pour 100 personnes ({year}) ; une personne peut en avoir plusieurs.",
"nfhsNote": "NFHS-5, 2019–21, 15–49 ans : le chiffre de l’État, pas celui du groupe.",
"noFeed": "Ce pays n’est pas dans le flux d’Apple : ses messageries sont inconnues ici, pas absentes.",
"noneNote": "Rien n’a été trouvé dans leur propre langue dans les sources consultées. Cela ne veut pas dire que rien n’existe.",
"own": "Dans leur propre langue",
"people": "{n} personnes",
"platformNote": "Part des visites web venant des réseaux sociaux suivis dans le pays (StatCounter). Les messageries comme WhatsApp ne sont pas mesurées.",
"platforms": "Plateformes dans le pays",
"praying": "{n} personnes prient sur DOXA",
"social": "Réseaux sociaux (visites web)",
"stateOnline": "{state} : a déjà utilisé internet",
"way": "Porte d’entrée",
"wayIn": "Porte d’entrée",
"wayNote": "Une langue voisine, pas une recommandation : savoir si un groupe la parle est une question pour quelqu’un sur le terrain.",
"wbSource": "Banque mondiale, {year} : le chiffre du pays",
"womenMen": "femmes {w} · hommes {m}"
},
"facet": {
"access": "Accès dans leur propre langue",
"all": "Tout afficher ({n})",
"aria": "Filtres",
"band": "Usage d’internet du pays",
"bandNote": "Le chiffre du pays (Banque mondiale), jamais celui du groupe.",
"country": "Pays",
"fewer": "Afficher moins",
"find": "Rechercher…",
"findIn": "Rechercher dans {what}",
"language": "Langue",
"messaging": "Messagerie principale (pays)",
"messagingNote": "La plus téléchargée sur l’App Store d’Apple du pays : iOS seulement, un rang de téléchargements, pas l’usage.",
"province": "Inde et Chine : État ou province",
"provinceNote": "Approximatif : placé d’après l’endroit où vit un peuple, pas une ville.",
"region": "Région",
"religion": "Religion",
"wayIn": "Porte d’entrée quand rien n’existe dans leur langue"
},
"grid": {
"aria": "Groupes ethniques sélectionnés",
"columns": "Colonnes",
"count": "{n} sur {total} groupes ethniques",
"empty": "Aucun groupe ethnique ne correspond à ces filtres.",
"exported": "{n} lignes exportées (copiées et téléchargées).",
"selectRow": "Sélectionner {name}"
},
"headline": {
"a": "{zero} des {total} groupes ethniques n’ont rien dans leur propre langue ;",
"b": "{online} d’entre eux vivent dans des pays où 60 % ou plus utilisent internet."
},
"kind": {
"audio": "Audio",
"film": "Film",
"scripture": "Écritures",
"stories": "Récits",
"video": "Vidéo"
},
"legend": {
"band": "Usage d’internet du pays (Banque mondiale)",
"hide": "Masquer la légende",
"modeMen": "Internet : hommes",
"modeWomen": "Internet : femmes",
"modeZero": "Rien dans leur langue",
"nfhs": "Inde uniquement : part des femmes ou des hommes de 15 à 49 ans ayant déjà utilisé internet, par État. NFHS-5, 2019–21. Aucune source provinciale vérifiée pour la Chine.",
"pins": "Dans leur propre langue",
"provinces": "Inde et Chine par province",
"show": "Légende"
},
"level": {
"bridge": "Rien dans leur langue · passerelle seulement",
"own": "Quelque chose dans leur langue",
"zero": "Rien dans leur langue · pas encore de porte d’entrée"
},
"listChip": "Liste de groupes ethniques choisie par cette page",
"loadError": "Les données du tableau de bord n’ont pas été chargées.",
"map": {
"aria": "Carte des groupes ethniques, ombrée selon la part de chaque pays qui utilise internet"
},
"notice": {
"pin": "Le point indique où ce peuple vit en {country}, pas une ville.",
"pins": "Un point indique où un peuple vit dans son pays, pas une ville. {n} groupes partagent un point avec un autre groupe.",
"shares": "Il partage son point avec {n} autre(s) groupe(s).",
"sources": "Sources :",
"standing": "Les points sont approximatifs (où un peuple vit dans son pays, pas une ville). Les chiffres d’internet sont ceux du pays ou de l’État indien, jamais du groupe. « Trouvé » signifie trouvé dans les sources consultées."
},
"panel": {
"charts": "Graphiques",
"filters": "Filtres",
"grid": "Groupes",
"map": "Carte"
},
"strength": {
"moderate": "moyenne",
"strong": "forte"
},
"title": "L’accès à l’Évangile par internet",
"view": {
"aria": "Vue",
"board": "Tableau",
"platforms": "Plateformes",
"province": "Inde et Chine par province",
"zero": "Rien dans leur langue"
},
"wayIn": {
"bridge": "Langue passerelle",
"candidate": "Langue candidate",
"candidateText": "{lang} (candidate, {pct} % du pays)",
"deaf": "Passerelle en langue des signes",
"deafText": "{lang} (langue des signes)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "25% से कम ऑनलाइन",
"nodata": "कोई आंकड़ा नहीं",
"partial": "25–59% ऑनलाइन",
"yes": "60% या अधिक ऑनलाइन"
},
"charts": {
"accessByBand": "अपनी भाषा में पहुँच, देश के इंटरनेट उपयोग के अनुसार",
"aria": "चार्ट",
"bandCaveat": "इंटरनेट उपयोग देश का आंकड़ा है (विश्व बैंक), समूह का कभी नहीं।",
"groups": "समूह",
"groupsN": "{n} समूह",
"measure": "गिनती",
"messagingTop": "प्रमुख मैसेजिंग ऐप, दायरे के देशों के अनुसार",
"notMeasured": "मापा नहीं गया",
"people": "लोग",
"peopleN": "{n} लोग",
"socialTop": "प्रमुख सोशल प्लेटफ़ॉर्म, दायरे के देशों के अनुसार",
"unitCountries": "देश",
"unitGroups": "जन-समूह",
"unitPeople": "लोग",
"zeroByBand": "अपनी भाषा में कुछ नहीं, देश के इंटरनेट उपयोग के अनुसार",
"zeroCaveat": "इनमें से हर एक के लिए एक रास्ता है: एक सेतु भाषा, एक संभावित भाषा या सांकेतिक भाषा का सेतु।"
},
"col": {
"access": "अपनी भाषा में",
"band": "इंटरनेट श्रेणी",
"bridgeTraining": "प्रशिक्षण (सेतु भाषा)",
"country": "देश",
"deafPublisher": "सांकेतिक भाषा प्रकाशक",
"internet": "देश ऑनलाइन",
"internetYear": "वर्ष",
"language": "भाषा",
"messaging": "प्रमुख मैसेजिंग ऐप (देश, iOS)",
"mobile": "प्रति 100 मोबाइल",
"platform": "प्रमुख प्लेटफ़ॉर्म (देश)",
"praying": "प्रार्थना करने वाले",
"province": "राज्य / प्रांत (अनुमानित)",
"resources": "मिले संसाधन",
"stateMen": "राज्य ऑनलाइन: पुरुष",
"stateWomen": "राज्य ऑनलाइन: महिलाएँ",
"training": "प्रशिक्षण (अपनी भाषा)",
"translatedBy": "अनुवादक",
"wayIn": "रास्ता"
},
"detail": {
"hear": "देख या सुन सकते हैं, पढ़ नहीं सकते",
"none": "कुछ नहीं मिला",
"read": "पढ़ सकते हैं",
"read_watch": "पढ़ और देख सकते हैं",
"stories": "केवल कहानियाँ"
},
"drawer": {
"approx": "अनुमानित",
"bridgeHas": "सेतु भाषा में",
"conn": "कनेक्टिविटी",
"copied": "लिंक कॉपी हो गया",
"copyLink": "इस समूह का लिंक कॉपी करें",
"deafLink": "सांकेतिक भाषा में पवित्र शास्त्र",
"foundNote": "जाँचे गए स्रोतों में मिला।",
"messaging": "मैसेजिंग ऐप (iOS डाउनलोड)",
"mobileNote": "प्रति 100 लोगों पर कनेक्शन ({year}); एक व्यक्ति के कई हो सकते हैं।",
"nfhsNote": "NFHS-5, 2019–21, 15–49 वर्ष: यह राज्य का आंकड़ा है, समूह का नहीं।",
"noFeed": "यह देश Apple की फ़ीड में नहीं है: यहाँ इसके मैसेजिंग ऐप अज्ञात हैं, अनुपस्थित नहीं।",
"noneNote": "जाँचे गए स्रोतों में उनकी अपनी भाषा में कुछ नहीं मिला। इसका मतलब यह नहीं कि कुछ भी मौजूद नहीं है।",
"own": "उनकी अपनी भाषा में",
"people": "{n} लोग",
"platformNote": "देश में ट्रैक किए गए सोशल प्लेटफ़ॉर्म से आने वाले वेब ट्रैफ़िक का हिस्सा (StatCounter)। WhatsApp जैसे मैसेजिंग ऐप मापे नहीं जाते।",
"platforms": "देश में प्लेटफ़ॉर्म",
"praying": "DOXA पर {n} लोग प्रार्थना कर रहे हैं",
"social": "सोशल प्लेटफ़ॉर्म (वेब रेफ़रल)",
"stateOnline": "{state}: कभी इंटरनेट का उपयोग किया",
"way": "रास्ता",
"wayIn": "रास्ता",
"wayNote": "एक पड़ोसी भाषा, सिफ़ारिश नहीं: कोई समूह इसे बोलता है या नहीं, यह ज़मीन पर मौजूद किसी व्यक्ति का प्रश्न है।",
"wbSource": "विश्व बैंक, {year}: देश का आंकड़ा",
"womenMen": "महिलाएँ {w} · पुरुष {m}"
},
"facet": {
"access": "उनकी अपनी भाषा में पहुँच",
"all": "सभी {n} दिखाएँ",
"aria": "फ़िल्टर",
"band": "देश में इंटरनेट उपयोग",
"bandNote": "देश का आंकड़ा (विश्व बैंक), समूह का कभी नहीं।",
"country": "देश",
"fewer": "कम दिखाएँ",
"find": "खोजें…",
"findIn": "{what} में खोजें",
"language": "भाषा",
"messaging": "प्रमुख मैसेजिंग ऐप (देश)",
"messagingNote": "देश के Apple App Store में सबसे अधिक डाउनलोड किया गया: केवल iOS, डाउनलोड रैंक, उपयोग नहीं।",
"province": "भारत और चीन: राज्य या प्रांत",
"provinceNote": "अनुमानित: जहाँ जन-समूह पाया जाता है उसके आधार पर, किसी कस्बे के आधार पर नहीं।",
"region": "क्षेत्र",
"religion": "धर्म",
"wayIn": "जब उनकी भाषा में कुछ न हो, तब का रास्ता"
},
"grid": {
"aria": "दायरे में जन-समूह",
"columns": "कॉलम",
"count": "{total} में से {n} जन-समूह",
"empty": "इन फ़िल्टरों से कोई जन-समूह मेल नहीं खाता।",
"exported": "{n} पंक्तियाँ निर्यात हुईं (कॉपी और डाउनलोड)।",
"selectRow": "{name} चुनें"
},
"headline": {
"a": "{total} में से {zero} जन-समूहों की अपनी भाषा में कुछ नहीं मिला;",
"b": "इनमें से {online} ऐसे देशों में रहते हैं जहाँ 60% या अधिक लोग इंटरनेट का उपयोग करते हैं।"
},
"kind": {
"audio": "ऑडियो",
"film": "फ़िल्म",
"scripture": "पवित्र शास्त्र",
"stories": "कहानियाँ",
"video": "वीडियो"
},
"legend": {
"band": "देश में इंटरनेट उपयोग (विश्व बैंक)",
"hide": "लेजेंड छिपाएँ",
"modeMen": "इंटरनेट: पुरुष",
"modeWomen": "इंटरनेट: महिलाएँ",
"modeZero": "अपनी भाषा में कुछ नहीं",
"nfhs": "केवल भारत: राज्यवार 15–49 वर्ष की महिलाओं या पुरुषों का हिस्सा जिन्होंने कभी इंटरनेट का उपयोग किया है। NFHS-5, 2019–21। चीन के लिए कोई सत्यापित प्रांतीय स्रोत नहीं है।",
"pins": "उनकी अपनी भाषा में",
"provinces": "भारत और चीन, प्रांत के अनुसार",
"show": "लेजेंड"
},
"level": {
"bridge": "अपनी भाषा में कुछ नहीं · केवल सेतु",
"own": "अपनी भाषा में कुछ है",
"zero": "अपनी भाषा में कुछ नहीं · अभी कोई रास्ता नहीं"
},
"listChip": "इस पेज द्वारा चुनी गई जन-समूह सूची",
"loadError": "बोर्ड का डेटा लोड नहीं हुआ।",
"map": {
"aria": "जन-समूहों का मानचित्र, हर देश में इंटरनेट उपयोग के अनुसार रंगा हुआ"
},
"notice": {
"pin": "बिंदु दिखाता है कि यह जन-समूह {country} में कहाँ पाया जाता है, कोई कस्बा नहीं।",
"pins": "बिंदु दिखाता है कि कोई जन-समूह अपने देश में कहाँ पाया जाता है, कोई कस्बा नहीं। {n} समूह किसी दूसरे समूह के साथ एक ही बिंदु साझा करते हैं।",
"shares": "यह अपना बिंदु {n} अन्य समूह(ों) के साथ साझा करता है।",
"sources": "स्रोत:",
"standing": "बिंदु अनुमानित हैं (जहाँ जन-समूह अपने देश में पाया जाता है, कोई कस्बा नहीं)। इंटरनेट के आंकड़े देश या भारतीय राज्य के हैं, समूह के कभी नहीं। \"मिला\" का अर्थ है जाँचे गए स्रोतों में मिला।"
},
"panel": {
"charts": "चार्ट",
"filters": "फ़िल्टर",
"grid": "समूह",
"map": "मानचित्र"
},
"strength": {
"moderate": "मध्यम",
"strong": "मज़बूत"
},
"title": "इंटरनेट के माध्यम से सुसमाचार तक पहुँच",
"view": {
"aria": "दृश्य",
"board": "बोर्ड",
"platforms": "प्लेटफ़ॉर्म",
"province": "भारत और चीन, प्रांत के अनुसार",
"zero": "अपनी भाषा में कुछ नहीं"
},
"wayIn": {
"bridge": "सेतु भाषा",
"candidate": "संभावित भाषा",
"candidateText": "{lang} (संभावित, देश का {pct}%)",
"deaf": "सांकेतिक भाषा सेतु",
"deafText": "{lang} (सांकेतिक भाषा)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "Meno del 25 % online",
"nodata": "Nessun dato",
"partial": "25–59 % online",
"yes": "60 % o più online"
},
"charts": {
"accessByBand": "Accesso nella propria lingua, per uso di internet del paese",
"aria": "Grafici",
"bandCaveat": "L’uso di internet è il dato del paese (Banca Mondiale), mai quello del gruppo.",
"groups": "Gruppi",
"groupsN": "{n} gruppi",
"measure": "Conta",
"messagingTop": "App di messaggistica principale, per paese selezionato",
"notMeasured": "Non misurato",
"people": "Persone",
"peopleN": "{n} persone",
"socialTop": "Piattaforma social principale, per paese selezionato",
"unitCountries": "paesi",
"unitGroups": "gruppi etnici",
"unitPeople": "persone",
"zeroByBand": "Niente nella propria lingua, per uso di internet del paese",
"zeroCaveat": "Ognuno ha una via d’accesso: una lingua ponte, una lingua candidata o un ponte in lingua dei segni."
},
"col": {
"access": "Nella propria lingua",
"band": "Fascia internet",
"bridgeTraining": "Formazione (ponte)",
"country": "Paese",
"deafPublisher": "Editore in lingua dei segni",
"internet": "Paese online",
"internetYear": "Anno",
"language": "Lingua",
"messaging": "App di messaggistica principale (paese, iOS)",
"mobile": "Cellulari per 100",
"platform": "Piattaforma principale (paese)",
"praying": "Persone che pregano",
"province": "Stato / provincia (approssimativo)",
"resources": "Risorse trovate",
"stateMen": "Stato online: uomini",
"stateWomen": "Stato online: donne",
"training": "Formazione (propria lingua)",
"translatedBy": "Tradotto da",
"wayIn": "Via d’accesso"
},
"detail": {
"hear": "Vedere o ascoltare, non leggere",
"none": "Niente trovato",
"read": "Leggere",
"read_watch": "Leggere e vedere",
"stories": "Solo storie"
},
"drawer": {
"approx": "approssimativo",
"bridgeHas": "Nella lingua ponte",
"conn": "Connettività",
"copied": "Link copiato",
"copyLink": "Copia il link a questo gruppo",
"deafLink": "Scritture in lingua dei segni",
"foundNote": "Trovato nelle fonti consultate.",
"messaging": "App di messaggistica (download iOS)",
"mobileNote": "Abbonamenti ogni 100 persone ({year}); una persona può averne diversi.",
"nfhsNote": "NFHS-5, 2019–21, 15–49 anni: il dato dello stato, non del gruppo.",
"noFeed": "Questo paese non è nel feed di Apple: le sue app di messaggistica qui sono sconosciute, non assenti.",
"noneNote": "Nelle fonti consultate non è stato trovato niente nella loro lingua. Non significa che non esista nulla.",
"own": "Nella propria lingua",
"people": "{n} persone",
"platformNote": "Quota di visite web provenienti dalle piattaforme social monitorate nel paese (StatCounter). Le app di messaggistica come WhatsApp non sono misurate.",
"platforms": "Piattaforme nel paese",
"praying": "{n} persone pregano su DOXA",
"social": "Piattaforme social (visite web)",
"stateOnline": "{state}: ha mai usato internet",
"way": "Via d’accesso",
"wayIn": "Via d’accesso",
"wayNote": "Una lingua vicina, non una raccomandazione: se un gruppo la parla è una domanda per qualcuno sul posto.",
"wbSource": "Banca Mondiale, {year}: il dato del paese",
"womenMen": "donne {w} · uomini {m}"
},
"facet": {
"access": "Accesso nella propria lingua",
"all": "Mostra tutti ({n})",
"aria": "Filtri",
"band": "Uso di internet del paese",
"bandNote": "Il dato del paese (Banca Mondiale), mai quello del gruppo.",
"country": "Paese",
"fewer": "Mostra meno",
"find": "Cerca…",
"findIn": "Cerca in {what}",
"language": "Lingua",
"messaging": "App di messaggistica principale (paese)",
"messagingNote": "La più scaricata nell’App Store di Apple del paese: solo iOS, una classifica di download, non di uso.",
"province": "India e Cina: stato o provincia",
"provinceNote": "Approssimativo: collocato dove vive un popolo, non in una città.",
"region": "Regione",
"religion": "Religione",
"wayIn": "Via d’accesso quando non c’è niente nella loro lingua"
},
"grid": {
"aria": "Gruppi etnici selezionati",
"columns": "Colonne",
"count": "{n} di {total} gruppi etnici",
"empty": "Nessun gruppo etnico corrisponde a questi filtri.",
"exported": "{n} righe esportate (copiate e scaricate).",
"selectRow": "Seleziona {name}"
},
"headline": {
"a": "{zero} dei {total} gruppi etnici non hanno niente nella propria lingua;",
"b": "{online} di loro vivono in paesi dove il 60 % o più usa internet."
},
"kind": {
"audio": "Audio",
"film": "Film",
"scripture": "Scritture",
"stories": "Storie",
"video": "Video"
},
"legend": {
"band": "Uso di internet del paese (Banca Mondiale)",
"hide": "Nascondi la legenda",
"modeMen": "Internet: uomini",
"modeWomen": "Internet: donne",
"modeZero": "Niente nella propria lingua",
"nfhs": "Solo India: quota di donne o uomini di 15–49 anni che hanno mai usato internet, per stato. NFHS-5, 2019–21. Per la Cina non esiste una fonte provinciale verificata.",
"pins": "Nella propria lingua",
"provinces": "India e Cina per provincia",
"show": "Legenda"
},
"level": {
"bridge": "Niente nella propria lingua · solo ponte",
"own": "Qualcosa nella propria lingua",
"zero": "Niente nella propria lingua · ancora nessuna via d’accesso"
},
"listChip": "Elenco di gruppi etnici scelto da questa pagina",
"loadError": "I dati del pannello non sono stati caricati.",
"map": {
"aria": "Mappa dei gruppi etnici, ombreggiata secondo quanto ogni paese usa internet"
},
"notice": {
"pin": "Il punto indica dove vive questo popolo in {country}, non una città.",
"pins": "Un punto indica dove vive un popolo nel suo paese, non una città. {n} gruppi condividono un punto con un altro gruppo.",
"shares": "Condivide il punto con {n} altro/i gruppo/i.",
"sources": "Fonti:",
"standing": "I punti sono approssimativi (dove vive un popolo nel suo paese, non una città). I dati di internet sono del paese o dello stato indiano, mai del gruppo. «Trovato» significa trovato nelle fonti consultate."
},
"panel": {
"charts": "Grafici",
"filters": "Filtri",
"grid": "Gruppi",
"map": "Mappa"
},
"strength": {
"moderate": "moderata",
"strong": "forte"
},
"title": "L’accesso al vangelo tramite internet",
"view": {
"aria": "Vista",
"board": "Pannello",
"platforms": "Piattaforme",
"province": "India e Cina per provincia",
"zero": "Niente nella propria lingua"
},
"wayIn": {
"bridge": "Lingua ponte",
"candidate": "Lingua candidata",
"candidateText": "{lang} (candidata, {pct} % del paese)",
"deaf": "Ponte in lingua dei segni",
"deafText": "{lang} (lingua dei segni)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "Menos de 25 % online",
"nodata": "Sem dados",
"partial": "25–59 % online",
"yes": "60 % ou mais online"
},
"charts": {
"accessByBand": "Acesso na própria língua, por uso de internet do país",
"aria": "Gráficos",
"bandCaveat": "O uso de internet é o número do país (Banco Mundial), nunca o do grupo.",
"groups": "Grupos",
"groupsN": "{n} grupos",
"measure": "Contar",
"messagingTop": "App de mensagens principal, por país no recorte",
"notMeasured": "Não medido",
"people": "Pessoas",
"peopleN": "{n} pessoas",
"socialTop": "Rede social principal, por país no recorte",
"unitCountries": "países",
"unitGroups": "povos",
"unitPeople": "pessoas",
"zeroByBand": "Nada na própria língua, por uso de internet do país",
"zeroCaveat": "Cada um tem um caminho de entrada: uma língua ponte, uma língua candidata ou uma ponte em língua de sinais."
},
"col": {
"access": "Na própria língua",
"band": "Faixa de internet",
"bridgeTraining": "Treinamento (ponte)",
"country": "País",
"deafPublisher": "Editora em língua de sinais",
"internet": "País online",
"internetYear": "Ano",
"language": "Língua",
"messaging": "App de mensagens principal (país, iOS)",
"mobile": "Celulares por 100",
"platform": "Principal plataforma (país)",
"praying": "Pessoas orando",
"province": "Estado / província (aprox.)",
"resources": "Recursos encontrados",
"stateMen": "Estado online: homens",
"stateWomen": "Estado online: mulheres",
"training": "Treinamento (própria língua)",
"translatedBy": "Traduzido por",
"wayIn": "Caminho de entrada"
},
"detail": {
"hear": "Ver ou ouvir, sem ler",
"none": "Nada encontrado",
"read": "Ler",
"read_watch": "Ler e ver",
"stories": "Só histórias"
},
"drawer": {
"approx": "aproximado",
"bridgeHas": "Na língua ponte",
"conn": "Conectividade",
"copied": "Link copiado",
"copyLink": "Copiar link deste grupo",
"deafLink": "Escrituras em língua de sinais",
"foundNote": "Encontrado nas fontes verificadas.",
"messaging": "Apps de mensagens (downloads iOS)",
"mobileNote": "Assinaturas por 100 pessoas ({year}); uma pessoa pode ter várias.",
"nfhsNote": "NFHS-5, 2019–21, 15–49 anos: o número do estado, não do grupo.",
"noFeed": "Este país não está no feed da Apple: seus apps de mensagens são desconhecidos aqui, não ausentes.",
"noneNote": "Nada foi encontrado na própria língua nas fontes verificadas. Isso não afirma que nada exista.",
"own": "Na própria língua",
"people": "{n} pessoas",
"platformNote": "Parcela de acessos web vindos das redes sociais monitoradas no país (StatCounter). Aplicativos de mensagem como o WhatsApp não são medidos.",
"platforms": "Plataformas no país",
"praying": "{n} pessoas orando no DOXA",
"social": "Redes sociais (acessos web)",
"stateOnline": "{state}: já usou a internet",
"way": "Caminho de entrada",
"wayIn": "Caminho de entrada",
"wayNote": "Uma língua vizinha, não uma recomendação: se um grupo a fala é uma pergunta para alguém no local.",
"wbSource": "Banco Mundial, {year}: o número do país",
"womenMen": "mulheres {w} · homens {m}"
},
"facet": {
"access": "Acesso na própria língua",
"all": "Mostrar todos os {n}",
"aria": "Filtros",
"band": "Uso de internet do país",
"bandNote": "O número do país (Banco Mundial), nunca o do grupo.",
"country": "País",
"fewer": "Mostrar menos",
"find": "Buscar…",
"findIn": "Buscar em {what}",
"language": "Língua",
"messaging": "App de mensagens principal (país)",
"messagingNote": "O mais baixado na App Store da Apple do país: só iOS, um ranking de downloads, não de uso.",
"province": "Índia e China: estado ou província",
"provinceNote": "Aproximado: colocado onde um povo vive, não numa cidade.",
"region": "Região",
"religion": "Religião",
"wayIn": "Caminho de entrada quando não há nada na língua deles"
},
"grid": {
"aria": "Povos no recorte",
"columns": "Colunas",
"count": "{n} de {total} povos",
"empty": "Nenhum povo corresponde a estes filtros.",
"exported": "{n} linhas exportadas (copiadas e baixadas).",
"selectRow": "Selecionar {name}"
},
"headline": {
"a": "{zero} de {total} povos não têm nada na própria língua;",
"b": "{online} deles vivem em países onde 60 % ou mais usam a internet."
},
"kind": {
"audio": "Áudio",
"film": "Filme",
"scripture": "Escrituras",
"stories": "Histórias",
"video": "Vídeo"
},
"legend": {
"band": "Uso de internet do país (Banco Mundial)",
"hide": "Ocultar a legenda",
"modeMen": "Internet: homens",
"modeWomen": "Internet: mulheres",
"modeZero": "Nada na própria língua",
"nfhs": "Só Índia: parcela de mulheres ou homens de 15 a 49 anos que já usaram a internet, por estado. NFHS-5, 2019–21. A China não tem fonte provincial verificada.",
"pins": "Na própria língua",
"provinces": "Índia e China por província",
"show": "Legenda"
},
"level": {
"bridge": "Nada na própria língua · só ponte",
"own": "Algo na própria língua",
"zero": "Nada na própria língua · ainda sem caminho de entrada"
},
"listChip": "Lista de povos escolhida por esta página",
"loadError": "Os dados do painel não carregaram.",
"map": {
"aria": "Mapa dos povos, sombreado pelo quanto cada país usa a internet"
},
"notice": {
"pin": "O ponto marca onde este povo vive em {country}, não uma cidade.",
"pins": "Um ponto marca onde um povo vive no seu país, não uma cidade. {n} grupos dividem um ponto com outro grupo.",
"shares": "Divide o ponto com {n} outro(s) grupo(s).",
"sources": "Fontes:",
"standing": "Os pontos são aproximados (onde um povo vive no seu país, não uma cidade). Os números de internet são do país ou do estado indiano, nunca do grupo. “Encontrado” significa encontrado nas fontes verificadas."
},
"panel": {
"charts": "Gráficos",
"filters": "Filtros",
"grid": "Grupos",
"map": "Mapa"
},
"strength": {
"moderate": "moderada",
"strong": "forte"
},
"title": "Acesso ao evangelho pela internet",
"view": {
"aria": "Visão",
"board": "Painel",
"platforms": "Plataformas",
"province": "Índia e China por província",
"zero": "Nada na própria língua"
},
"wayIn": {
"bridge": "Língua ponte",
"candidate": "Língua candidata",
"candidateText": "{lang} (candidata, {pct} % do país)",
"deaf": "Ponte em língua de sinais",
"deafText": "{lang} (língua de sinais)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "Sub 25 % online",
"nodata": "Fără date",
"partial": "25–59 % online",
"yes": "60 % sau mai mult online"
},
"charts": {
"accessByBand": "Acces în propria limbă, după folosirea internetului în țară",
"aria": "Grafice",
"bandCaveat": "Folosirea internetului este cifra țării (Banca Mondială), niciodată a grupului.",
"groups": "Grupuri",
"groupsN": "{n} grupuri",
"measure": "Numără",
"messagingTop": "Aplicația de mesagerie principală, pe țări selectate",
"notMeasured": "Nemăsurat",
"people": "Oameni",
"peopleN": "{n} oameni",
"socialTop": "Platforma socială principală, pe țări selectate",
"unitCountries": "țări",
"unitGroups": "grupuri etnice",
"unitPeople": "oameni",
"zeroByBand": "Nimic în propria limbă, după folosirea internetului în țară",
"zeroCaveat": "Fiecare are o cale de acces: o limbă punte, o limbă candidată sau o punte în limbajul semnelor."
},
"col": {
"access": "În propria limbă",
"band": "Nivel internet",
"bridgeTraining": "Instruire (punte)",
"country": "Țară",
"deafPublisher": "Editură în limbajul semnelor",
"internet": "Țara online",
"internetYear": "An",
"language": "Limbă",
"messaging": "Aplicația de mesagerie principală (țară, iOS)",
"mobile": "Mobile la 100",
"platform": "Platforma principală (țară)",
"praying": "Oameni care se roagă",
"province": "Stat / provincie (aprox.)",
"resources": "Resurse găsite",
"stateMen": "Stat online: bărbați",
"stateWomen": "Stat online: femei",
"training": "Instruire (propria limbă)",
"translatedBy": "Tradus de",
"wayIn": "Cale de acces"
},
"detail": {
"hear": "Văd sau aud, nu citesc",
"none": "Nimic găsit",
"read": "Citesc",
"read_watch": "Citesc și văd",
"stories": "Doar povestiri"
},
"drawer": {
"approx": "aproximativ",
"bridgeHas": "În limba punte",
"conn": "Conectivitate",
"copied": "Link copiat",
"copyLink": "Copiază linkul către acest grup",
"deafLink": "Scriptura în limbajul semnelor",
"foundNote": "Găsit în sursele verificate.",
"messaging": "Aplicații de mesagerie (descărcări iOS)",
"mobileNote": "Abonamente la 100 de persoane ({year}); o persoană poate avea mai multe.",
"nfhsNote": "NFHS-5, 2019–21, 15–49 ani: cifra statului, nu a grupului.",
"noFeed": "Această țară nu este în fluxul Apple: aplicațiile sale de mesagerie sunt necunoscute aici, nu absente.",
"noneNote": "Nu s-a găsit nimic în propria lor limbă în sursele verificate. Asta nu înseamnă că nu există nimic.",
"own": "În propria lor limbă",
"people": "{n} oameni",
"platformNote": "Ponderea vizitelor web venite de la platformele sociale urmărite în țară (StatCounter). Aplicațiile de mesagerie precum WhatsApp nu sunt măsurate.",
"platforms": "Platforme în țară",
"praying": "{n} oameni se roagă pe DOXA",
"social": "Platforme sociale (vizite web)",
"stateOnline": "{state}: a folosit vreodată internetul",
"way": "Cale de acces",
"wayIn": "Cale de acces",
"wayNote": "O limbă vecină, nu o recomandare: dacă un grup o vorbește este o întrebare pentru cineva de pe teren.",
"wbSource": "Banca Mondială, {year}: cifra țării",
"womenMen": "femei {w} · bărbați {m}"
},
"facet": {
"access": "Acces în propria lor limbă",
"all": "Arată toate ({n})",
"aria": "Filtre",
"band": "Folosirea internetului în țară",
"bandNote": "Cifra țării (Banca Mondială), niciodată a grupului.",
"country": "Țară",
"fewer": "Arată mai puține",
"find": "Caută…",
"findIn": "Caută în {what}",
"language": "Limbă",
"messaging": "Aplicația de mesagerie principală (țară)",
"messagingNote": "Cea mai descărcată în App Store-ul Apple al țării: doar iOS, un clasament de descărcări, nu de utilizare.",
"province": "India și China: stat sau provincie",
"provinceNote": "Aproximativ: plasat după locul unde trăiește un popor, nu un oraș.",
"region": "Regiune",
"religion": "Religie",
"wayIn": "Cale de acces când nu există nimic în limba lor"
},
"grid": {
"aria": "Grupuri etnice selectate",
"columns": "Coloane",
"count": "{n} din {total} grupuri etnice",
"empty": "Niciun grup etnic nu corespunde acestor filtre.",
"exported": "{n} rânduri exportate (copiate și descărcate).",
"selectRow": "Selectează {name}"
},
"headline": {
"a": "{zero} din {total} grupuri etnice nu au nimic în propria lor limbă;",
"b": "{online} dintre ele trăiesc în țări unde 60 % sau mai mult folosesc internetul."
},
"kind": {
"audio": "Audio",
"film": "Film",
"scripture": "Scriptura",
"stories": "Povestiri",
"video": "Video"
},
"legend": {
"band": "Folosirea internetului în țară (Banca Mondială)",
"hide": "Ascunde legenda",
"modeMen": "Internet: bărbați",
"modeWomen": "Internet: femei",
"modeZero": "Nimic în propria limbă",
"nfhs": "Doar India: ponderea femeilor sau a bărbaților de 15–49 ani care au folosit vreodată internetul, pe state. NFHS-5, 2019–21. China nu are o sursă provincială verificată.",
"pins": "În propria lor limbă",
"provinces": "India și China pe provincii",
"show": "Legendă"
},
"level": {
"bridge": "Nimic în propria limbă · doar punte",
"own": "Ceva în propria limbă",
"zero": "Nimic în propria limbă · încă nicio cale de acces"
},
"listChip": "Listă de grupuri etnice aleasă de această pagină",
"loadError": "Datele panoului nu s-au încărcat.",
"map": {
"aria": "Harta grupurilor etnice, colorată după cât folosește internetul fiecare țară"
},
"notice": {
"pin": "Punctul arată unde trăiește acest popor în {country}, nu un oraș.",
"pins": "Un punct arată unde trăiește un popor în țara sa, nu un oraș. {n} grupuri împart un punct cu alt grup.",
"shares": "Își împarte punctul cu alte {n} grup(uri).",
"sources": "Surse:",
"standing": "Punctele sunt aproximative (unde trăiește un popor în țara sa, nu un oraș). Cifrele de internet sunt ale țării sau ale statului indian, niciodată ale grupului. „Găsit” înseamnă găsit în sursele verificate."
},
"panel": {
"charts": "Grafice",
"filters": "Filtre",
"grid": "Grupuri",
"map": "Hartă"
},
"strength": {
"moderate": "moderată",
"strong": "puternică"
},
"title": "Accesul la Evanghelie prin internet",
"view": {
"aria": "Vedere",
"board": "Panou",
"platforms": "Platforme",
"province": "India și China pe provincii",
"zero": "Nimic în propria limbă"
},
"wayIn": {
"bridge": "Limbă punte",
"candidate": "Limbă candidată",
"candidateText": "{lang} (candidată, {pct} % din țară)",
"deaf": "Punte în limbajul semnelor",
"deafText": "{lang} (limbajul semnelor)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "Менее 25 % в сети",
"nodata": "Нет данных",
"partial": "25–59 % в сети",
"yes": "60 % и более в сети"
},
"charts": {
"accessByBand": "Доступ на родном языке по уровню интернета в стране",
"aria": "Диаграммы",
"bandCaveat": "Использование интернета — показатель страны (Всемирный банк), а не группы.",
"groups": "Группы",
"groupsN": "{n} групп",
"measure": "Считать",
"messagingTop": "Главный мессенджер по странам в выборке",
"notMeasured": "Не измерено",
"people": "Люди",
"peopleN": "{n} чел.",
"socialTop": "Главная соцсеть по странам в выборке",
"unitCountries": "стран",
"unitGroups": "народов",
"unitPeople": "чел.",
"zeroByBand": "Ничего на родном языке, по уровню интернета в стране",
"zeroCaveat": "У каждого из них есть путь: язык-мост, язык-кандидат или мост на жестовом языке."
},
"col": {
"access": "На родном языке",
"band": "Уровень интернета",
"bridgeTraining": "Обучение (мост)",
"country": "Страна",
"deafPublisher": "Издатель на жестовом языке",
"internet": "Страна в сети",
"internetYear": "Год",
"language": "Язык",
"messaging": "Главный мессенджер (страна, iOS)",
"mobile": "Мобильных на 100",
"platform": "Главная платформа (страна)",
"praying": "Молящихся",
"province": "Штат / провинция (прибл.)",
"resources": "Найденные ресурсы",
"stateMen": "Штат в сети: мужчины",
"stateWomen": "Штат в сети: женщины",
"training": "Обучение (родной язык)",
"translatedBy": "Перевод",
"wayIn": "Путь"
},
"detail": {
"hear": "Смотрят или слушают, не читают",
"none": "Ничего не найдено",
"read": "Читают",
"read_watch": "Читают и смотрят",
"stories": "Только истории"
},
"drawer": {
"approx": "приблизительно",
"bridgeHas": "На языке-мосте",
"conn": "Связь",
"copied": "Ссылка скопирована",
"copyLink": "Скопировать ссылку на эту группу",
"deafLink": "Писание на жестовом языке",
"foundNote": "Найдено в проверенных источниках.",
"messaging": "Мессенджеры (загрузки iOS)",
"mobileNote": "Подписок на 100 человек ({year}); у одного человека может быть несколько.",
"nfhsNote": "NFHS-5, 2019–21, 15–49 лет: показатель штата, а не группы.",
"noFeed": "Этой страны нет в ленте Apple: её мессенджеры здесь неизвестны, а не отсутствуют.",
"noneNote": "В проверенных источниках на их родном языке ничего не найдено. Это не утверждение, что ничего не существует.",
"own": "На их родном языке",
"people": "{n} чел.",
"platformNote": "Доля веб-переходов из отслеживаемых соцсетей в стране (StatCounter). Мессенджеры вроде WhatsApp не измеряются.",
"platforms": "Платформы в стране",
"praying": "{n} чел. молятся на DOXA",
"social": "Соцсети (веб-переходы)",
"stateOnline": "{state}: когда-либо пользовались интернетом",
"way": "Путь",
"wayIn": "Путь",
"wayNote": "Соседний язык, а не рекомендация: говорит ли на нём группа — вопрос к тому, кто на месте.",
"wbSource": "Всемирный банк, {year}: показатель страны",
"womenMen": "женщины {w} · мужчины {m}"
},
"facet": {
"access": "Доступ на их родном языке",
"all": "Показать все ({n})",
"aria": "Фильтры",
"band": "Интернет в стране",
"bandNote": "Показатель страны (Всемирный банк), а не группы.",
"country": "Страна",
"fewer": "Показать меньше",
"find": "Найти…",
"findIn": "Найти в разделе «{what}»",
"language": "Язык",
"messaging": "Главный мессенджер (страна)",
"messagingNote": "Самый скачиваемый в App Store страны: только iOS, рейтинг загрузок, а не использования.",
"province": "Индия и Китай: штат или провинция",
"provinceNote": "Приблизительно: по месту проживания народа, а не по городу.",
"region": "Регион",
"religion": "Религия",
"wayIn": "Путь, когда на их языке ничего нет"
},
"grid": {
"aria": "Народы в выборке",
"columns": "Столбцы",
"count": "{n} из {total} народов",
"empty": "Ни один народ не подходит под эти фильтры.",
"exported": "Экспортировано строк: {n} (скопировано и скачано).",
"selectRow": "Выбрать: {name}"
},
"headline": {
"a": "У {zero} из {total} народов нет ничего на родном языке;",
"b": "{online} из них живут в странах, где интернетом пользуются 60 % и более."
},
"kind": {
"audio": "Аудио",
"film": "Фильм",
"scripture": "Писание",
"stories": "Истории",
"video": "Видео"
},
"legend": {
"band": "Интернет в стране (Всемирный банк)",
"hide": "Скрыть легенду",
"modeMen": "Интернет: мужчины",
"modeWomen": "Интернет: женщины",
"modeZero": "Ничего на родном языке",
"nfhs": "Только Индия: доля женщин или мужчин 15–49 лет, когда-либо пользовавшихся интернетом, по штатам. NFHS-5, 2019–21. Для Китая нет проверенного источника по провинциям.",
"pins": "На их родном языке",
"provinces": "Индия и Китай по провинциям",
"show": "Легенда"
},
"level": {
"bridge": "Ничего на родном языке · только мост",
"own": "Что-то на родном языке",
"zero": "Ничего на родном языке · пути пока нет"
},
"listChip": "Список народов, выбранный этой страницей",
"loadError": "Данные панели не загрузились.",
"map": {
"aria": "Карта народов, закрашенная по доле пользователей интернета в каждой стране"
},
"notice": {
"pin": "Точка показывает, где этот народ живёт в стране ({country}), а не город.",
"pins": "Точка показывает, где народ живёт в своей стране, а не город. Групп, делящих точку с другой группой: {n}.",
"shares": "Делит точку с другими группами: {n}.",
"sources": "Источники:",
"standing": "Точки приблизительны (где народ живёт в своей стране, а не город). Данные об интернете относятся к стране или индийскому штату, а не к группе. «Найдено» значит найдено в проверенных источниках."
},
"panel": {
"charts": "Диаграммы",
"filters": "Фильтры",
"grid": "Группы",
"map": "Карта"
},
"strength": {
"moderate": "средний",
"strong": "сильный"
},
"title": "Доступ к Евангелию через интернет",
"view": {
"aria": "Вид",
"board": "Панель",
"platforms": "Платформы",
"province": "Индия и Китай по провинциям",
"zero": "Ничего на родном языке"
},
"wayIn": {
"bridge": "Язык-мост",
"candidate": "Язык-кандидат",
"candidateText": "{lang} (кандидат, {pct} % страны)",
"deaf": "Мост на жестовом языке",
"deafText": "{lang} (жестовый язык)"
}
}

View file

@ -0,0 +1,171 @@
{
"band": {
"no": "上网率低于 25%",
"nodata": "无数据",
"partial": "上网率 25–59%",
"yes": "上网率 60% 或以上"
},
"charts": {
"accessByBand": "母语资源情况,按国家互联网使用率",
"aria": "图表",
"bandCaveat": "互联网使用率是国家的数字(世界银行),不是该族群的数字。",
"groups": "族群",
"groupsN": "{n} 个族群",
"measure": "统计",
"messagingTop": "各国(当前范围)最主要的通讯应用",
"notMeasured": "未统计",
"people": "人数",
"peopleN": "{n} 人",
"socialTop": "各国(当前范围)最主要的社交平台",
"unitCountries": "个国家",
"unitGroups": "个族群",
"unitPeople": "人",
"zeroByBand": "母语中一无所有,按国家互联网使用率",
"zeroCaveat": "每一个都有进入途径:桥梁语言、候选语言或手语桥梁。"
},
"col": {
"access": "母语资源",
"band": "互联网等级",
"bridgeTraining": "培训(桥梁语言)",
"country": "国家",
"deafPublisher": "手语出版方",
"internet": "国家上网率",
"internetYear": "年份",
"language": "语言",
"messaging": "最主要的通讯应用(国家,iOS)",
"mobile": "每百人移动用户",
"platform": "主要平台(国家)",
"praying": "代祷人数",
"province": "邦 / 省(大约)",
"resources": "已找到的资源",
"stateMen": "邦上网率:男性",
"stateWomen": "邦上网率:女性",
"training": "培训(母语)",
"translatedBy": "译者",
"wayIn": "进入途径"
},
"detail": {
"hear": "能看或能听,不能读",
"none": "未找到",
"read": "能读",
"read_watch": "能读能看",
"stories": "仅有故事"
},
"drawer": {
"approx": "大约",
"bridgeHas": "以桥梁语言",
"conn": "网络连接",
"copied": "链接已复制",
"copyLink": "复制此族群的链接",
"deafLink": "手语圣经",
"foundNote": "在已查阅的来源中找到。",
"messaging": "通讯应用(iOS 下载)",
"mobileNote": "每百人签约数({year});一人可能有多个。",
"nfhsNote": "NFHS-5,2019–21,15–49 岁:这是该邦的数字,不是族群的数字。",
"noFeed": "该国不在苹果的数据源中:这里不知道它的通讯应用,并不表示没有。",
"noneNote": "在已查阅的来源中未找到他们母语的任何资源。这并不表示不存在任何资源。",
"own": "以他们的母语",
"people": "{n} 人",
"platformNote": "该国已追踪社交平台带来的网页流量占比(StatCounter)。WhatsApp 等即时通讯应用未被统计。",
"platforms": "该国的平台",
"praying": "{n} 人在 DOXA 上代祷",
"social": "社交平台(网页引荐)",
"stateOnline": "{state}:曾经使用过互联网",
"way": "进入途径",
"wayIn": "进入途径",
"wayNote": "这是邻近语言,不是建议:一个族群是否会说,需要由当地的人来回答。",
"wbSource": "世界银行,{year}:国家的数字",
"womenMen": "女性 {w} · 男性 {m}"
},
"facet": {
"access": "以他们母语的资源",
"all": "显示全部 {n} 项",
"aria": "筛选",
"band": "国家互联网使用率",
"bandNote": "国家的数字(世界银行),不是族群的数字。",
"country": "国家",
"fewer": "收起",
"find": "查找…",
"findIn": "在“{what}”中查找",
"language": "语言",
"messaging": "最主要的通讯应用(国家)",
"messagingNote": "该国苹果 App Store 中下载最多的应用:仅限 iOS,是下载排名,不是使用情况。",
"province": "印度和中国:邦或省",
"provinceNote": "大约:按族群所在地放置,不是城镇。",
"region": "地区",
"religion": "宗教",
"wayIn": "母语一无所有时的进入途径"
},
"grid": {
"aria": "当前范围内的族群",
"columns": "列",
"count": "{total} 个族群中的 {n} 个",
"empty": "没有符合这些筛选条件的族群。",
"exported": "已导出 {n} 行(已复制并下载)。",
"selectRow": "选择 {name}"
},
"headline": {
"a": "{total} 个族群中有 {zero} 个在母语中一无所有;",
"b": "其中 {online} 个生活在 60% 或以上人口使用互联网的国家。"
},
"kind": {
"audio": "音频",
"film": "影片",
"scripture": "圣经",
"stories": "故事",
"video": "视频"
},
"legend": {
"band": "国家互联网使用率(世界银行)",
"hide": "隐藏图例",
"modeMen": "互联网:男性",
"modeWomen": "互联网:女性",
"modeZero": "母语中一无所有",
"nfhs": "仅限印度:各邦 15–49 岁女性或男性中曾使用互联网的比例。NFHS-5,2019–21。中国没有经核实的省级来源。",
"pins": "以他们的母语",
"provinces": "印度和中国(按省)",
"show": "图例"
},
"level": {
"bridge": "母语中一无所有 · 仅有桥梁",
"own": "母语中有资源",
"zero": "母语中一无所有 · 尚无进入途径"
},
"listChip": "本页面选定的族群名单",
"loadError": "看板的数据未能加载。",
"map": {
"aria": "族群地图,按各国互联网使用程度着色"
},
"notice": {
"pin": "圆点标示该民族在{country}的所在地区,而不是某个城镇。",
"pins": "圆点标示一个民族在其国家的所在地区,而不是某个城镇。有 {n} 个族群与其他族群共用一个点。",
"shares": "它与另外 {n} 个族群共用这个点。",
"sources": "来源:",
"standing": "圆点是大约位置(民族在其国家的所在地区,不是城镇)。互联网数字是国家或印度某邦的,不是族群的。“找到”是指在已查阅的来源中找到。"
},
"panel": {
"charts": "图表",
"filters": "筛选",
"grid": "族群",
"map": "地图"
},
"strength": {
"moderate": "中等",
"strong": "强"
},
"title": "通过互联网接触福音",
"view": {
"aria": "视图",
"board": "看板",
"platforms": "平台",
"province": "印度和中国(按省)",
"zero": "母语中一无所有"
},
"wayIn": {
"bridge": "桥梁语言",
"candidate": "候选语言",
"candidateText": "{lang}(候选,占全国 {pct}%)",
"deaf": "手语桥梁",
"deafText": "{lang}(手语)"
}
}

View file

@ -17,7 +17,7 @@ export function pointOf(r) {
const lat = c ? c[1] : (p.latitude ?? p.lat), lng = c ? c[0] : (p.longitude ?? p.lng ?? p.lon)
return Number.isFinite(Number(lat)) && Number.isFinite(Number(lng)) && lat !== '' && lng !== '' ? [Number(lat), Number(lng)] : null
}
const nameOf = (r) => { const p = (r && (r.properties || r)) || {}; return p.name || p.peopleName || p.PeopNameInCountry || '' }
export const nameOf = (r) => { const p = (r && (r.properties || r)) || {}; return p.name || p.peopleName || p.PeopNameInCountry || '' }
/** Build once per roster: Map<coordinate key, names[]>, plus `byName` (name -> [[lat, lng, key]]). */
export function buildColocationIndex(rows) {

View file

@ -102,10 +102,12 @@
"check:translator-contacts:poison": "node internal/check-translator-contacts.mjs --poison",
"check:heartbeat": "node internal/check-heartbeat-threshold.mjs",
"check:heartbeat:self-test": "node internal/check-heartbeat-threshold.mjs --self-test",
"check:hover-channel": "node plugin-designs/research-map-plus-grid/scripts/check-hover-channel.mjs",
"check:host-locale-contract": "node internal/check-host-locale-contract.mjs",
"check:i18n-keys-exist": "node plugin-designs/research-map-plus-grid/scripts/check-i18n-keys-exist.mjs",
"check:i18n-never-translated": "node internal/check-i18n-never-translated.mjs",
"check:i18n-parity": "node internal/check-i18n-parity.mjs",
"check:i18n-stopped-scope": "node internal/check-i18n-stopped-scope.mjs",
"check:i18n-treeshake": "node internal/check-i18n-treeshake.mjs",
"check:kit-options-reachable": "node plugin-designs/research-dashboard/scripts/check-kit-options-reachable.mjs",
"check:kpi-unit": "node internal/check-kpi-unit-once.mjs",
@ -230,7 +232,7 @@
"dev": "bun x vite",
"fix:sri": "node internal/fix-sri.mjs",
"gallery": "node internal/generate-gallery.mjs",
"gates:post": "node internal/run-parallel.mjs --label=post -- check:drop check:parse verify check:sri check:public-hygiene check:label-joins check:facet-cascade check:facet-one-field check:heartbeat check:kpi-unit check:composite-reg check:descriptions check:no-abs-paths check:no-codename check:dep-names check:composite-srcs check:embed-targets check:nested-token check:i18n-parity check:tabs-localized check:packets-all check:packet-strings-parity check:zone-census check:share-policy check:library-index check:csv-shape check:capability-citations check:catalog-identity check:no-orphan-gates check:quoted-scripts check:done-evidence check:script-flags check:backlog-status check:capability-exemplars check:packet-fixture check:packet-browser check:provider-switch check:locale-reachable check:url-resolver check:manifest-covers check:one-palette check:pin-dim-slider check:legend-source check:backlog-refs check:clustering-modes check:composite-embed-knobs check:composite-locale-leaks check:linked-vocabulary check:wp-embed check:dashboard-geocoder-provider check:leaf-engine-per-provider check:map-props-unit check:composites-mount check:composite-interop check:no-free-identifiers check:map-fly-reduced-motion check:mst-clustering check:list-prop-unit check:profiles-mount check:cdn-pins check:no-eval check:popup-escaping check:i18n-treeshake check:pinned-umd check:one-palette:self-test check:no-cross-plugin-imports check:no-cross-plugin-imports:self-test check:map-attribution check:studio-rail check:approx-pin-note check:embedder-keys check:provider-for check:legend-logical-insets check:legend-logical-insets:self-test check:optional-t-equivalence check:text-highlight check:religion-label-not-value",
"gates:post": "node internal/run-parallel.mjs --label=post -- check:drop check:parse verify check:sri check:public-hygiene check:label-joins check:facet-cascade check:facet-one-field check:heartbeat check:kpi-unit check:composite-reg check:descriptions check:no-abs-paths check:no-codename check:dep-names check:composite-srcs check:embed-targets check:nested-token check:i18n-parity check:tabs-localized check:packets-all check:packet-strings-parity check:zone-census check:share-policy check:library-index check:csv-shape check:capability-citations check:catalog-identity check:no-orphan-gates check:quoted-scripts check:done-evidence check:script-flags check:backlog-status check:capability-exemplars check:packet-fixture check:packet-browser check:provider-switch check:locale-reachable check:url-resolver check:manifest-covers check:one-palette check:pin-dim-slider check:legend-source check:backlog-refs check:clustering-modes check:composite-embed-knobs check:composite-locale-leaks check:linked-vocabulary check:wp-embed check:dashboard-geocoder-provider check:leaf-engine-per-provider check:map-props-unit check:composites-mount check:composite-interop check:no-free-identifiers check:map-fly-reduced-motion check:mst-clustering check:list-prop-unit check:profiles-mount check:cdn-pins check:no-eval check:popup-escaping check:i18n-treeshake check:pinned-umd check:one-palette:self-test check:no-cross-plugin-imports check:no-cross-plugin-imports:self-test check:map-attribution check:studio-rail check:approx-pin-note check:embedder-keys check:provider-for check:legend-logical-insets check:legend-logical-insets:self-test check:optional-t-equivalence check:text-highlight check:religion-label-not-value check:i18n-stopped-scope",
"gates:pre": "node internal/run-parallel.mjs --label=pre -- check:template-literal check:mjs-parse check:sfc-parse check:tab-radius check:synced-css check:doc-scripts",
"internet:adm1": "node plugin-designs/cities-internet/scripts/build-adm1-internet.mjs",
"library-index": "node internal/generate-library-index.mjs",
@ -332,9 +334,11 @@
"check:gospel-all": "EVERYTHING gospel-resources owns, in one command. Its ten gates were all hand-run, which is how a dead bundle shipped: a duplicate module killed all five leaves and the one gate run that day was pointed at the map. check:no-orphan-gates was right that they were reachable — reachable is not run. Deliberately NOT in gates:pre/post: three need a browser, the shared wave holds browser gates under load, and a bundle owner should not be able to slow everyone else's build by adding to a list they do not own. Static gates run first and stop the run on failure, so a scarce browser slot is never spent confirming a table is inconsistent. Exit 75 = NOT MEASURED, never folded into a pass.",
"check:heartbeat": "the HEARTBEAT ZONE threshold (the choropleth's top bin) must come from config AND the shipped config must still render today's ramp. Two sides: (B) a configured threshold must MOVE the edge — catches re-hard-coding; (A2) dashboard.config.js's own map.* must still resolve to 5/20/60/150/Infinity — catches the shipped default silently changing. A2 was MISSING at first and heartbeatThreshold:999 shipped past this gate printing 'default ramp unchanged'. A grep for '150' cannot do either job: it false-positives on the legitimate default and false-negatives on a re-hard-coding at 200. run check:heartbeat:self-test for the NEGATIVE tests (3 cases).",
"check:heartbeat:self-test": "THREE regression cases, each required to fire ITS OWN assertion: [literal] resolver replaced by the old hard-coded array -> B; [shipped-default] dashboard.config.js heartbeatThreshold changed -> A2; [shipped-mode] heartbeatMode flipped to quantile -> A2. Poisons IN MEMORY, never the file. Testing that the FEATURE works is not testing that the REGRESSION is caught — this gate shipped with only the first and missed the second.",
"check:hover-channel": "SPEC-DASHBOARD-KIT D3: the bus's third coordinated channel points at a record without committing to one. Hover looks like a weaker selection, and the cheap implementation is to put the key in selectionSet 'just while hovering' - every consequence of which is bad and none obvious at the call site: useSelectionCamera watches selectionVersion, so a hover would fly the camera at every mousemove (the resize-strobe class, on a photosensitive the agent); the CSV exporter reads selection > filter > all, so a hover would change what an export contains; the table's selection pill and the shell's live region would both narrate the pointer. Runs the real bus: hover holds its own ref, never enters the selection, never bumps the version, never touches the filters, a repeat emits once (hover fires on every mousemove across 2,107 rows), and the three channels clear independently. Does NOT check which panels light up - D3 says panels opt in, and the first opt-in belongs with a consumer that has a reason. No browser.",
"check:host-locale-contract": "a HOST's profile-config.locale reaches every leaf: each leaf page is loaded with ONLY \"locale\":\"ar\" added to its profile-config (no ?lang=, the page keeps lang=\"en\") and must draw at least half the Arabic text the same page draws at ?lang=ar. regions-dashboard/regions-list is the positive control (NOT MEASURED if it does not enter Arabic). Guards ProfileLoader's inject('appI18n'): a bundle that never provides appI18n silently ignores the host. --dir <tree> for a before/after, --only a/b,c/d to narrow. Through browser-slot.sh.",
"check:i18n-keys-exist": "every literal catalogue key named in code exists in library/i18n/locales/en/. A localized CALL SITE is not a localized STRING: the dashboard's five resize handles all read T('aria.resizeFiltersRail', ...) and look correct in review, while aria.json held eleven keys and not one was a resize key - so every handle announced itself in English in all eleven locales, and the fallback that makes a missing key degrade to readable English is exactly what kept it silent. No other gate asks this: i18n-parity is satisfied because the key is missing from ALL locales equally, and english-leaks and composite-locale-leaks both need the catalogue to HOLD the string before an appearance counts as a leak. Matches tStatic/$t/t and the house-pattern T( alias, all of which take a full dotted key; prefix helpers like L( and any concatenated or template-literal key are COUNTED as unresolved and never guessed at. Found 22 missing keys on its first run.",
"check:i18n-never-translated": "a key PRESENT in all 11 catalogs but IDENTICAL in all of them is copied, not translated. check:i18n-parity asserts presence; presence and translatedness are different properties. Carries an allowlist for keys correctly identical everywhere (pure format strings, brand names, ISO designations) — each with a reason, so the list records decisions rather than silencing findings.",
"check:i18n-stopped-scope": "createAppI18n() must succeed while a STOPPED effect scope is current: the agent's P0 (Plugin Studio gallery, every tab after the first threw 'SyntaxError: Unexpected error' from createI18n, because Vue 3.5 makes a new scope inactive under a stopped one). A bare createI18n() in the same scope must throw first, or the harness proves nothing. Also asserts a bundle's second provide('appI18n') raises no warning.",
"check:i18n-treeshake": "each built bundle carries every translation area its code asks for: every area-prefixed key literal in <bundle>.js belongs to an area the build included (the build narrows library/i18n's catalogue glob per bundle, internal/i18n-areas.mjs). Headless.",
"check:kit-options-reachable": "every option a shared kit composable ACCEPTS must be honoured somewhere in its body. Written because I nearly shipped one: kit landing 3 gave useSelectionCamera a `coords` option so a dashboard whose rows spell their coordinate differently could say so, and it was accepted in the signature and never passed to selectionBounds - a caller could set it, type-check clean, build clean and watch it do nothing. That is the worst shape a missing feature takes, because it READS as supported and nobody files a bug against a knob they assume they misused; this tree already paid for it once with a defineProps on a component the custom element never binds. It matters more for the kit than for one dashboard: the whole promise of SPEC-DASHBOARD-KIT is that a config produces a working dashboard, and a parameter that is merely present turns that promise into a guess. Strips comments from BOTH the signature and the body before searching - the first version was satisfied by the comment beside the fixed call site, and the second read comment prose as option names. Not a type checker: it catches a completely unused option, which is the failure invisible from outside.",
"check:language-code-link": "the map's language selection reaches the grid as a locale-stable CODE, or narrows nothing at all. rega measured Languages > Language > \"Arabic\" taking the grid 2,107 -> 0 in BOTH locales: the emitter looked for a row whose language LABEL equalled the selected name, but a language tier's label is derived by splitting the API label at the comma, and no row reads \"Arabic\" - they read \"Arabic, Sudanese\", \"Arabic, Levantine\", 22 codes in all. Lifts the emitter's match rule and the composite's gridLanguage() from the shipping source (never re-typed) and runs them against a committed fixture of the 864 distinct language label/value pairs: the emitter's rule must agree with the legend's own three-arm filter on every (label, tier) pair, every tier must select at least one row, a tier covering one code must emit it, a tier covering several must emit NONE and leave the axis unfiltered. No network, no browser; --refresh-fixture re-takes the fixture.",

View file

@ -102,26 +102,27 @@ const mapProvider = resolveMapProvider(profileConfig)
const assetsBase = computed(() => resolveAssetsBase(profileConfig?.value || {}))
// ─── Words (library/i18n/locales/<lc>/allPeopleGroups.json, all 11 locales) ────
// Guarded like FilterDropdown: ProfileLoader installs vue-i18n for this profile, but an unguarded
// useI18n() throws on any host without it, and this map must never go blank over a label.
const EN = { title: 'All People Groups', locations: '{n} group–country locations', doxa: 'DOXA people groups',
frontier: 'Frontier — nothing started', unreached: 'Unreached — work beginning', reached: 'Reached — church is there',
hint: 'Click a row to see all of them · click again for everything', loading: 'Loading every people group…',
loadError: 'The map could not be loaded.', pray: 'Pray for them →', population: 'pop {n}' }
// The English for these eleven strings lives in library/i18n/locales/en/allPeopleGroups.json and
// nowhere else. An inline EN map used to duplicate it here as the bare-host fallback; with the
// locale-honouring default that copy had no job left, and a second copy of a catalogue is only a
// place for the two to drift apart.
// C4 wave 3d: the guard is library/composables/useOptionalI18n now — this site needs more than `t`,
// so it takes the {t, te, locale} form rather than useOptionalT.
// ★ EN STAYS THE FALLBACK, passed in. It is an inline English map, not the catalogue, so routing this
// to tStatic would change what a bare host renders. gospel-plugin and exp-shepherd each CHOSE the
// locale-honouring default for their own bundles; all-people-groups has no owner to ask
// (studio agreed to treat it as unowned), so the conservative reading wins: preserve what it renders.
// ★ THE LOCALE-HONOURING FALLBACK, per dx-shepherd's ruling (2026-09-27) and the agent's goal (d):
// a BARE-HOST EMBED WITH ?lang=ar MUST RENDER ARABIC. Recorded in COMMON.md as the embed contract.
// This file used to pass its inline EN map as the fallback, which served ENGLISH to exactly the hosts
// that cannot install vue-i18n — the seven bundles here that install none. tStatic honours the runtime
// locale and keeps English as the last resort, so those readers now get their own language.
// ★ THE RULING'S CONDITION WAS MEASURED BEFORE THE SWITCH, not after: all ELEVEN keys this file uses
// are present in all ELEVEN locales (0 gaps, counted 2026-09-27), and ar differs from en on 11 of 11,
// so the change is observable rather than cosmetic. With the catalogue complete there is nothing the
// EN map could still rescue: a key it holds is a key tStatic also holds.
// The keys arrive BARE here ('hint', 'pray'), and qualify() adds the 'allPeopleGroups.' prefix, which
// is exactly what the hand-written `const full = 'allPeopleGroups.' + key` did.
// ★ ONE EQUIVALENCE WORTH STATING: the old code asked te() first and only then t(). The helper calls
// t() and falls back when it returns the key unchanged. Same outcome both ways — present key: the
// translation; absent key: EN — and it no longer depends on te() being implemented.
const { t: tr, locale: i18nLocale } = useOptionalI18n('allPeopleGroups', {
fallback: (full) => EN[String(full).replace(/^allPeopleGroups\./, '')]
})
const { t: tr, locale: i18nLocale } = useOptionalI18n('allPeopleGroups')
// locale arrives as a REF when the host installed i18n and a plain string when it did not
// (PosterWall.vue records the same variance), so unwrap both shapes.
const uiLocale = computed(() => {

View file

@ -2282,13 +2282,20 @@ function emitFilterState() {
// transient fills in and is reported correctly. The retries are bounded so a clear can never be
// swallowed, only delayed.
const isEmpty = !detail.region && !detail.religion && !detail.language && !detail.languageCode
if (isEmpty && _lastEmitWasFilled && _emptyRetries < EMPTY_RETRIES) {
_emptyRetries++
clearTimeout(_emitTimer)
_emitTimer = setTimeout(emitFilterState, EMIT_SETTLE_MS)
return
if (isEmpty && _lastEmitWasFilled) {
const now = (typeof performance !== 'undefined' ? performance.now() : Date.now())
if (!_emptyWaitStartedAt) _emptyWaitStartedAt = now
if (now - _emptyWaitStartedAt < EMPTY_SETTLE_CEILING_MS) {
// Still inside the window in which an empty read is more likely to be the cascade than the
// reader. Re-read rather than believe it; the condition that ends this is the state becoming
// non-empty, not a count running out.
clearTimeout(_emitTimer)
_emitTimer = setTimeout(emitFilterState, EMIT_SETTLE_MS)
return
}
// The ceiling passed and it is still empty: the reader cleared it. Report that.
}
_emptyRetries = 0
_emptyWaitStartedAt = 0
_lastEmitWasFilled = !isEmpty
host.dispatchEvent(new CustomEvent('map-filtered', { detail, bubbles: true, composed: true }))
}
@ -2315,8 +2322,19 @@ const EMIT_SETTLE_MS = 60
// genuine clear must always get through, and the worst case here is EMPTY_RETRIES * EMIT_SETTLE_MS
// of delay on a clear — about a fifth of a second, well under what a reader notices, and far below
// the composite's own 1.2s push window so it cannot collide with that.
const EMPTY_RETRIES = 3
let _emptyRetries = 0
// ★ A CEILING ON BELIEVING A CLEAR — NOT A GUESS AT HOW LONG THE CASCADE TAKES.
// rega, row 43 case 3 at 835ec1ac: the retry budget catches the transient on MapLibre and NOT
// reliably on Mapbox (and not at all in ar/mapbox), because 3 x 60ms is still a duration I picked
// without being able to measure the thing it has to outlast. That is the THIRD time I have tuned a
// number on one machine for this one defect, so the number's JOB changes rather than its value.
//
// Before: "wait long enough for the cascade to finish" — unknowable from here, and wrong on any
// machine slower than mine. Now: "keep re-reading until the state is non-empty, and if it is STILL
// empty after this long, the reader really did clear it." Too long merely delays a clear by an
// amount no one perceives; too short reintroduces the bug. So it errs generous, and it stays under
// the composite's 1.2s push window so the two cannot interact.
const EMPTY_SETTLE_CEILING_MS = 900
let _emptyWaitStartedAt = 0
// Whether the LAST report actually carried a selection. Only then is an empty read suspicious: on
// first load, or after a clear that has already been reported, empty is simply the truth.
let _lastEmitWasFilled = false
@ -2338,7 +2356,7 @@ function emitFilterStateSettled() {
// So the decision is taken here, at schedule time, where the flag still means what it says: a
// change that arrived from the host is not a change the reader made, and is not reported back.
if (applyingExternal) return
_emptyRetries = 0 // a fresh user action restarts the budget
_emptyWaitStartedAt = 0 // a fresh user action restarts the window
clearTimeout(_emitTimer)
_emitTimer = setTimeout(emitFilterState, EMIT_SETTLE_MS)
}

View file

@ -271,11 +271,17 @@ if (matchesLanguage) {
const src = emitterSrc
if (!/_lastEmitWasFilled/.test(src) || !/const isEmpty/.test(src)) {
fails.push('G research-map.vue no longer guards an all-empty report. A dialect click passes through a fully-cleared store state, so the settled read can be taken mid-cascade and ship {language:"",languageCode:""} — which the composite correctly reads as "the reader cleared everything".')
} else if (!/_emptyRetries\s*<\s*EMPTY_RETRIES/.test(src)) {
fails.push('G the empty guard is not BOUNDED — without a retry ceiling a genuine clear is deferred for ever and the grid can never be un-narrowed.')
} else if (!/_emptyRetries = 0/.test(src)) {
fails.push('G the retry budget is never reset, so the guard protects only the first cascade of a session.')
} else notes.push('empty guard: a mid-cascade read is re-taken, a real clear still gets through')
} else if (!/EMPTY_SETTLE_CEILING_MS/.test(src)) {
// ★ THE BOUND'S SHAPE CHANGED AND THE INVARIANT DID NOT. It used to be a retry COUNT; rega
// measured that 3 x 60ms catches the cascade on MapLibre and not on Mapbox, so the count became
// a TIME CEILING — the difference being what the number is FOR. A count is a guess at how long
// the cascade takes, which cannot be known from here; a ceiling is how long before a clear is
// believed, which is a choice. What must never change is that SOME bound exists: without one a
// genuine clear is deferred for ever and the grid can never be un-narrowed.
fails.push('G the empty guard is not BOUNDED — without a ceiling a genuine clear is deferred for ever and the grid can never be un-narrowed.')
} else if (!/_emptyWaitStartedAt = 0/.test(src)) {
fails.push('G the wait window is never reset, so the guard protects only the first cascade of a session.')
} else notes.push('empty guard: re-read until the state fills, with a ceiling before a clear is believed')
}
// ── H. the echo guard survives the coalescing ────────────────────────────────────────────────

View file

@ -27,6 +27,15 @@
// off such a file once gave (0,5,53) because a comment landed inside the selector.
// - HTML comments in a .vue TEMPLATE. `<!-- ... -->` is invisible here, so any identifier quoted in
// one is counted as code. That made a bare-useI18n census read 3 where the code had 2.
// - A LONG SFC CAN DESYNCHRONISE IT. Measured 2026-09-27 in all-people-groups.vue: `tr('pray')` inside
// a template literal was lost, because the `//` of an `https://` URL in that template was read as a
// line comment -- the scanner had already lost template state somewhere earlier in a 1000+ line file.
// The narrow cases all pass (a backtick template, a URL in a template, a nested ${} with a quote, a
// regex holding a quote), so this is an accumulation problem, not one of those.
// ★ THE RULE THAT FOLLOWS: when the question is "does X exist anywhere", prefer RAW source. Over-
// including a commented-out hit makes a check STRICTER (a false red, cheap). Under-including a real
// hit makes it claim completeness it does not have (a false green, expensive). Only use this stripper
// when a comment mentioning the pattern would be a FALSE POSITIVE you cannot tolerate.
// gospel-plugin's generalisation, worth keeping: "any <!-- --> in a template that quotes an identifier
// will keep doing that to you". THE RULE: the stripper must match the LANGUAGE of the text being read.
// For a .vue file, strip HTML comments first, then call this for the script block.

View file

@ -81,6 +81,44 @@ if (!existsSync(ENGINE)) { console.log(`${TAG}: SKIP — no ${ENGINE.replace(ROO
}
}
// ── D. the drag mirrors under RTL, and the keyboard agrees with it ───────────────────────────
// go-int, 2026-09-27: the x delta was computed once, in LTR. Under dir=rtl the grid mirrors — the
// facet rail sits on the RIGHT — so dragging its handle toward the map moves clientX the other way,
// and in Arabic the facet handle shrank the CHARTS rail. It reaches Big Picture in ar, not only a
// new consumer. The keyboard path is asserted too: if only the pointer mirrored, the two input
// methods would disagree about which way widens, and aria-valuenow would announce the wrong
// direction to someone who cannot see the drag.
{
const src = readFileSync(ENGINE, 'utf8')
const code = src.split('\n').filter((l) => !/^\s*(\/\/|\*|\/\*)/.test(l)).join('\n')
if (!/direction === 'rtl'/.test(code)) {
fails.push('D useDashboardLayout never reads the computed direction, so the drag cannot mirror: in ar the facet handle moves the wrong rail.')
} else {
if (!/startFacet \+ xSign \* \(ev\.clientX - startX\)/.test(code) || !/startRail - xSign \* \(ev\.clientX - startX\)/.test(code)) {
fails.push('D the pointer drag does not apply the direction sign to BOTH widths — mirroring one and not the other is worse than mirroring neither, because the two handles then disagree.')
}
if (!/kSign/.test(code)) {
fails.push('D the arrow keys do not follow the direction sign, so keyboard and pointer disagree about which way widens under rtl.')
}
if (!fails.some((f) => f.startsWith('D'))) notes.push('drag: mirrors under rtl, pointer and arrows share one sign')
}
}
// ── E. the legacy read-through applies ONLY to the default key ───────────────────────────────
// My own regression from kit landing 2: I added the read-through so namespacing would not discard a
// saved layout, and applied it unconditionally — so a caller passing its OWN key, which is the whole
// point of namespacing, inherited Big Picture's widths. The migration meant to protect one
// dashboard's layout was handing it to every other dashboard.
{
const src = readFileSync(ENGINE, 'utf8')
const code = src.split('\n').filter((l) => !/^\s*(\/\/|\*|\/\*)/.test(l)).join('\n')
if (/getItem\(storageKey\) \|\| localStorage\.getItem\(LEGACY_SHARED_KEY\)/.test(code)) {
fails.push('E the legacy key is read even when the caller passed its own storageKey, so a second dashboard inherits the first one\'s layout. Gate it on storageKey === DEFAULT_STORAGE_KEY.')
} else if (!/storageKey === DEFAULT_STORAGE_KEY/.test(code)) {
fails.push('E the legacy read-through is not gated on the default key — either it is gone (a reader loses their layout) or it is gated on something this gate cannot see.')
} else notes.push('legacy read-through: only for the default key')
}
for (const n of notes) console.log(' · ' + n)
if (fails.length) {
console.error(`\n${TAG}: FAIL`)

View file

@ -23,11 +23,11 @@
* responsive switch, collapsible table dock, segmented mobile view, and the location.hash sync.
* Only the SOURCE of the per-dashboard constants changed: from hard-coded → config.
*/
import { exactMatches, fuzzyMatches, resolveFuzzyValues } from '@map/components/search/fuzzy.js'
import { provide, inject, ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'
import { createSelectionBus } from '@map/composables/useSelectionBus.js'
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '@map/composables/useDashboardSearch.js'
import { useDashboardData } from './useDashboardData.js'
import { useCsvExport } from '@map/composables/useCsvExport.js'
import { useCsvExport } from './useCsvExport.js'
import { useTreeLegendLabels } from './useTreeLegendLabels.js'
import { DataSourceManager } from '@map/api/DataSourceManager.js'
import sourcesConfig from '@map/api/sources.json'
@ -40,80 +40,12 @@ const mapValues = (obj, fn) =>
// number formatter (same as the old inline `fmt`); exported for the profile's KPI strip.
export const fmt = (n) => (n === null || n === undefined ? '—' : Number(n).toLocaleString('en-US'))
/**
* Build the free-text search accessors for a dashboard config (header-1 search bar).
* config.searchKeys (facet keys) → those facet accessors; else the string columns' accessors.
* ONE declaration reused by the shell (KPIs) AND every panel (table/map/charts/facets) so the
* searchable text can never drift from what the panels show, and the substring match is not
* copy-pasted into each panel (kills the very duplication DOXA-LIB-2 removed).
*/
export function buildSearchAccessors(config) {
const FACET_ACC = mapValues(config.facets, (f) => f.get)
const COL_ACC = Object.fromEntries((config.columns || []).map((c) => [c.key, c.get]))
const keys = Array.isArray(config.searchKeys) ? config.searchKeys : null
if (keys) return keys.map((k) => FACET_ACC[k] || COL_ACC[k]).filter((fn) => typeof fn === 'function')
return (config.columns || []).filter((c) => c.type !== 'num' && typeof c.get === 'function').map((c) => c.get)
}
/**
* Reusable predicate: does `row` match the bus's current free-text search term?
* Returns true when there is no term (identical to pre-search behaviour). `accessors` is the
* array from buildSearchAccessors(config). Case-insensitive substring over each accessor's value.
*/
export function makeSearchMatcher(bus, accessors) {
// ★ FUZZY, NOT SUBSTRING (the agent 2026-09-23: "add an n to the end of a country name" must
// still find it -- check what DX-life's search bar bakes in). DX-life runs real Fuse.js with
// { threshold: 0.4, ignoreLocation: true, minMatchCharLength: 3 } (UupgsList.vue:288), so its
// search tolerates typos. This matcher was a plain .includes() -- the one search surface that
// silently lost that behaviour in the migration (measured: 'Bhutan' 13 rows, 'Bhutann' 0).
// It now delegates to the shared fuzzyMatches() in @map fuzzy.js -- the same matcher the
// grid's Fuse uses -- with the same DX-life options, so every search surface agrees.
// Row-level predicates for the TIERED contract (see fuzzy.js exactMatches): the caller
// (filterRowsBySearch below) runs the exact tier over the whole row set first and falls back
// to the fuzzy tier only when exact yields nothing, so an exact term agrees with the facet.
const test = (row, pred) => {
const needle = (bus?.searchTerm?.value || '').trim()
if (!needle) return true
for (const acc of accessors) {
const v = acc(row)
if (v != null && pred(String(v), needle, { threshold: 0.4, minMatchCharLength: 3 })) return true
}
return false
}
const matcher = (row) => test(row, fuzzyMatches)
matcher.exact = (row) => test(row, exactMatches)
matcher.active = () => !!(bus?.searchTerm?.value || '').trim()
matcher.term = () => (bus?.searchTerm?.value || '').trim()
matcher.accessors = accessors
return matcher
}
/**
* Apply the TIERED search to a row set:
* 1. exact substring -- an exact term returns exactly the rows the equivalent facet selects.
* 2. facet-VALUE resolution (the agent: "Austrian or Canadian... a selection of that country --
* the table under the map shows the result for that country"): the term is resolved by
* whole-value edit distance against each accessor's DISTINCT values, and the rows returned
* are those carrying a resolved value -- byte-identical to picking it as a filter.
* 3. the generic windowed fuzzy rescue, only when nothing resolves.
*/
export function filterRowsBySearch(rows, matcher) {
if (!matcher.active()) return rows
const exact = rows.filter(matcher.exact)
if (exact.length) return exact
const term = matcher.term()
// ONE pool across every accessor's distinct values, so the GLOBAL best match wins (see
// resolveFuzzyValues: ties at the minimal distance stay, everything farther drops --
// 'Canadian' resolves to Canada, not to 47 rows of <=3-edit neighbours across facets).
const distinct = new Set()
for (const acc of matcher.accessors) for (const r of rows) { const v = acc(r); if (v != null && v !== '') distinct.add(String(v)) }
const winners = new Set(resolveFuzzyValues(term, [...distinct], { threshold: 0.4 }))
if (winners.size) {
const resolved = rows.filter((r) => matcher.accessors.some((acc) => { const v = acc(r); return v != null && winners.has(String(v)) }))
if (resolved.length) return resolved
}
return rows.filter(matcher)
}
// ★ THE SEARCH MOVED OUT (kit landing 4a) AND IS RE-EXPORTED FROM HERE FOR ONE CYCLE.
// Eight files import these three names from this module; re-exporting means the move and its
// consumers do not have to land together, exactly as the composable shims did in landings 1-3.
// Unlike those, this one is a barrel line rather than a file, so there is nothing to delete later —
// only a line to remove once the eight importers point at the library directly.
export { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '@map/composables/useDashboardSearch.js'
/**
* Generic KPI computation driven by config.kpis. Each kpi def declares a `kind`:

View file

@ -0,0 +1,85 @@
#!/usr/bin/env node
/**
* check-hover-channel.mjs — hover points at a record; it must never commit to one.
*
* SPEC-DASHBOARD-KIT D3. The bus carries three coordinated channels: filterSet NARROWS scope,
* selectionSet MARKS individuals, and hoverKey POINTS at the one record under the pointer.
* kepler.gl treats hover as a configured interaction alongside filters for the same reason — it is
* how a reader sweeps a table and watches the map answer without choosing anything.
*
* WHY THIS IS GATED RATHER THAN REVIEWED. Hover looks like a weaker selection, and the cheap way to
* implement it is to put the key in selectionSet "just while hovering". Every consequence of that
* is bad and none of them are obvious at the call site:
* - selectionSet is a plain Set with a version counter, and useSelectionCamera watches that
* counter. A hover that bumped it would fly the camera at every mousemove — the resize-strobe
* bug wearing a new hat, on the agent who is photosensitive.
* - the CSV exporter reads selection > filter > all, so a hover would silently change what an
* export contains.
* - the table's selection pill and the shell's live region both report selection counts, and
* both would narrate the pointer.
* So the contract is asserted: hover is its own ref, it does not touch the selection, and a repeat
* is a no-op (hover fires on every mousemove across 2,107 rows; a channel that woke every panel on
* an unchanged value would need a debounce it should not need).
*
* NOT CHECKED: which panels light up on hover. D3 says panels opt in, and the first opt-in belongs
* with a consumer that has a reason — wiring one into Big Picture speculatively would be a visual
* change to the flagship with no reader asking for it. This gate guards the CHANNEL so the first
* panel to use it inherits the rules rather than inventing them.
*
* NEGATIVE-TESTED: routing setHover through selectionSet fails A; dropping the equality guard
* fails B; removing hoverKey from the returned surface fails the import check.
*/
import { existsSync } from 'node:fs'
import { resolve, dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
const TAG = 'HOVER-CHANNEL'
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..')
const BUS = join(ROOT, 'library/composables/useSelectionBus.js')
if (!existsSync(BUS)) { console.log(`${TAG}: SKIP — no ${BUS.replace(ROOT + '/', '')} (kit landing 1 not applied).`); process.exit(0) }
const { createSelectionBus } = await import(BUS)
const fails = []
const notes = []
const eq = (what, got, want) => { if (JSON.stringify(got) !== JSON.stringify(want)) fails.push(`${what} — got ${JSON.stringify(got)}, want ${JSON.stringify(want)}`) }
const bus = createSelectionBus()
if (!bus.hoverKey || typeof bus.setHover !== 'function') {
fails.push('the bus exposes no hoverKey/setHover — D3\'s channel is missing, and a panel wanting hover would have to invent its own, which is how selectionSet gets abused for it.')
} else {
// ── A. hover is not selection ──────────────────────────────────────────────────────────────
bus.selectMany(['keep-me'])
const versionBefore = bus.selectionVersion.value
bus.setHover('abkhaz')
eq('A hoverKey holds the record', bus.hoverKey.value, 'abkhaz')
eq('A hover does NOT enter the selection', [...bus.selectionSet], ['keep-me'])
eq('A hover does NOT bump selectionVersion (the camera watches it)', bus.selectionVersion.value, versionBefore)
eq('A hover does NOT touch the filters', Object.keys(bus.filterSet), [])
// ── B. a repeat is a no-op, and clearing is explicit ───────────────────────────────────────
let emitted = 0
bus.on('hover', () => { emitted++ })
bus.setHover('same'); bus.setHover('same'); bus.setHover('same')
eq('B three identical hovers emit once', emitted, 1)
bus.setHover(null)
eq('B null clears', bus.hoverKey.value, null)
eq('B clearing emits', emitted, 2)
bus.setHover()
eq('B a bare call means nothing hovered', bus.hoverKey.value, null)
eq('B clearing an already-clear hover is a no-op', emitted, 2)
// ── C. clearing the selection leaves hover alone, and vice versa ────────────────────────────
bus.setHover('x'); bus.clearSelection()
eq('C clearing the selection does not clear hover', bus.hoverKey.value, 'x')
bus.selectMany(['y']); bus.setHover(null)
eq('C clearing hover does not clear the selection', [...bus.selectionSet], ['y'])
if (!fails.length) notes.push('hover: its own ref, never the selection, no-op on repeat, independent of both other channels')
}
for (const n of notes) console.log(' · ' + n)
if (fails.length) {
console.error(`\n${TAG}: FAIL`)
for (const f of fails) console.error(' ✗ ' + f)
process.exit(1)
}
console.log(`${TAG}: PASS — hover points without committing.`)

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <all-people-groups> custom element. -->
<script src="../all-people-groups.js" integrity="sha384-wUgdpbqOtm89VOftSc0LWMjeu25MGgwf24IVMQcJZA/dVukVC5pffNDdVdChfI5g" crossorigin="anonymous"></script>
<script src="../all-people-groups.js" integrity="sha384-jfFp9SDomX8P8v5W8biQhRx21RclhiXRCGjjlAI+YpZo7GRxcM19586wKR6XFLbD" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

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

View file

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

View file

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

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -32,7 +32,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B" 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

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <dashboard-plus-grid> custom element. -->
<script src="../../dashboard-plus-grid.js" integrity="sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI" crossorigin="anonymous"></script>
<script src="../../dashboard-plus-grid.js" integrity="sha384-GnQZsvhBnY7KhAw6d9oa95tuVmPNdxLaDQ2dmnz/uAJ06eZSsH+ydqA0m92Gln/n" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <dashboard-plus-grid> custom element. -->
<script src="../dashboard-plus-grid.js" integrity="sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI" crossorigin="anonymous"></script>
<script src="../dashboard-plus-grid.js" integrity="sha384-GnQZsvhBnY7KhAw6d9oa95tuVmPNdxLaDQ2dmnz/uAJ06eZSsH+ydqA0m92Gln/n" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

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

View file

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

View file

@ -12,7 +12,7 @@
"bundle": "all-people-groups",
"scriptUrl": "./all-people-groups/all-people-groups.js",
"output": "dx-maps/all-people-groups/all-people-groups.js",
"integrity": "sha384-wUgdpbqOtm89VOftSc0LWMjeu25MGgwf24IVMQcJZA/dVukVC5pffNDdVdChfI5g",
"integrity": "sha384-jfFp9SDomX8P8v5W8biQhRx21RclhiXRCGjjlAI+YpZo7GRxcM19586wKR6XFLbD",
"elements": [
"all-people-groups"
],
@ -28,7 +28,7 @@
"scriptUrl": "./all-people-groups/all-people-groups.js",
"embed": {
"iframe": "<iframe src=\"./all-people-groups/all-people-groups/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-wUgdpbqOtm89VOftSc0LWMjeu25MGgwf24IVMQcJZA/dVukVC5pffNDdVdChfI5g\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-jfFp9SDomX8P8v5W8biQhRx21RclhiXRCGjjlAI+YpZo7GRxcM19586wKR6XFLbD\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
},
"bundle": "all-people-groups"
}
@ -104,7 +104,7 @@
"bundle": "cities-internet",
"scriptUrl": "./cities-internet/cities-internet.js",
"output": "dx-maps/cities-internet/cities-internet.js",
"integrity": "sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi",
"integrity": "sha384-moOP7zVwXCd+v6iDNJY80BchWdubL2lw9Kkr5QOFmwUrT7In0mGQ08xbK60Y7nw3",
"elements": [
"cities-internet-map"
],
@ -120,7 +120,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-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" 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-moOP7zVwXCd+v6iDNJY80BchWdubL2lw9Kkr5QOFmwUrT7In0mGQ08xbK60Y7nw3\" 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>"
}
},
{
@ -134,7 +134,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-moOP7zVwXCd+v6iDNJY80BchWdubL2lw9Kkr5QOFmwUrT7In0mGQ08xbK60Y7nw3\" 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>"
}
},
{
@ -148,7 +148,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-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" 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-moOP7zVwXCd+v6iDNJY80BchWdubL2lw9Kkr5QOFmwUrT7In0mGQ08xbK60Y7nw3\" 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>"
}
}
]
@ -157,7 +157,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "dx-maps/country-posters/country-posters.js",
"integrity": "sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+",
"integrity": "sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B",
"elements": [
"country-posters-map"
],
@ -177,7 +177,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B\" 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>"
}
},
{
@ -191,7 +191,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-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" 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-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B\" 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>"
}
},
{
@ -205,7 +205,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B\" 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>"
}
}
]
@ -214,7 +214,7 @@
"bundle": "dashboard-plus-grid",
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
"integrity": "sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI",
"integrity": "sha384-GnQZsvhBnY7KhAw6d9oa95tuVmPNdxLaDQ2dmnz/uAJ06eZSsH+ydqA0m92Gln/n",
"elements": [
"dashboard-plus-grid"
],
@ -234,7 +234,7 @@
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
"embed": {
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-GnQZsvhBnY7KhAw6d9oa95tuVmPNdxLaDQ2dmnz/uAJ06eZSsH+ydqA0m92Gln/n\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
},
"instances": [
{
@ -258,7 +258,7 @@
"bundle": "demo-map",
"scriptUrl": "./demo-map/demo-map.js",
"output": "dx-maps/demo-map/demo-map.js",
"integrity": "sha384-nlkZeJFDIc718FpkJlZg3vsfXphzPaOBN/fyFVhVPTUcqlEHobdqwJJete8thIUx",
"integrity": "sha384-qFYCRU5HNpCNVPNnFrdkhJsVxSdIEiM3P/yWUdib09ipuVmsw8QIgkjBjfnp1U12",
"elements": [
"demo-map"
],
@ -274,7 +274,7 @@
"scriptUrl": "./demo-map/demo-map.js",
"embed": {
"iframe": "<iframe src=\"./demo-map/demo-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-nlkZeJFDIc718FpkJlZg3vsfXphzPaOBN/fyFVhVPTUcqlEHobdqwJJete8thIUx\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></demo-map>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-qFYCRU5HNpCNVPNnFrdkhJsVxSdIEiM3P/yWUdib09ipuVmsw8QIgkjBjfnp1U12\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></demo-map>"
},
"instances": [
{
@ -353,7 +353,7 @@
"bundle": "doxa-research-map",
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
"integrity": "sha384-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy",
"integrity": "sha384-lpTZtNxg+Dx3o/dyzA/3wyMrhsnJ7j5UN9lRDGAetPzWIURhsU+gICgaitKkpRK9",
"elements": [
"doxa-research-map"
],
@ -369,7 +369,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-lpTZtNxg+Dx3o/dyzA/3wyMrhsnJ7j5UN9lRDGAetPzWIURhsU+gICgaitKkpRK9\" 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": [
{
@ -395,7 +395,7 @@
"bundle": "doxa-simple-map",
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
"integrity": "sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu",
"integrity": "sha384-khPPaUMmo37Wa8yjMa6Ptnlwn2JQdHqc+gNWI0Cje8o+JcQl1DkaGWdSYTnQOm3H",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -412,7 +412,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-khPPaUMmo37Wa8yjMa6Ptnlwn2JQdHqc+gNWI0Cje8o+JcQl1DkaGWdSYTnQOm3H\" 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": [
{
@ -578,7 +578,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "dx-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9",
"integrity": "sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+",
"elements": [
"gospel-resources-map"
],
@ -598,7 +598,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" 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-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -612,7 +612,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" 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-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -626,7 +626,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -640,7 +640,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" 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-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -654,7 +654,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" 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>"
}
}
]
@ -663,7 +663,7 @@
"bundle": "my-upg-100-list",
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"output": "dx-maps/my-upg-100-list/my-upg-100-list.js",
"integrity": "sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd",
"integrity": "sha384-IaMFwZnvFfeygMVBG1VH9jSyNM037nl0j975Nii51Ubwxi1n39GXfmImz7xtxUmk",
"elements": [
"my-upg-100-list-map"
],
@ -683,7 +683,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-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" 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-IaMFwZnvFfeygMVBG1VH9jSyNM037nl0j975Nii51Ubwxi1n39GXfmImz7xtxUmk\" 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>"
}
},
{
@ -697,7 +697,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-IaMFwZnvFfeygMVBG1VH9jSyNM037nl0j975Nii51Ubwxi1n39GXfmImz7xtxUmk\" 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>"
}
},
{
@ -711,7 +711,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-IaMFwZnvFfeygMVBG1VH9jSyNM037nl0j975Nii51Ubwxi1n39GXfmImz7xtxUmk\" 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>"
}
}
]
@ -836,7 +836,7 @@
"bundle": "pplr-data-maps",
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
"output": "dx-maps/pplr-data-maps/pplr-data-maps.js",
"integrity": "sha384-Wf5IA8IPewJbr1WvTJ6FsVRBaJUpZuhFDZalAW9v+H19fiqQ5wffns7hUc7WXdIJ",
"integrity": "sha384-JElBf9WBFzyg6e8fdUMYndILsf/pmnVvGWJUdRDJb+9eVQi4T2whmePzHOOmKsaB",
"elements": [
"pplr-data-maps"
],
@ -852,7 +852,7 @@
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
"embed": {
"iframe": "<iframe src=\"./pplr-data-maps/pplr-data-maps/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-Wf5IA8IPewJbr1WvTJ6FsVRBaJUpZuhFDZalAW9v+H19fiqQ5wffns7hUc7WXdIJ\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-JElBf9WBFzyg6e8fdUMYndILsf/pmnVvGWJUdRDJb+9eVQi4T2whmePzHOOmKsaB\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
},
"bundle": "pplr-data-maps"
}
@ -862,7 +862,7 @@
"bundle": "prayer-walk-planner",
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
"output": "dx-maps/prayer-walk-planner/prayer-walk-planner.js",
"integrity": "sha384-YGKO2e+BZTuNjfZzlWY9BdwMADy3kJrlKKjbSVYV11Gup/JjVrWyz80yUL0MdxOO",
"integrity": "sha384-N4Uk19xlK4SevPTwXX6f3eR60iavGxW5/FxONWgGO54gzhPcRoe1jOHAq6vJJuW1",
"elements": [
"prayer-walk-planner"
],
@ -878,7 +878,7 @@
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
"embed": {
"iframe": "<iframe src=\"./prayer-walk-planner/prayer-walk-planner/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-YGKO2e+BZTuNjfZzlWY9BdwMADy3kJrlKKjbSVYV11Gup/JjVrWyz80yUL0MdxOO\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-N4Uk19xlK4SevPTwXX6f3eR60iavGxW5/FxONWgGO54gzhPcRoe1jOHAq6vJJuW1\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
}
}
]
@ -887,7 +887,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-jPzA1tgpyXKF32whK/PChM00zMGVmD6lTF36H28intnDnm33WE08194L81M66f+2",
"integrity": "sha384-H+peqtuS7sf6Z3UEur8bZNng4nJME6wRo5LxUngQaetNjf6oK1bDpXmRx2htLbbl",
"elements": [
"regions-dashboard"
],
@ -907,7 +907,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-jPzA1tgpyXKF32whK/PChM00zMGVmD6lTF36H28intnDnm33WE08194L81M66f+2\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-H+peqtuS7sf6Z3UEur8bZNng4nJME6wRo5LxUngQaetNjf6oK1bDpXmRx2htLbbl\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -921,7 +921,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-jPzA1tgpyXKF32whK/PChM00zMGVmD6lTF36H28intnDnm33WE08194L81M66f+2\" 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-H+peqtuS7sf6Z3UEur8bZNng4nJME6wRo5LxUngQaetNjf6oK1bDpXmRx2htLbbl\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -935,7 +935,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-jPzA1tgpyXKF32whK/PChM00zMGVmD6lTF36H28intnDnm33WE08194L81M66f+2\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-H+peqtuS7sf6Z3UEur8bZNng4nJME6wRo5LxUngQaetNjf6oK1bDpXmRx2htLbbl\" 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>"
}
}
]
@ -944,7 +944,7 @@
"bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "dx-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai",
"integrity": "sha384-SdGOSjUe8T0R0v8vdldvqFhboAeI5MY5hGPgVakQUj4Rt/23+Y9/ub5WbCT9Rc3M",
"elements": [
"research-dashboard-map"
],
@ -960,7 +960,7 @@
"scriptUrl": "./research-dashboard/research-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-SdGOSjUe8T0R0v8vdldvqFhboAeI5MY5hGPgVakQUj4Rt/23+Y9/ub5WbCT9Rc3M\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
},
"bundle": "research-dashboard"
}
@ -1058,7 +1058,7 @@
"bundle": "upg-neighbor",
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"output": "dx-maps/upg-neighbor/upg-neighbor.js",
"integrity": "sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY",
"integrity": "sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv",
"elements": [
"upg-neighbor"
],
@ -1074,7 +1074,7 @@
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"embed": {
"iframe": "<iframe src=\"./upg-neighbor/upg-neighbor/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
},
"instances": [
{
@ -1157,7 +1157,7 @@
"bundle": "wall-of-people-groups",
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
"output": "dx-maps/wall-of-people-groups/wall-of-people-groups.js",
"integrity": "sha384-QtpkRLm9y3siKeoKTfdmG/8Xi3S+TFSzjZ8aw35zjSwe4KenMTVpgFXC3Hjc7R8U",
"integrity": "sha384-MDE1WdLqoJyCtkIsE39Aw9K6QvtlwsaZC++0EhWAGN+ywFz7z6UXYneT4Jg/XaE3",
"elements": [
"wall-of-people-groups"
],
@ -1173,7 +1173,7 @@
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
"embed": {
"iframe": "<iframe src=\"./wall-of-people-groups/wall-of-people-groups/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=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-QtpkRLm9y3siKeoKTfdmG/8Xi3S+TFSzjZ8aw35zjSwe4KenMTVpgFXC3Hjc7R8U\" crossorigin=\"anonymous\"></script>\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-MDE1WdLqoJyCtkIsE39Aw9K6QvtlwsaZC++0EhWAGN+ywFz7z6UXYneT4Jg/XaE3\" crossorigin=\"anonymous\"></script>\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
},
"bundle": "wall-of-people-groups"
}

File diff suppressed because one or more lines are too long

View file

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

View file

@ -33,7 +33,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-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy" crossorigin="anonymous"></script>
<script src="../../doxa-research-map.js" integrity="sha384-lpTZtNxg+Dx3o/dyzA/3wyMrhsnJ7j5UN9lRDGAetPzWIURhsU+gICgaitKkpRK9" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js" integrity="sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-khPPaUMmo37Wa8yjMa6Ptnlwn2JQdHqc+gNWI0Cje8o+JcQl1DkaGWdSYTnQOm3H" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js" integrity="sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-khPPaUMmo37Wa8yjMa6Ptnlwn2JQdHqc+gNWI0Cje8o+JcQl1DkaGWdSYTnQOm3H" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../doxa-simple-map.js" integrity="sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu" crossorigin="anonymous"></script>
<script src="../doxa-simple-map.js" integrity="sha384-khPPaUMmo37Wa8yjMa6Ptnlwn2JQdHqc+gNWI0Cje8o+JcQl1DkaGWdSYTnQOm3H" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js" integrity="sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-khPPaUMmo37Wa8yjMa6Ptnlwn2JQdHqc+gNWI0Cje8o+JcQl1DkaGWdSYTnQOm3H" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -32,7 +32,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -32,7 +32,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -32,7 +32,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+" 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

@ -12,7 +12,7 @@
"bundle": "all-people-groups",
"scriptUrl": "./all-people-groups/all-people-groups.js",
"output": "dx-maps/all-people-groups/all-people-groups.js",
"integrity": "sha384-wUgdpbqOtm89VOftSc0LWMjeu25MGgwf24IVMQcJZA/dVukVC5pffNDdVdChfI5g",
"integrity": "sha384-jfFp9SDomX8P8v5W8biQhRx21RclhiXRCGjjlAI+YpZo7GRxcM19586wKR6XFLbD",
"elements": [
"all-people-groups"
],
@ -28,7 +28,7 @@
"scriptUrl": "./all-people-groups/all-people-groups.js",
"embed": {
"iframe": "<iframe src=\"./all-people-groups/all-people-groups/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-wUgdpbqOtm89VOftSc0LWMjeu25MGgwf24IVMQcJZA/dVukVC5pffNDdVdChfI5g\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-jfFp9SDomX8P8v5W8biQhRx21RclhiXRCGjjlAI+YpZo7GRxcM19586wKR6XFLbD\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
},
"bundle": "all-people-groups"
}
@ -104,7 +104,7 @@
"bundle": "cities-internet",
"scriptUrl": "./cities-internet/cities-internet.js",
"output": "dx-maps/cities-internet/cities-internet.js",
"integrity": "sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi",
"integrity": "sha384-moOP7zVwXCd+v6iDNJY80BchWdubL2lw9Kkr5QOFmwUrT7In0mGQ08xbK60Y7nw3",
"elements": [
"cities-internet-map"
],
@ -120,7 +120,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-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" 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-moOP7zVwXCd+v6iDNJY80BchWdubL2lw9Kkr5QOFmwUrT7In0mGQ08xbK60Y7nw3\" 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>"
}
},
{
@ -134,7 +134,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-moOP7zVwXCd+v6iDNJY80BchWdubL2lw9Kkr5QOFmwUrT7In0mGQ08xbK60Y7nw3\" 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>"
}
},
{
@ -148,7 +148,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-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" 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-moOP7zVwXCd+v6iDNJY80BchWdubL2lw9Kkr5QOFmwUrT7In0mGQ08xbK60Y7nw3\" 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>"
}
}
]
@ -157,7 +157,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "dx-maps/country-posters/country-posters.js",
"integrity": "sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+",
"integrity": "sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B",
"elements": [
"country-posters-map"
],
@ -177,7 +177,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B\" 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>"
}
},
{
@ -191,7 +191,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-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" 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-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B\" 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>"
}
},
{
@ -205,7 +205,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-0EOpdNsc48Nq36PPgLQtiECw5bBKX7wH9sK0hpwcA2jP2G67FBd9YXWlUrRMC15B\" 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>"
}
}
]
@ -214,7 +214,7 @@
"bundle": "dashboard-plus-grid",
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
"integrity": "sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI",
"integrity": "sha384-GnQZsvhBnY7KhAw6d9oa95tuVmPNdxLaDQ2dmnz/uAJ06eZSsH+ydqA0m92Gln/n",
"elements": [
"dashboard-plus-grid"
],
@ -234,7 +234,7 @@
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
"embed": {
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-GnQZsvhBnY7KhAw6d9oa95tuVmPNdxLaDQ2dmnz/uAJ06eZSsH+ydqA0m92Gln/n\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
},
"instances": [
{
@ -258,7 +258,7 @@
"bundle": "demo-map",
"scriptUrl": "./demo-map/demo-map.js",
"output": "dx-maps/demo-map/demo-map.js",
"integrity": "sha384-nlkZeJFDIc718FpkJlZg3vsfXphzPaOBN/fyFVhVPTUcqlEHobdqwJJete8thIUx",
"integrity": "sha384-qFYCRU5HNpCNVPNnFrdkhJsVxSdIEiM3P/yWUdib09ipuVmsw8QIgkjBjfnp1U12",
"elements": [
"demo-map"
],
@ -274,7 +274,7 @@
"scriptUrl": "./demo-map/demo-map.js",
"embed": {
"iframe": "<iframe src=\"./demo-map/demo-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-nlkZeJFDIc718FpkJlZg3vsfXphzPaOBN/fyFVhVPTUcqlEHobdqwJJete8thIUx\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></demo-map>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-qFYCRU5HNpCNVPNnFrdkhJsVxSdIEiM3P/yWUdib09ipuVmsw8QIgkjBjfnp1U12\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></demo-map>"
},
"instances": [
{
@ -353,7 +353,7 @@
"bundle": "doxa-research-map",
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
"integrity": "sha384-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy",
"integrity": "sha384-lpTZtNxg+Dx3o/dyzA/3wyMrhsnJ7j5UN9lRDGAetPzWIURhsU+gICgaitKkpRK9",
"elements": [
"doxa-research-map"
],
@ -369,7 +369,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-lpTZtNxg+Dx3o/dyzA/3wyMrhsnJ7j5UN9lRDGAetPzWIURhsU+gICgaitKkpRK9\" 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": [
{
@ -395,7 +395,7 @@
"bundle": "doxa-simple-map",
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
"integrity": "sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu",
"integrity": "sha384-khPPaUMmo37Wa8yjMa6Ptnlwn2JQdHqc+gNWI0Cje8o+JcQl1DkaGWdSYTnQOm3H",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -412,7 +412,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-khPPaUMmo37Wa8yjMa6Ptnlwn2JQdHqc+gNWI0Cje8o+JcQl1DkaGWdSYTnQOm3H\" 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": [
{
@ -578,7 +578,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "dx-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9",
"integrity": "sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+",
"elements": [
"gospel-resources-map"
],
@ -598,7 +598,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" 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-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -612,7 +612,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" 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-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -626,7 +626,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -640,7 +640,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" 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-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -654,7 +654,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-yVLMMRrJvvr0kLDY/lhyT+QRhKdhpAlopst654Qz4vdD4nRL81yNYJCrf7/zN9w9\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-Yhc+jbWfuc3afH5G86vnB6jYXFhLqwyRySvzXGUNiMR7naP1I1inlscJqfurs83+\" 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>"
}
}
]
@ -663,7 +663,7 @@
"bundle": "my-upg-100-list",
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"output": "dx-maps/my-upg-100-list/my-upg-100-list.js",
"integrity": "sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd",
"integrity": "sha384-IaMFwZnvFfeygMVBG1VH9jSyNM037nl0j975Nii51Ubwxi1n39GXfmImz7xtxUmk",
"elements": [
"my-upg-100-list-map"
],
@ -683,7 +683,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-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" 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-IaMFwZnvFfeygMVBG1VH9jSyNM037nl0j975Nii51Ubwxi1n39GXfmImz7xtxUmk\" 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>"
}
},
{
@ -697,7 +697,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-IaMFwZnvFfeygMVBG1VH9jSyNM037nl0j975Nii51Ubwxi1n39GXfmImz7xtxUmk\" 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>"
}
},
{
@ -711,7 +711,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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" 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": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-IaMFwZnvFfeygMVBG1VH9jSyNM037nl0j975Nii51Ubwxi1n39GXfmImz7xtxUmk\" 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>"
}
}
]
@ -836,7 +836,7 @@
"bundle": "pplr-data-maps",
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
"output": "dx-maps/pplr-data-maps/pplr-data-maps.js",
"integrity": "sha384-Wf5IA8IPewJbr1WvTJ6FsVRBaJUpZuhFDZalAW9v+H19fiqQ5wffns7hUc7WXdIJ",
"integrity": "sha384-JElBf9WBFzyg6e8fdUMYndILsf/pmnVvGWJUdRDJb+9eVQi4T2whmePzHOOmKsaB",
"elements": [
"pplr-data-maps"
],
@ -852,7 +852,7 @@
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
"embed": {
"iframe": "<iframe src=\"./pplr-data-maps/pplr-data-maps/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-Wf5IA8IPewJbr1WvTJ6FsVRBaJUpZuhFDZalAW9v+H19fiqQ5wffns7hUc7WXdIJ\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-JElBf9WBFzyg6e8fdUMYndILsf/pmnVvGWJUdRDJb+9eVQi4T2whmePzHOOmKsaB\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
},
"bundle": "pplr-data-maps"
}
@ -862,7 +862,7 @@
"bundle": "prayer-walk-planner",
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
"output": "dx-maps/prayer-walk-planner/prayer-walk-planner.js",
"integrity": "sha384-YGKO2e+BZTuNjfZzlWY9BdwMADy3kJrlKKjbSVYV11Gup/JjVrWyz80yUL0MdxOO",
"integrity": "sha384-N4Uk19xlK4SevPTwXX6f3eR60iavGxW5/FxONWgGO54gzhPcRoe1jOHAq6vJJuW1",
"elements": [
"prayer-walk-planner"
],
@ -878,7 +878,7 @@
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
"embed": {
"iframe": "<iframe src=\"./prayer-walk-planner/prayer-walk-planner/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-YGKO2e+BZTuNjfZzlWY9BdwMADy3kJrlKKjbSVYV11Gup/JjVrWyz80yUL0MdxOO\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-N4Uk19xlK4SevPTwXX6f3eR60iavGxW5/FxONWgGO54gzhPcRoe1jOHAq6vJJuW1\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
}
}
]
@ -887,7 +887,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-jPzA1tgpyXKF32whK/PChM00zMGVmD6lTF36H28intnDnm33WE08194L81M66f+2",
"integrity": "sha384-H+peqtuS7sf6Z3UEur8bZNng4nJME6wRo5LxUngQaetNjf6oK1bDpXmRx2htLbbl",
"elements": [
"regions-dashboard"
],
@ -907,7 +907,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-jPzA1tgpyXKF32whK/PChM00zMGVmD6lTF36H28intnDnm33WE08194L81M66f+2\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-H+peqtuS7sf6Z3UEur8bZNng4nJME6wRo5LxUngQaetNjf6oK1bDpXmRx2htLbbl\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -921,7 +921,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-jPzA1tgpyXKF32whK/PChM00zMGVmD6lTF36H28intnDnm33WE08194L81M66f+2\" 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-H+peqtuS7sf6Z3UEur8bZNng4nJME6wRo5LxUngQaetNjf6oK1bDpXmRx2htLbbl\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -935,7 +935,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-jPzA1tgpyXKF32whK/PChM00zMGVmD6lTF36H28intnDnm33WE08194L81M66f+2\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-H+peqtuS7sf6Z3UEur8bZNng4nJME6wRo5LxUngQaetNjf6oK1bDpXmRx2htLbbl\" 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>"
}
}
]
@ -944,7 +944,7 @@
"bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "dx-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai",
"integrity": "sha384-SdGOSjUe8T0R0v8vdldvqFhboAeI5MY5hGPgVakQUj4Rt/23+Y9/ub5WbCT9Rc3M",
"elements": [
"research-dashboard-map"
],
@ -960,7 +960,7 @@
"scriptUrl": "./research-dashboard/research-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-SdGOSjUe8T0R0v8vdldvqFhboAeI5MY5hGPgVakQUj4Rt/23+Y9/ub5WbCT9Rc3M\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
},
"bundle": "research-dashboard"
}
@ -1058,7 +1058,7 @@
"bundle": "upg-neighbor",
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"output": "dx-maps/upg-neighbor/upg-neighbor.js",
"integrity": "sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY",
"integrity": "sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv",
"elements": [
"upg-neighbor"
],
@ -1074,7 +1074,7 @@
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"embed": {
"iframe": "<iframe src=\"./upg-neighbor/upg-neighbor/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
},
"instances": [
{
@ -1157,7 +1157,7 @@
"bundle": "wall-of-people-groups",
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
"output": "dx-maps/wall-of-people-groups/wall-of-people-groups.js",
"integrity": "sha384-QtpkRLm9y3siKeoKTfdmG/8Xi3S+TFSzjZ8aw35zjSwe4KenMTVpgFXC3Hjc7R8U",
"integrity": "sha384-MDE1WdLqoJyCtkIsE39Aw9K6QvtlwsaZC++0EhWAGN+ywFz7z6UXYneT4Jg/XaE3",
"elements": [
"wall-of-people-groups"
],
@ -1173,7 +1173,7 @@
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
"embed": {
"iframe": "<iframe src=\"./wall-of-people-groups/wall-of-people-groups/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=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-QtpkRLm9y3siKeoKTfdmG/8Xi3S+TFSzjZ8aw35zjSwe4KenMTVpgFXC3Hjc7R8U\" crossorigin=\"anonymous\"></script>\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-MDE1WdLqoJyCtkIsE39Aw9K6QvtlwsaZC++0EhWAGN+ywFz7z6UXYneT4Jg/XaE3\" crossorigin=\"anonymous\"></script>\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
},
"bundle": "wall-of-people-groups"
}

File diff suppressed because one or more lines are too long

View file

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

View file

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

View file

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

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <pplr-data-maps> custom element. -->
<script src="../pplr-data-maps.js" integrity="sha384-Wf5IA8IPewJbr1WvTJ6FsVRBaJUpZuhFDZalAW9v+H19fiqQ5wffns7hUc7WXdIJ" crossorigin="anonymous"></script>
<script src="../pplr-data-maps.js" integrity="sha384-JElBf9WBFzyg6e8fdUMYndILsf/pmnVvGWJUdRDJb+9eVQi4T2whmePzHOOmKsaB" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <prayer-walk-planner> custom element. -->
<script src="../prayer-walk-planner.js" integrity="sha384-YGKO2e+BZTuNjfZzlWY9BdwMADy3kJrlKKjbSVYV11Gup/JjVrWyz80yUL0MdxOO" crossorigin="anonymous"></script>
<script src="../prayer-walk-planner.js" integrity="sha384-N4Uk19xlK4SevPTwXX6f3eR60iavGxW5/FxONWgGO54gzhPcRoe1jOHAq6vJJuW1" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

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

File diff suppressed because one or more lines are too long

View file

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

View file

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

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <research-dashboard-map> custom element. -->
<script src="../research-dashboard.js" integrity="sha384-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai" crossorigin="anonymous"></script>
<script src="../research-dashboard.js" integrity="sha384-SdGOSjUe8T0R0v8vdldvqFhboAeI5MY5hGPgVakQUj4Rt/23+Y9/ub5WbCT9Rc3M" 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

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <upg-neighbor> custom element. -->
<script src="../upg-neighbor.js" integrity="sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY" crossorigin="anonymous"></script>
<script src="../upg-neighbor.js" integrity="sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-2eQCUQVWyddVJgljeE76ioH4vF003jiGlKvNgQoGdamXHkOjdZ/tN9ZipLO4FIJY" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-0gPQX1Igq9GQhSImPXGLcujDo1x0ERX7CR3wPhTvVYjUo+/abyRgZLUHv6XU/Vtv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -32,7 +32,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <wall-of-people-groups> custom element. -->
<script src="../wall-of-people-groups.js" integrity="sha384-QtpkRLm9y3siKeoKTfdmG/8Xi3S+TFSzjZ8aw35zjSwe4KenMTVpgFXC3Hjc7R8U" crossorigin="anonymous"></script>
<script src="../wall-of-people-groups.js" integrity="sha384-MDE1WdLqoJyCtkIsE39Aw9K6QvtlwsaZC++0EhWAGN+ywFz7z6UXYneT4Jg/XaE3" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: