Update from source acf67c59b
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-28 02:59:32 +00:00
parent 61ee4e5752
commit 501e2699ce
78 changed files with 1068 additions and 612 deletions

View file

@ -24,7 +24,6 @@ import (
"os/exec"
"strings"
"sync"
"syscall"
"time"
)
@ -215,7 +214,7 @@ func (w *deviceWatcher) run() {
for {
cmd := exec.Command("pactl", "subscribe")
cmd.Env = audioEnv()
cmd.SysProcAttr = &syscall.SysProcAttr{Pdeathsig: syscall.SIGKILL}
cmd.SysProcAttr = childAttr()
out, err := cmd.StdoutPipe()
if err == nil && cmd.Start() == nil {
sc := bufio.NewScanner(out)
@ -255,7 +254,7 @@ func (e *engine) micTest(device string) event {
return event{"ok": false, "verdict": "No recorder found (need parec, pw-record or arecord)."}
}
cmd.Env = audioEnv()
cmd.SysProcAttr = &syscall.SysProcAttr{Pdeathsig: syscall.SIGKILL}
cmd.SysProcAttr = childAttr()
var errBuf strings.Builder
cmd.Stderr = &errBuf
out, err := cmd.StdoutPipe()

View file

@ -29,11 +29,13 @@ import (
"io"
"log"
"net/http"
"net/url"
"os"
"os/exec"
"os/signal"
"path/filepath"
"regexp"
"runtime"
"strings"
"sync"
"sync/atomic"
@ -61,6 +63,21 @@ func envOr(k, d string) string {
return d
}
// defaultNemoBin: where setup puts NVIDIA's NeMo-Speech.cpp 0.1.0 CPU release for THIS platform — the
// release folders are named nemo-speech-0.1.0-<linux|macos|windows>-<x86_64|aarch64>-cpu.
func defaultNemoBin(base string) string {
osName := map[string]string{"darwin": "macos"}[runtime.GOOS]
if osName == "" {
osName = runtime.GOOS
}
arch := map[string]string{"amd64": "x86_64", "arm64": "aarch64"}[runtime.GOARCH]
exe := "nemo-speech"
if runtime.GOOS == "windows" {
exe += ".exe"
}
return filepath.Join(base, "bin", "nemo-speech-0.1.0-"+osName+"-"+arch+"-cpu", "bin", exe)
}
func loadConfig() config {
home, _ := os.UserHomeDir()
// RUDDER_HOME is where setup-runtime.sh installed the runtime and model (a server keeps it on a volume).
@ -68,7 +85,7 @@ func loadConfig() config {
return config{
Port: envOr("RUDDER_PORT", "5193"),
NemoPort: envOr("RUDDER_NEMO_PORT", "5194"),
NemoBin: envOr("RUDDER_NEMO_BIN", filepath.Join(base, "bin", "nemo-speech-0.1.0-linux-x86_64-cpu", "bin", "nemo-speech")),
NemoBin: envOr("RUDDER_NEMO_BIN", defaultNemoBin(base)),
Model: envOr("RUDDER_MODEL", filepath.Join(base, "models", "nemotron-3.5-asr-streaming-0.6b.q8_0.gguf")),
Language: envOr("RUDDER_LANG", "en-US"),
EndpointMs: 800,
@ -207,7 +224,7 @@ func (e *engine) startNemo() {
cmd := exec.Command(e.cfg.NemoBin, "serve",
"--host", "127.0.0.1", "--port", e.cfg.NemoPort,
"--asr-model", e.cfg.Model, "--device", "cpu", "--no-ui", "--api-key", e.nemoKey)
cmd.SysProcAttr = &syscall.SysProcAttr{Pdeathsig: syscall.SIGKILL} // dies with us
cmd.SysProcAttr = childAttr() // dies with us
out, _ := cmd.StdoutPipe()
cmd.Stderr = cmd.Stdout
if err := cmd.Start(); err != nil {
@ -669,7 +686,7 @@ func spawnRecorder(device string, logs *ring) (*recorderProc, error) {
}
cmd := exec.Command(c[0], c[1:]...)
cmd.Env = audioEnv()
cmd.SysProcAttr = &syscall.SysProcAttr{Pdeathsig: syscall.SIGKILL}
cmd.SysProcAttr = childAttr()
errBuf := &bytes.Buffer{}
cmd.Stderr = errBuf
out, err := cmd.StdoutPipe()
@ -813,7 +830,17 @@ func main() {
// /api/rudder/stream (RUDDER_AUDIO=browser): a WebSocket of binary 16 kHz mono s16le PCM frames from the
// page's microphone. Opening it starts a session, closing it stops one; the text comes back on /events.
// The upgrader's default origin check (Origin must match Host) keeps other sites out.
upgrader := websocket.Upgrader{ReadBufferSize: 8192}
// Origin: the page's own host (the dev server proxy), a desktop app's webview (tauri://localhost, or
// http://tauri.localhost on Windows — the same origins guard() answers CORS for), or RUDDER_ALLOW_ORIGIN.
// Anything else is another site and is refused.
upgrader := websocket.Upgrader{ReadBufferSize: 8192, CheckOrigin: func(r *http.Request) bool {
o := r.Header.Get("Origin")
if o == "" || o == "tauri://localhost" || o == "http://tauri.localhost" || (os.Getenv("RUDDER_ALLOW_ORIGIN") != "" && o == os.Getenv("RUDDER_ALLOW_ORIGIN")) {
return true
}
u, err := url.Parse(o)
return err == nil && strings.EqualFold(u.Host, r.Host)
}}
mux.HandleFunc("/api/rudder/stream", func(w http.ResponseWriter, r *http.Request) {
if !browserAudio() {
writeJSON(w, 409, event{"error": "this engine records a local microphone (RUDDER_AUDIO is not browser)"})

View file

@ -0,0 +1,12 @@
//go:build linux
package main
import "syscall"
// childAttr: a child process (the speech server, a recorder) is killed with the engine, so a crash
// never leaves a speech server holding a gigabyte of memory. Linux only: Pdeathsig does not exist on
// macOS or Windows (see procattr_other.go).
func childAttr() *syscall.SysProcAttr {
return &syscall.SysProcAttr{Pdeathsig: syscall.SIGKILL}
}

View file

@ -0,0 +1,12 @@
//go:build !linux
package main
import "syscall"
// childAttr: macOS and Windows have no parent-death signal. In the desktop app the Tauri shell owns the
// engine's lifetime and the engine kills its children on a normal exit (shutdown); a crashed engine can
// leave its speech server running until the app is next closed.
func childAttr() *syscall.SysProcAttr {
return nil
}

View file

@ -0,0 +1,164 @@
# HOWTO: build the Rudder desktop app (macOS / Windows)
Rudder (`plugin-designs/rudder-voice`) is voice-to-text that runs on your own computer: a web UI plus a
local engine (`backend/rudder-engine`, Go) that drives NVIDIA's NeMo-Speech.cpp speech server. The
desktop app is a Tauri window around the built web tree, with the engine started as a **sidecar**.
This page is written for an agent following it cold. **Read "What is proven" first**: most of the
desktop path has never been run by anyone, and the steps say so where that is the case.
## What is proven, and what is not
| Piece | State |
|---|---|
| The web tree (`bun run build` → `public/dx-maps/`) | Proven. Every landing builds it. |
| The generic Tauri shell (`deployment/src-tauri/`) | Exists. It opens the Research Gallery, builds only a Linux `.deb`, and has never been packaged on macOS or Windows. |
| The engine on Linux (`bun run dev`, laptop mic) | Proven. |
| The engine taking the **webview's** microphone (`RUDDER_AUDIO=browser`) | Proven on Linux: audio streamed over `/api/rudder/stream` came back as the full test sentence. |
| The engine **compiling** for macOS (arm64, x86_64) and Windows (x86_64) | Proven by cross-compiling. It has **never been run** on either. |
| The engine accepting a WebSocket from the Tauri webview (`tauri://localhost`, `http://tauri.localhost`) | Proven against a running engine; another site's origin is refused. |
| NeMo-Speech.cpp runtime for macOS / Windows | Published by NVIDIA (release v0.1.0: `macos-aarch64-cpu`, `macos-aarch64-metal`, `macos-x86_64-cpu`, `windows-x86_64-cpu` / `-cuda` / `-vulkan`). **Never run here.** |
| Rudder as a sidecar, first-run model download, installer | **Not built.** Steps 5–8 below are the work to do. |
## 1. Prerequisites
Both platforms:
- **Bun** (the repo's package manager and script runner): https://bun.sh
- **Go 1.22 or newer** (the engine).
- **Rust** (stable) via https://rustup.rs, then the Tauri CLI, which the repo already pins as a dev
dependency (`@tauri-apps/cli` 2.x, run through `bun run tauri:build`).
- About 2 GB of free disk space (the speech model is 742 MB) and 2 GB of free RAM while it runs.
macOS:
- Xcode Command Line Tools: `xcode-select --install`.
Windows:
- Microsoft C++ Build Tools ("Desktop development with C++").
- WebView2 runtime (preinstalled on Windows 11).
Tauri's own prerequisite list is the reference if anything above is out of date:
https://v2.tauri.app/start/prerequisites/
## 2. Get the repo and its packages
```bash
git clone <your team's repo URL> dx-maps
cd dx-maps
bun install
```
## 3. Build the web tree
```bash
bun run build
```
This writes `public/dx-maps/`, the tree every deployment serves, including
`public/dx-maps/rudder-voice/`. The Tauri config points at that folder (`frontendDist`); it does **not**
build it for you (`beforeBuildCommand` is deliberately empty; see `deployment/src-tauri/README.md`).
**Build first, then package.**
## 4. Build the engine for this machine
Tauri expects a sidecar binary named with the target triple:
```bash
# macOS, Apple Silicon
cd backend/rudder-engine && go build -o ../../deployment/src-tauri/binaries/rudder-engine-aarch64-apple-darwin . && cd ../..
# macOS, Intel
cd backend/rudder-engine && go build -o ../../deployment/src-tauri/binaries/rudder-engine-x86_64-apple-darwin . && cd ../..
# Windows (PowerShell)
cd backend/rudder-engine; go build -o ..\..\deployment\src-tauri\binaries\rudder-engine-x86_64-pc-windows-msvc.exe .; cd ..\..
```
`rustc -Vv` prints the exact triple (`host:` line) if unsure.
## 5. Make the Tauri shell start the engine (NOT BUILT: this is the work)
1. **Declare the sidecar** in `deployment/src-tauri/tauri.conf.json`:
`"bundle": { "externalBin": ["binaries/rudder-engine"], "targets": ["dmg"] }` on macOS, or
`["nsis"]` (or `["msi"]`) on Windows. Keep the file schema-pure: **no `//` comment keys**, Tauri
rejects unknown fields. Run `bun run check:tauri` after editing it.
2. **Add the shell plugin** (`tauri-plugin-shell`) to `deployment/src-tauri/Cargo.toml` and register it
in `src/main.rs`, then spawn the sidecar at startup with these environment variables:
- `RUDDER_AUDIO=browser`: the engine takes the **webview's** microphone. Its own recorders
(`parec` / `pw-record` / `arecord`) exist only on Linux, so on macOS and Windows this is required.
- `RUDDER_HOME=<the app's data directory>` (Tauri's `app_data_dir()`): where the runtime and model live.
- `RUDDER_PORT=5193` (the default) or a free port you pass on to the page (step 6).
Kill the sidecar when the window closes. On macOS and Windows the engine cannot ask the OS to kill
its own speech server if the engine crashes (Linux-only feature), so the shell should own that.
3. `src/main.rs` currently has no logic by design ("a window around the web tree"). Rudder is the first
desktop plugin with a backend, so this is the first logic it gains; keep it to starting and
stopping the sidecar.
## 6. Open Rudder, and tell it where the engine is (NOT BUILT)
The window opens `doxa-maps-spa/doxa-maps-spa/index.html` today. For a Rudder app, open Rudder's own
page, `rudder-voice/rudder-voice/index.html`, and give the element the engine's **absolute** address:
```
profile-config = {"apiBase": "http://127.0.0.1:5193/api/rudder"}
```
A relative `/api/rudder` would resolve against `tauri://localhost` and reach nothing. How the page
receives that config (a small wrapper page, a query parameter, or the shell injecting it) is not
decided and not built; pick the smallest option and say which in your report. The engine already
answers CORS for the Tauri origins and accepts their WebSocket.
## 7. The speech runtime and model on first run (NOT BUILT)
`backend/rudder-engine/setup-runtime.sh` is the reference: it pins the runtime (NeMo-Speech.cpp
**0.1.0**) and the model (`nemotron-3.5-asr-streaming-0.6b.q8_0.gguf`, Hugging Face revision
`ea30d66debe3`, ~742 MB) by SHA-256, and refuses a mismatch. It is **bash and Linux x86_64 only**, so on
macOS and Windows the app must do the same on first run:
- Download the runtime for this platform from
`https://github.com/NVIDIA/NeMo-Speech.cpp/releases/tag/v0.1.0`. Each asset has a published
`.sha256` next to it; check it. On Apple Silicon, the **`macos-aarch64-metal`** build uses the GPU
and should transcribe far faster than the CPU builds (unmeasured). On a server, the CPU build ran
slower than real time.
- Download the model from the URL and SHA-256 in `setup-runtime.sh`. Verify before use.
- Put them under `RUDDER_HOME`: `bin/nemo-speech-0.1.0-<os>-<arch>-cpu/bin/nemo-speech[.exe]` and
`models/<model file>`. The engine derives that runtime path for its own platform
(`<os>` = `macos` / `windows`, `<arch>` = `aarch64` / `x86_64`). **Unverified:** the layout inside the
macOS and Windows archives. If it differs, or you use the Metal build, set `RUDDER_NEMO_BIN` to the
real path of the `nemo-speech` binary.
- Show progress: the first start downloads ~750 MB and warms the model (~20 s on a laptop CPU).
## 8. Package
```bash
bun run tauri:build
```
Run it from the repo root. If the CLI cannot find the config, run `cargo tauri build` inside
`deployment/src-tauri/` (untested either way on macOS/Windows).
The installer lands under `deployment/src-tauri/target/release/bundle/`: `dmg/` on macOS, `nsis/` or
`msi/` on Windows.
- **macOS:** the webview needs `NSMicrophoneUsageDescription` in the app's `Info.plist` (Tauri: an
`Info.plist` file next to `tauri.conf.json`), or the microphone request is refused silently. An
unsigned app opens with right-click → Open the first time. Signing and notarising are only needed
to give it to others.
- **Windows:** WebView2 asks for microphone permission on first use.
## 9. Check it works
1. Launch the app. Rudder's status reads "Loading speech model…" and then **Ready**.
2. Press **Record**, speak, and watch the words stream into the box. Press **Stop**: the last words
still arrive.
3. `http://127.0.0.1:5193/api/rudder/status` in a browser on the same machine shows
`"engine":"ready"` and `"audio":"browser"`.
## Known gaps (untested; report what you find)
- Nothing in steps 5–8 has been run on macOS or Windows.
- The macOS/Windows runtime archive layout, and whether the engine's derived path matches it.
- The first-run download, including resuming an interrupted 742 MB download.
- Mapbox basemaps in the Research Gallery need the token host to allow the Tauri origin
(`deployment/src-tauri/README.md`). Rudder itself needs no token.
- If the engine crashes, its speech server may keep running (and holding ~1 GB) until the app quits.

View file

@ -247,6 +247,19 @@ const r = await page.evaluate(() => {
prayBoxes: document.querySelectorAll('.pray-box').length,
funnelTip: document.querySelectorAll('.funnel-tip').length,
lifeShaded: document.querySelectorAll('.lc-grid .lc-reached').length,
// ★ THE SHADED CELLS' VERTICAL SPREAD, as a fraction of the grid's own height. A COUNT cannot tell a
// scatter from a bar — 32 shaded is 32 shaded whether they are spread through a life or stacked in
// row 1 — so this measures the SHAPE, which is the thing the page is actually claiming.
lifeSpread: (() => {
const grid = document.querySelector('.sheet-christian .lc-grid')
if (!grid) return null
const on = [...grid.querySelectorAll('.lc-reached')]
if (on.length < 2) return null
const gb = grid.getBoundingClientRect()
if (!(gb.height > 0)) return null
const tops = on.map((el) => el.getBoundingClientRect().top)
return (Math.max(...tops) - Math.min(...tops)) / gb.height
})(),
funnelEq: document.querySelectorAll('.funnel-eq').length,
funnelSteps: document.querySelectorAll('.funnel-mine').length,
// ★ MEASURED SO THE GATE CAN REPORT WHAT IT ASSERTED. rega: "the gate prints no funnel line, even
@ -672,6 +685,18 @@ if (r.lifeSheets) {
+ `but rendered ${perGrid} — the grid changed size, so the page no longer shows a human life`)
}
}
// ⚠ AND THE SHADE MUST BE SCATTERED, NOT STACKED — the assertion that would have caught what three gates
// and a passing suite did not. rega's contact sheet (2026-09-28) showed page 3 reading as ONE SOLID BAR:
// 32 contiguous cells fill most of row 1 of 52, so the page said "a big green block" where the agent's
// intent is "32 boxes lost in 5,200". Every assertion passed, because they all measured the COUNT.
// Half the grid height is a deliberately loose floor: a genuine scatter of even a few cells spans most of
// the page (measured: 32 cells over 26 rows, 95% of the height), and a bar spans ~1%. Anything in between
// is worth a human look.
if (r.christianSheets && r.lifeSpread !== null && r.lifeSpread !== undefined && r.lifeSpread < 0.5) {
fails.push(`the christian-share page's shaded cells span only ${(r.lifeSpread * 100).toFixed(0)}% of the `
+ 'grid height — they are stacked, not scattered, so the page reads as a bar rather than as rare marks '
+ 'in a whole life. Shade by a deterministic scatter, not a contiguous run.')
}
// ★ THE SHADED SHARE MUST BE NON-ZERO AND NOT EVERYTHING. 0 shaded means the percentage never
// reached the page (a null christian-share file renders the page with an empty grid, which reads as
// "nobody is reached" — a false claim rather than missing data); 5,200 means the maths inverted.

View file

@ -64,6 +64,8 @@ try {
}
}
for (const b of byBundle.keys()) if (!seen.has(b)) fail(`bundle ${b} is missing from the rail`)
// A row is NAMED, never shown as a bare id (the agent: Gospel x Internet read just "board").
for (const r of ctx.rows) if (r.label === r.profile || r.label === r.bundle) fail(`${r.key} shows a bare id ("${r.label}") — give its <profile>.meta.json a "label"`)
const canon = secs.flatMap((s) => s.nodes.filter((n) => n.canonical))
for (const r of ctx.rows) { const c = canon.filter((n) => n.target === r.key).length; if (c !== 1) fail(`${r.key} has ${c} canonical nodes (want 1)`) }
const nProd = [...stageOf.values()].filter((v) => v === 'production').length

View file

@ -259,6 +259,24 @@ export function autoSpaDevPlugin(token = '') {
const rewritten = leafRewrite(rawPath, treeName)
const path = rewritten || rawPath
if (rewritten) req.url = rewritten + (req.url || '').slice(rawPath.length)
// THE SCRIPT EMBED, TOO (repo, 2026-09-28): the copyable snippet `./<b>/<b>.js` 404'd on the dev
// server for every production map while the iframe snippet worked through leafRewrite. The bundle
// IIFE only exists BUILT, so it is served from public/<tree>/ — bare or tree-prefixed, like the
// leaf. Not built yet: a plain 404 that says so, never Vite's HTML fallback.
const iife = /^\/(?:([^/]+)\/)?([a-z0-9][a-z0-9-]*)\/([a-z0-9][a-z0-9-]*)\.js$/.exec(rawPath)
if (iife && iife[2] === iife[3] && (!iife[1] || iife[1] === treeName)) {
const file = resolve(REPO_ROOT, 'public', treeName, iife[2], iife[2] + '.js')
if (existsSync(file)) {
res.setHeader('Content-Type', 'text/javascript; charset=utf-8')
res.setHeader('Cache-Control', 'no-cache')
return res.end(readFileSync(file))
}
if (existsSync(resolve(REPO_ROOT, 'plugin-designs', iife[2]))) {
res.statusCode = 404
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
return res.end(`${iife[2]}.js is only produced by a build: run \`bun run build\` (or BUNDLE=${iife[2]} bun x vite build), then reload.`)
}
}
// /assets/* — see resolveDevAsset. A miss is a REAL 404, never Vite's HTML
// fallback: HTML-for-JSON made three maps die silently at JSON.parse before
// they ever created a map, with no console error and no error card.

View file

@ -17,18 +17,21 @@ export function readProfileMeta(dir, profileName) {
try {
const meta = JSON.parse(readFileSync(join(dir, `${profileName}.meta.json`), 'utf8'))
const corner = meta?.widget?.corner
// The plugin's own display name (label, or title / displayName): what the Plugin Studio rail calls it.
const name = [meta?.label, meta?.title, meta?.displayName].find((v) => typeof v === 'string' && v.trim())
return {
stage: meta?.stage === 'production' ? 'production' : 'experimental',
heavy: meta?.heavy === true,
widget: CORNERS.includes(corner) ? { corner } : null,
label: name ? name.trim() : '',
}
} catch { return { stage: 'experimental', heavy: false, widget: null } }
} catch { return { stage: 'experimental', heavy: false, widget: null, label: '' } }
}
/** The optional manifest keys for one profile (stage always; heavy / widget only when set). */
export function profileMetaFields(dir, profileName) {
const m = readProfileMeta(dir, profileName)
return { stage: m.stage, ...(m.heavy ? { heavy: true } : {}), ...(m.widget ? { widget: m.widget } : {}) }
return { stage: m.stage, ...(m.label ? { label: m.label } : {}), ...(m.heavy ? { heavy: true } : {}), ...(m.widget ? { widget: m.widget } : {}) }
}
/** A bundle is production if ANY of its profiles says so. */

View file

@ -85,6 +85,25 @@ const LEAK_STRICT = [
[/\bpersecution\b/, 'operational-context vocabulary (allowed only inside data CSVs)'],
[/\.forgejo\/workflows/, 'CI workflow path — process, never ships in a public tree'],
]
// ★ THE PRAYER, WORD FOR WORD (the agent decision 2026-09-28): "Persecution happens globally, so the prayer is
// for the globe, and the packets carry the same prayer for all packets." The operational-vocabulary rule
// skips EXACTLY that prayer: the text at packet-strings.json <locale>.points[0].text (the packets' prayer
// point 1, which UPG-100's Two-Cross packet shows too), read from its source in every locale, removed from
// a scanned file before the rule looks at it. Scoped by file and key, never by the word: the same word
// anywhere else still counts.
const PRAYER_ALLOWED = (() => {
try {
const src = JSON.parse(readFileSync(join(ROOT, 'library/scripts/posters/packet-strings.json'), 'utf8'))
const out = []
for (const [lc, v] of Object.entries(src)) {
const text = !lc.startsWith('_') && v?.points?.[0]?.text
if (typeof text === 'string' && text) out.push(text, JSON.stringify(text).slice(1, -1)) // raw, and as a JS/JSON string literal
}
return out
} catch { return [] }
})()
const withoutPrayer = (t) => PRAYER_ALLOWED.reduce((acc, s) => acc.split(s).join(''), t)
// ★ WIDENED 2026-09-21. This held ONE pattern (the Mapbox JWT), on the reasoning that public/
// is a tree we GENERATE, so the only realistic leak is the token the build itself writes.
// THAT REASONING WAS WRONG: 855 files under public/ are TRACKED, 95 of them text — boundaries,
@ -131,7 +150,8 @@ for (const f of files) {
if (!isText || f.size > 40 * 1024 * 1024) continue
const t = readFileSync(f.abs, 'utf8')
for (const [re, why] of LEAK) if (re.test(t)) hit(findings, 'leaks', f.rel, why)
for (const [re, why] of LEAK_STRICT) if (re.test(t) && !/\.csv$/.test(f.rel)) hit(STRICT ? findings : warnings, 'leaks', f.rel, why)
const tNoPrayer = PRAYER_ALLOWED.length && /persecution/.test(t) ? withoutPrayer(t) : t
for (const [re, why] of LEAK_STRICT) if (re.test(re.source.includes('persecution') ? tNoPrayer : t) && !/\.csv$/.test(f.rel)) hit(STRICT ? findings : warnings, 'leaks', f.rel, why)
// ★ P2 (2026-09-24): a credential is a DOCUMENT, not a string. Every JWT-shaped value gets
// its payload DECODED and its claims reviewed: 'it is a public token' is not sufficient —
// the pk. accepted by the 2026-09-21 ruling turned out to carry a `u` claim naming a real,

View file

@ -397,6 +397,10 @@ export function useMapInstance({
const autoProvider = !provider && !explicitMapProvider(_pcForProvider)
provider = provider || resolveMapProvider(_pcForProvider, { token: accessToken })
let isMaplibre = provider === 'maplibre'
// Start the engine download during setup, not when initializeMap runs after mount: rega's waterfall had
// the engine requested only after the component tree had rendered. initializeMap awaits the same script
// (ensureEngineScript is idempotent) and reports a failure there; it is swallowed here.
if (typeof document !== 'undefined') ensureEngineScript(provider).catch(() => {})
// THE READER'S LANGUAGE, for the basemap's place names (maps/localize-labels.js). ProfileLoader
// provides it as a ref ('lang'); an element without ProfileLoader falls back to its profile-config

View file

@ -30,7 +30,7 @@ function isMaplibreMap(map) {
}
/**
* Point the basemap's place-name labels at `lang` ('en' = the style's own labels).
* Point the basemap's place-name labels at `lang` (every language, English included).
* Call after style.load, and again whenever the reader's language changes.
* @returns {number} how many label layers were localized (0 on Mapbox, which localizes internally)
*/
@ -58,9 +58,10 @@ export function localizeBasemapLabels(map, lang) {
if (!OSM_NAME_FIELD.test(json)) continue // a plugin's own label: leave it
saved.set(layer.id, current)
} else if (!saved.has(layer.id)) continue
const next = code === 'en'
? saved.get(layer.id)
: ['coalesce', ['get', 'name:' + code], ['get', 'name:latin'], ['get', 'name']]
// English too, not the style's own bilingual labels ("Россия" under "Russia"): those drew every
// native script at world view, so an English page fetched 13 extra glyph ranges (~600 KB, rega:
// Prayer Progress 18 requests / 777 KB in en against 5 / 185 KB in ar). One language per label.
const next = ['coalesce', ['get', 'name:' + code], ['get', 'name:latin'], ['get', 'name']]
map.setLayoutProperty(layer.id, 'text-field', next)
n++
}

View file

@ -518,14 +518,49 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null })
// ★ 5,200 IS NOT ROUNDED OR CHOSEN FOR LAYOUT: 100 years x 52 weeks, the agent's own numbers
// ("a 100 year life in weeks"). Everything else here is derived from it, so the two pages cannot
// drift apart into two grids that merely look alike.
function lifeGrid({ shaded = 0, shadeClass = 'lc-on' } = {}) {
function lifeGrid({ shaded = 0, shadeClass = 'lc-on', seed = '' } = {}) {
const YEARS = 100, WEEKS = 52, TOTAL = YEARS * WEEKS;
const n = Math.max(0, Math.min(TOTAL, Math.round(Number(shaded) || 0)));
// Row-major, so the shaded run reads as a contiguous block from the top — a scattered
// shading of the same COUNT would be honest arithmetic and an unreadable picture.
// ⚠ SCATTERED, NOT STACKED — and the comment that used to sit here said the opposite. It read:
// "Row-major, so the shaded run reads as a contiguous block from the top — a scattered shading of the
// same COUNT would be honest arithmetic and an unreadable picture." That was reasoning about a picture
// I had never looked at, and it was exactly backwards.
// ★ WHAT THE RENDER ACTUALLY SHOWED (rega's contact sheet, 2026-09-28): 32 contiguous cells fill most
// of row 1 of 52, so the page reads as ONE SOLID GREEN BAR across the header — the ordinary chart the
// whole life-grid idea exists to avoid. The agent's intent is "32 boxes lost in 5,200"; rarity is the
// message, and a bar cannot say it. Scattering makes the eye hunt for them, which IS the point.
// ⚠ AND NO GATE COULD SEE IT. check-packet-render asserts the shaded COUNT is strictly between 0 and
// 5,200 — true of a scatter and equally true of a bar. A count cannot distinguish a distribution.
//
// DETERMINISTIC, NEVER Math.random(): the same packet must print identically every time, or two copies
// of one zone disagree and neither is reproducible. A 32-bit FNV-1a hash of the seed (the zone id) feeds
// a mulberry32 PRNG, so the pattern is stable per zone and DIFFERENT between zones — which also avoids
// every packet in a print run carrying the same constellation.
let h = 2166136261;
for (let i = 0; i < String(seed).length; i++) {
h ^= String(seed).charCodeAt(i); h = Math.imul(h, 16777619);
}
const rand = () => {
h |= 0; h = (h + 0x6D2B79F5) | 0;
let t = Math.imul(h ^ (h >>> 15), 1 | h);
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
// Partial Fisher-Yates over the index space: pick n distinct cells without materialising a shuffle of
// all 5,200. Sparse by construction, so a large n degrades gracefully rather than clumping.
const picked = new Set();
const idx = [];
for (let i = 0; i < TOTAL; i++) idx.push(i);
for (let k = 0; k < n; k++) {
const j = k + Math.floor(rand() * (TOTAL - k));
const t = idx[k]; idx[k] = idx[j]; idx[j] = t;
picked.add(idx[k]);
}
const cells = [];
for (let i = 0; i < TOTAL; i++) {
cells.push(`<i class="lc-c${i < n ? ' ' + shadeClass : ''}"></i>`);
cells.push(`<i class="lc-c${picked.has(i) ? ' ' + shadeClass : ''}"></i>`);
}
return { TOTAL, YEARS, WEEKS, shadedCount: n, html: `<div class="lc-grid">${cells.join('')}</div>` };
}
@ -560,7 +595,7 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null })
function christianPage(zone, christian) {
if (!christian || !Number.isFinite(Number(christian.pctEvangelical))) return '';
const pct = Number(christian.pctEvangelical);
const g = lifeGrid({ shaded: (pct / 100) * 5200, shadeClass: 'lc-reached' });
const g = lifeGrid({ shaded: (pct / 100) * 5200, shadeClass: 'lc-reached', seed: zone.id || zone.zoneKey || 'upg-100' });
const lostPct = 100 - pct;
// ⚠ TWO DECIMALS ON BOTH SIDES, not rounded above 10. The reached share is 0.61% and rounding the
// other side to "99%" loses the asymmetry that is the whole point: 99.39 and 0.61 sum to 100, while

View file

@ -1637,12 +1637,43 @@ function pinBaseAlpha() {
}
// matchExpr: an expression to dim by, null to clear dimming, undefined to re-apply what is current
// (which is what the slider's watcher needs — it changes the scale, not the selection).
// ★ THE UNDIMMED VALUE IS DATA-DRIVEN TOO, AND THAT IS THE WHOLE POINT (the agent bug: "the research map
// isn't connecting with the legend"; rega's CPU profile, 2026-09-28). A legend click on a big affinity
// row appeared to do nothing for ~2 s. It was not the echo guard, not the legend's DOM (34 rows before,
// 34 after) and not expression evaluation (the JS filter scan over 2,106 features against a 700-id list
// measures 14 ms). It was ONE task of 3.2-3.5 s whose self time was getShaderParameter + getProgram-
// Parameter: the GPU compiling a NEW SHADER VARIANT, because this was the first moment circle-opacity
// stopped being a constant and became a per-feature expression. The second click was cheap — the
// program was cached — which is exactly the signature of a one-time compile.
//
// So the fix is not to make the expression smaller; it is to stop the FIRST SELECTION being the moment
// the variant is needed. With no selection the value is now ['case', ['has','uniqueId'], a, a] — both
// branches identical, so not one pixel changes, but circle-opacity is data-driven from the first paint
// and the program compiles during boot alongside every other one. A selection then only re-uploads
// attribute values, which is the cheap path.
//
// The trade, stated: boot compiles one more program (tens of ms on a real GPU; rega measured seconds
// only because that box rasterises on the CPU via SwiftShader). Paying it at load beats freezing the
// map mid-gesture, and the variant was going to be compiled on first interaction anyway.
function applyPinOpacity(m, matchExpr) {
if (matchExpr !== undefined) _pinMatchExpr = matchExpr || null
if (!m || !m.getLayer?.('language-family-pins')) return
const a = pinBaseAlpha()
const value = _pinMatchExpr ? ['case', _pinMatchExpr, a, 0] : a
// ['has','uniqueId'] reads a feature property, which is what makes it data-driven; both outcomes are
// `a`, so a pin without the property renders exactly as before.
const value = _pinMatchExpr ? ['case', _pinMatchExpr, a, 0] : ['case', ['has', 'uniqueId'], a, a]
// ★ ONE WRITE PER DISTINCT VALUE. rega counted circle-opacity rewritten 4-8 times for a single click
// (+1.52, +1.57, +1.94, +5.17 s): the selection handler, the glow sync and the slider watcher all end
// up here, and each write re-uploads the per-feature attribute. Every writer already routes through
// this function, so the collapse belongs here and nowhere else. Compared as text because the value is
// an expression tree; at a few hundred ids that is microseconds against a re-upload.
try {
// Asked of the MAP, not of a remembered key. A remembered one would go stale the moment the layer
// is torn down and re-added (setStyle wipes custom layers — this file has done that before) and the
// skip would then hold a dim that is no longer painted. Reading the live value cannot be stale, and
// if an engine normalises the expression differently the compare simply misses and we write, which
// is the old behaviour rather than a wrong one.
if (JSON.stringify(m.getPaintProperty('language-family-pins', 'circle-opacity')) === JSON.stringify(value)) return
m.setPaintProperty('language-family-pins', 'circle-opacity', value)
m.setPaintProperty('language-family-pins', 'circle-stroke-opacity', value)
if (m.getLayer('language-family-pins-shadow')) {
@ -2599,6 +2630,15 @@ async function onMapReady(normalizedPeopleGroups) {
if (activeTab.value?.id === 'doxa-regions' && map.value?.getLayer('language-family-pins')) {
map.value.setPaintProperty('language-family-pins', 'circle-color', '#4b5563')
}
// ★ INSTALL THE DATA-DRIVEN OPACITY NOW, WHICH IS WHAT ACTUALLY PRE-WARMS THE SHADER. The layer is
// added with a CONSTANT "circle-opacity": 1 (see addLanguageFamilyLayer), and applyPinOpacity is
// otherwise first reached from a legend click — so without this line the expression shape below is
// only ever the CLEARED state and the first selection is still the moment the variant is compiled,
// which is the 3.2-3.5s freeze rega profiled. Found by reading the built bundle rather than the
// source: the addLayer constant is right there in the shipped JS.
// matchExpr is left UNDEFINED on purpose — "re-apply what is current" — so a selection already
// restored from a share-link hash is preserved instead of being cleared at boot.
applyPinOpacity(map.value)
// Start prayer glow if landing on the prayer tab
if (activeTab.value?.id === 'prayer') mapLayers.startPrayerGlow()
// Hand the same dataset to clustering so MST/network can rebuild on toggle

View file

@ -150,9 +150,9 @@ useShadowStyles(
'.gig-tr.sel{background:#e3ece2}' +
'.gig-tr.open{box-shadow:inset 3px 0 0 #3b463d}' +
'.gig-sticky{position:sticky;inset-inline-start:0;z-index:1;background:inherit;font-weight:600}' +
'.gig-chk{width:34px;justify-content:center}' +
'.gig-chk{width:40px;justify-content:center}' + // 24 px of content inside the 8 px side padding: room for the hit area
'.gig-chk input{width:15px;height:15px;margin:0;cursor:pointer;accent-color:#3b463d}' +
'.gig-hit{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;cursor:pointer}' +
'.gig-hit{display:inline-flex;flex:none;align-items:center;justify-content:center;width:24px;min-width:24px;height:24px;cursor:pointer}' +
'.gig-dot{width:10px;height:10px;border-radius:50%;box-sizing:border-box;border:1.5px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,.2);flex:none;margin-inline-end:6px}' +
'.gig-sw{width:10px;height:10px;border-radius:2px;flex:none;margin-inline-end:6px;opacity:.85}' +
'.gig-td a{color:#4f6b52}' +

View file

@ -411,11 +411,22 @@ for (const [path, mod] of Object.entries(import.meta.glob('../../library/i18n/lo
if (m) STUDIO_STRINGS[m[1]] = mod
}
// DISPLAY NAMES — what a row is CALLED, keyed by "<bundle>/<profile>". Display only: the row key, the
// URL hash, the stored last-tab and the <tag> under the name are all unchanged, so links and memory
// keep working. The agent's name for the cap-5 shell is "Research Gallery" (its meta.json label);
// the manifest does not publish meta labels, so the studio carries the one it needs here.
const DISPLAY_NAME = { 'doxa-maps-spa/doxa-maps-spa': 'Research Gallery' }
// DISPLAY NAMES — what a row is CALLED. Display only: the row key, the URL hash, the stored last-tab and
// the <tag> under the name are unchanged, so links and memory keep working. AUTO-DETECTED (the agent:
// never hardcode): the plugin's own <profile>.meta.json label, carried by the manifest; failing that, a
// readable name made from its ids ("Gospel Internet · Board"), never a bare profile id (a row once read
// just "board"). DISPLAY_NAME is an OVERRIDE only, and empty unless a label must differ from the meta.
const DISPLAY_NAME = {}
const humanize = (id) => String(id).split(/[-_]+/).filter(Boolean).map(w => w[0].toUpperCase() + w.slice(1)).join(' ')
function rowLabel(bundle, p) {
const key = bundle + '/' + p.profile
if (DISPLAY_NAME[key]) return DISPLAY_NAME[key]
// A meta label often ends in an aside for the reader of the JSON ("Research Gallery (vertical-tab app
// shell: …)"); the rail shows the name before it.
const own = typeof p.label === 'string' ? p.label.replace(/\s*\([^()]*\)\s*$/, '').trim() : ''
if (own) return own
return p.profile === bundle ? humanize(bundle) : humanize(bundle) + ' · ' + humanize(p.profile)
}
// Load a bundle exactly once per URL; resolves after its define() has run.
//
@ -988,7 +999,7 @@ export default defineComponent({
bundle: b.bundle,
// production | experimental, from the bundle's .meta.json via the manifest (never a list here)
stage: b.stage === 'production' ? 'production' : 'experimental',
label: DISPLAY_NAME[b.bundle + '/' + p.profile] || p.profile,
label: rowLabel(b.bundle, p),
// The REAL profile id, handed to the element in profile-config. Never the label: a display
// name would mount <doxa-maps-spa> with profile "Research Gallery", which it does not have.
profile: p.profile,

View file

@ -127,10 +127,33 @@ const regionLabel = (key) => {
const k = slug && REGION_KEY[slug]
return (k && tStatic(k)) || key
}
// ★ THE CODE COMES FROM THE ROW, NOT FROM THE NAME (rega, ?lang=ar after the first fix: "People's
// Republic of China" and "Lao People's Democratic Republic" were still English). The API labels some
// countries with their FORMAL name, which countries.json does not carry — it says "China" and "Laos" —
// so reversing the English name missed exactly the countries whose names are longest. Every row already
// carries both halves: the label the chart aggregates on, and the alpha-3 in country_code.value, which
// is the accessor the choropleth already joins on. Reading the pair out of the data is exact and needs
// no alias table.
// Deliberately NOT a looser text match: "Democratic Republic of the Congo" and "Republic of the Congo"
// are two countries, so stripping formal prefixes is how one would silently become the other — the
// failure countryName.js's own header warns about.
const COUNTRY_ISO_BY_LABEL = computed(() => {
const m = new Map()
const acc = FACET_ACC.country_code
const geo = cfg.facets?.country_code?.geoIso
if (!acc || !geo) return m
for (const r of (dash?.rows?.value || [])) {
const label = acc(r), iso = geo(r)
if (label && iso && !m.has(label)) m.set(label, String(iso).toUpperCase())
}
return m
})
const countryLabel = (key) => {
const lc = getRuntimeLocale()
if (!lc || lc === 'en') return key
const iso3 = iso3ForEnglishName(key)
// The row pair first, the English-name table second: the table still answers for a label whose rows
// are currently filtered out, and a synthetic key ("Other") resolves to neither and renders as itself.
const iso3 = COUNTRY_ISO_BY_LABEL.value.get(key) || iso3ForEnglishName(key)
return iso3 ? countryName(iso3, lc) : key
}
const legendLabel = (facet, key) => {

View file

@ -131,6 +131,25 @@ const mapProvider = computed(() => {
// loaded with — a second inline `cfg.provider === …` test is how the two drift apart.
const isMaplibreProvider = computed(() => mapProvider.value === 'maplibre')
// The country boundaries (384 KB) are fetched as soon as the panel exists, not from the style-load
// handler: there the download waited for the whole basemap style and so ran after it, not beside it
// (rega's waterfall: requested at 10.4 s of a 12.5 s load). The handler awaits this same promise.
let boundariesPromise = null
function countryBoundaries() {
if (!boundariesPromise) {
boundariesPromise = fetch(`${resolveAssetsBase(profileConfig.value)}/boundaries/world-adm0-web.geojson`)
.then((r) => r.json())
.then((gj) => {
for (const f of gj.features || []) {
if (f.properties && f.properties.iso3) f.properties.iso_3166_1_alpha_3 = f.properties.iso3
}
return gj
})
boundariesPromise.catch(() => { boundariesPromise = null }) // a failed download is retried next time
}
return boundariesPromise
}
const { map, isMapReady, initializeMap, destroy } = useMapInstance({
containerRef: mapContainer, accessToken: unref(mapboxToken) || (mapboxToken && mapboxToken.value) || '',
// ★ ZOOMED OUT BY DEFAULT, WITH REAL ZOOM-OUT RANGE (the agent 2026-09-23: "I don't want the map
@ -841,12 +860,8 @@ function addLayers() {
// keep this layer underneath the pins (layer order is insertion order). An awaited fetch
// here would put the choropleth on TOP of every bubble.
m.addSource('rd-countries', { type: 'geojson', data: { type: 'FeatureCollection', features: [] } })
fetch(`${resolveAssetsBase(profileConfig.value)}/boundaries/world-adm0-web.geojson`)
.then((r) => r.json())
countryBoundaries()
.then((gj) => {
for (const f of gj.features || []) {
if (f.properties && f.properties.iso3) f.properties.iso_3166_1_alpha_3 = f.properties.iso3
}
const src = map.value && map.value.getSource('rd-countries')
if (src) src.setData(gj)
})
@ -1215,6 +1230,7 @@ function syncScrollZoomToHost(m) {
}
onMounted(async () => {
if (isMaplibreProvider.value) countryBoundaries().catch(() => {})
await initializeMap()
const m = map.value; if (!m) return
if (m.isStyleLoaded()) addLayers(); else m.on('load', addLayers)

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-rulN2I2Zknh0wX7BSlbKVtEb7+7FeIkGQEBdODV+xJROYJhMShYMQFt2q4CSdKe0" crossorigin="anonymous"></script>
<script src="../all-people-groups.js" integrity="sha384-Hyu82pGG4OWWb5qm5gfp3dDF4vqvXnlZQ8/d86okNGi0nV5GNhyIApwby/FrkZ1g" 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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9" crossorigin="anonymous"></script>
<script src="../cities-internet.js" integrity="sha384-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv" 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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9" crossorigin="anonymous"></script>
<script src="../cities-internet.js" integrity="sha384-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv" 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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9" crossorigin="anonymous"></script>
<script src="../cities-internet.js" integrity="sha384-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv" 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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4" 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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4" 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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4" 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-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ" crossorigin="anonymous"></script>
<script src="../../dashboard-plus-grid.js" integrity="sha384-KKQCv8v895tYjwayG6saIYk3ymn3wmk6X3TEwv+sQ5pU9BDkErSFF7JEuUTdsZCF" 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-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ" crossorigin="anonymous"></script>
<script src="../dashboard-plus-grid.js" integrity="sha384-KKQCv8v895tYjwayG6saIYk3ymn3wmk6X3TEwv+sQ5pU9BDkErSFF7JEuUTdsZCF" 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-fqvqn/UaQLfib5r8Bs5plcIouQckolyhgYzV/nXeoS7ltC99oH/T5ZuFye/+ZJSt" crossorigin="anonymous"></script>
<script src="../demo-map.js" integrity="sha384-okPjbmNdBwckUKJibLgUkoTjZ2+rwOQNGxWZO+hv8HXCPMWWOZyAawTHo6EOqBk3" 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-fqvqn/UaQLfib5r8Bs5plcIouQckolyhgYzV/nXeoS7ltC99oH/T5ZuFye/+ZJSt" crossorigin="anonymous"></script>
<script src="../../demo-map.js" integrity="sha384-okPjbmNdBwckUKJibLgUkoTjZ2+rwOQNGxWZO+hv8HXCPMWWOZyAawTHo6EOqBk3" 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-rulN2I2Zknh0wX7BSlbKVtEb7+7FeIkGQEBdODV+xJROYJhMShYMQFt2q4CSdKe0",
"integrity": "sha384-Hyu82pGG4OWWb5qm5gfp3dDF4vqvXnlZQ8/d86okNGi0nV5GNhyIApwby/FrkZ1g",
"elements": [
"all-people-groups"
],
@ -30,7 +30,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-rulN2I2Zknh0wX7BSlbKVtEb7+7FeIkGQEBdODV+xJROYJhMShYMQFt2q4CSdKe0\" 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-Hyu82pGG4OWWb5qm5gfp3dDF4vqvXnlZQ8/d86okNGi0nV5GNhyIApwby/FrkZ1g\" 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"
}
@ -55,6 +55,7 @@
{
"profile": "big-picture",
"stage": "experimental",
"label": "Big Picture (research header ↔ real people-groups grid via props/events)",
"file": "big-picture.vue",
"description": "The Cat-4 composite that PAIRS the two real capability elements of the",
"element": "bp-big-picture",
@ -108,7 +109,7 @@
"bundle": "cities-internet",
"scriptUrl": "./cities-internet/cities-internet.js",
"output": "dx-maps/cities-internet/cities-internet.js",
"integrity": "sha384-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9",
"integrity": "sha384-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv",
"elements": [
"cities-internet-map"
],
@ -126,12 +127,13 @@
"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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9\" 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-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv\" 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>"
}
},
{
"profile": "connectivity-map",
"stage": "production",
"label": "Cities with Internet — connectivity map",
"file": "connectivity-map.vue",
"description": "Every country shaded by measured internet penetration, with its named carriers and dominant",
"element": "cities-internet-map",
@ -141,7 +143,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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9\" 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-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv\" 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>"
}
},
{
@ -156,7 +158,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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9\" 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-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv\" 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>"
}
}
]
@ -165,7 +167,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "dx-maps/country-posters/country-posters.js",
"integrity": "sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+",
"integrity": "sha384-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4",
"elements": [
"country-posters-map"
],
@ -187,7 +189,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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" 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-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4\" 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>"
}
},
{
@ -202,12 +204,13 @@
"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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" 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-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4\" 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>"
}
},
{
"profile": "country-posters-mfe",
"stage": "experimental",
"label": "Country Posters — Wall + Map",
"file": "country-posters-mfe.vue",
"description": "Country Posters as ONE two-tab element — the countries map and the printable",
"element": "country-posters-mfe",
@ -217,7 +220,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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" 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-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4\" 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>"
}
}
]
@ -226,7 +229,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-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ",
"integrity": "sha384-KKQCv8v895tYjwayG6saIYk3ymn3wmk6X3TEwv+sQ5pU9BDkErSFF7JEuUTdsZCF",
"elements": [
"dashboard-plus-grid"
],
@ -239,6 +242,7 @@
{
"profile": "dashboard-plus-grid",
"stage": "production",
"label": "Dashboard + Grid (baked into one element, stacked to scroll)",
"file": "dashboard-plus-grid.vue",
"description": "Both children are IMPORTED DIRECTLY (compiled into this ONE bundle — no runtime bundle",
"element": "dashboard-plus-grid",
@ -248,7 +252,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-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ\" 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-KKQCv8v895tYjwayG6saIYk3ymn3wmk6X3TEwv+sQ5pU9BDkErSFF7JEuUTdsZCF\" 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": [
{
@ -272,7 +276,7 @@
"bundle": "demo-map",
"scriptUrl": "./demo-map/demo-map.js",
"output": "dx-maps/demo-map/demo-map.js",
"integrity": "sha384-fqvqn/UaQLfib5r8Bs5plcIouQckolyhgYzV/nXeoS7ltC99oH/T5ZuFye/+ZJSt",
"integrity": "sha384-okPjbmNdBwckUKJibLgUkoTjZ2+rwOQNGxWZO+hv8HXCPMWWOZyAawTHo6EOqBk3",
"elements": [
"demo-map"
],
@ -290,7 +294,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-fqvqn/UaQLfib5r8Bs5plcIouQckolyhgYzV/nXeoS7ltC99oH/T5ZuFye/+ZJSt\" 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-okPjbmNdBwckUKJibLgUkoTjZ2+rwOQNGxWZO+hv8HXCPMWWOZyAawTHo6EOqBk3\" 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": [
{
@ -335,6 +339,7 @@
{
"profile": "doxa-maps-spa",
"stage": "experimental",
"label": "Research Gallery (vertical-tab app shell: the seven production maps)",
"file": "doxa-maps-spa.vue",
"description": "The DX-maps app itself: one element whose vertical-tab rail nests every other",
"element": "doxa-maps-spa",
@ -371,7 +376,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-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH",
"integrity": "sha384-B6gF69v23HjaSAYYpOT3XNCu60fKgswgggVrBhT43TB0CGJkOSzYYTTkKDq96+Ch",
"elements": [
"doxa-research-map"
],
@ -380,6 +385,7 @@
{
"profile": "research-map",
"stage": "experimental",
"label": "Research Map",
"file": "research-map.vue",
"description": "The researcher's workbench: every piece a missiologist, demographer or",
"element": "doxa-research-map",
@ -389,7 +395,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-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH\" 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-B6gF69v23HjaSAYYpOT3XNCu60fKgswgggVrBhT43TB0CGJkOSzYYTTkKDq96+Ch\" 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": [
{
@ -415,7 +421,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-d7XChL9kU5af4g0Wc/t4wlgwhLGXrcAq1JGPWznSALICvY2Bdv8r2gekxkDK1XRW",
"integrity": "sha384-CkbrFX71L8DOqo4LtACDbHX9vw7e/ZSR+TczWh0BTqm8Nm60QzR1O7Zr87tkxcG8",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -434,7 +440,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-d7XChL9kU5af4g0Wc/t4wlgwhLGXrcAq1JGPWznSALICvY2Bdv8r2gekxkDK1XRW\" 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-CkbrFX71L8DOqo4LtACDbHX9vw7e/ZSR+TczWh0BTqm8Nm60QzR1O7Zr87tkxcG8\" 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": [
{
@ -604,7 +610,7 @@
"bundle": "gospel-internet",
"scriptUrl": "./gospel-internet/gospel-internet.js",
"output": "dx-maps/gospel-internet/gospel-internet.js",
"integrity": "sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i",
"integrity": "sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl",
"elements": [
"gospel-internet-board"
],
@ -613,6 +619,7 @@
{
"profile": "board",
"stage": "experimental",
"label": "Gospel x Internet — the board",
"heavy": true,
"file": "board.vue",
"description": "For every remaining people group: what gospel resources exist in a language they use, and how much of their country (or Indian state) is online to receive them.",
@ -623,7 +630,7 @@
"scriptUrl": "./gospel-internet/gospel-internet.js",
"embed": {
"iframe": "<iframe src=\"./gospel-internet/board/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-internet/gospel-internet.js\" integrity=\"sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
"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-internet/gospel-internet.js\" integrity=\"sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
},
"instances": [
{
@ -773,6 +780,7 @@
{
"profile": "gospel-dashboard",
"stage": "production",
"label": "Gospel Dashboard (map + tables baked into one element, stacked to scroll)",
"file": "gospel-dashboard.vue",
"description": "The gospel map and its tables as one scrolling element: 12,379 people-group pins with the real Scripture, film and Bible-story links for each group's own language, above every resource with its URL and the 1,613 groups where nothing was found, exportable as CSV.",
"element": "gospel-resources-map",
@ -803,6 +811,7 @@
{
"profile": "resources-map",
"stage": "experimental",
"label": "Gospel Resources — resources map",
"file": "resources-map.vue",
"description": "12,379 people-group pins over a country choropleth: tap a pin for the Scripture, audio, film, Bible-story and training links that exist in that group's own language with real URLs, tap a country for every group in it, search by group, language or ISO 639-3 code, and filter to the groups where nothing was found.",
"element": "gospel-resources-map",
@ -821,7 +830,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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds",
"integrity": "sha384-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4",
"elements": [
"my-upg-100-list-map"
],
@ -843,7 +852,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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds\" 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-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4\" 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>"
}
},
{
@ -858,12 +867,13 @@
"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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds\" 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-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4\" 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>"
}
},
{
"profile": "upg-100-mfe",
"stage": "production",
"label": "UPG-100 — Map + Prayer Lists",
"file": "upg-100-mfe.vue",
"description": "The standalone, shareable and embeddable composite of the my-upg-100-list family — it nests the map",
"element": "my-upg-100-list-map",
@ -873,7 +883,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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds\" 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-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4\" 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>"
}
}
]
@ -891,6 +901,7 @@
{
"profile": "people-groups-grid",
"stage": "experimental",
"label": "People Groups Grid (Cat-2 prop-table: search + 4 dropdowns + faceted counts; show-search/show-filters + groups-filtered)",
"file": "people-groups-grid.vue",
"description": "The people-groups grid as an owned custom element: card list, search and four",
"element": "people-groups-grid",
@ -945,7 +956,7 @@
"bundle": "plugin-studio",
"scriptUrl": "./plugin-studio/plugin-studio.js",
"output": "dx-maps/plugin-studio/plugin-studio.js",
"integrity": "sha384-1KspSeIUO3xQaKKd+sTg2ezt/+gB/ua2U1g8flIGH+C64uOnzXw2yFLoqLXy8vl8",
"integrity": "sha384-dVe39HIJ0Dw20gfFjUlrOgtMMyN4J99FMOdxnyfoJtdxK3rCy8tjr+RxY5ruTs80",
"elements": [
"plugin-studio"
],
@ -966,6 +977,7 @@
{
"profile": "plugin-studio",
"stage": "experimental",
"label": "Plugin Studio (cap-5 developer studio: every element by capability 5 -> 1)",
"file": "plugin-studio.vue",
"description": "The developer's viewing surface: a sidebar that is the composability ladder",
"element": "plugin-studio",
@ -975,7 +987,7 @@
"scriptUrl": "./plugin-studio/plugin-studio.js",
"embed": {
"iframe": "<iframe src=\"./plugin-studio/plugin-studio/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=\"./plugin-studio/plugin-studio.js\" integrity=\"sha384-1KspSeIUO3xQaKKd+sTg2ezt/+gB/ua2U1g8flIGH+C64uOnzXw2yFLoqLXy8vl8\" crossorigin=\"anonymous\"></script>\n<plugin-studio profile-config='{\"profile\":\"plugin-studio\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></plugin-studio>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./plugin-studio/plugin-studio.js\" integrity=\"sha384-dVe39HIJ0Dw20gfFjUlrOgtMMyN4J99FMOdxnyfoJtdxK3rCy8tjr+RxY5ruTs80\" crossorigin=\"anonymous\"></script>\n<plugin-studio profile-config='{\"profile\":\"plugin-studio\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></plugin-studio>"
},
"instances": [
{
@ -1002,7 +1014,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-p3Skl/DEIsDt/B6QNbW2E5UiI0HCVORMx8ZT5meVLl15FZ97/ZqZeWQETj4dch3+",
"integrity": "sha384-rubpRmSBkm6v202d1whkPHrDHqpD+3+OKsqAYaaYcFHxjH4McsdsZUypXrcHgUVz",
"elements": [
"pplr-data-maps"
],
@ -1011,6 +1023,7 @@
{
"profile": "pplr-data-maps",
"stage": "experimental",
"label": "PPLR Data Maps",
"file": "pplr-data-maps.vue",
"description": "Ten views that let a researcher check the PPLR people-group data by eye",
"element": "pplr-data-maps",
@ -1020,7 +1033,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-p3Skl/DEIsDt/B6QNbW2E5UiI0HCVORMx8ZT5meVLl15FZ97/ZqZeWQETj4dch3+\" 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-rubpRmSBkm6v202d1whkPHrDHqpD+3+OKsqAYaaYcFHxjH4McsdsZUypXrcHgUVz\" 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"
}
@ -1030,7 +1043,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-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs",
"integrity": "sha384-T/NWde52/TY+ljyOu26UBMz9HPVwDymkMlBInRm3XFg8liVBWWfeul1vAPNUUq6K",
"elements": [
"prayer-walk-planner"
],
@ -1048,7 +1061,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-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs\" 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-T/NWde52/TY+ljyOu26UBMz9HPVwDymkMlBInRm3XFg8liVBWWfeul1vAPNUUq6K\" 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>"
}
}
]
@ -1057,7 +1070,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0",
"integrity": "sha384-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy",
"elements": [
"regions-dashboard"
],
@ -1070,6 +1083,7 @@
{
"profile": "region-dashboards",
"stage": "experimental",
"label": "Regions — region + country dashboard",
"file": "region-dashboards.vue",
"description": "The dashboard half of the 2-tab Regions element: given a region (or a",
"element": "regions-dashboard",
@ -1079,12 +1093,13 @@
"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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" 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-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy\" 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>"
}
},
{
"profile": "regions-list",
"stage": "experimental",
"label": "Regions — the list page",
"file": "regions-list.vue",
"description": "A refactor of DX-life's /regions index page (app/pages/regions/index.vue) into",
"element": "regions-dashboard",
@ -1094,12 +1109,13 @@
"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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" 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-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy\" 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>"
}
},
{
"profile": "regions-mfe",
"stage": "production",
"label": "Regions — List + Dashboards",
"file": "regions-mfe.vue",
"description": "The composite: ONE element carrying the SELECT VIEW switcher",
"element": "regions-dashboard",
@ -1109,7 +1125,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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" 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-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy\" 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>"
}
}
]
@ -1118,7 +1134,7 @@
"bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "dx-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY",
"integrity": "sha384-KDXJbKFaAbMwrZNlONidwpxb4AXWHVIHKN+ASJpHjgDTH5Uhfzv5EOXhxVBAzTi0",
"elements": [
"research-dashboard-map"
],
@ -1127,6 +1143,7 @@
{
"profile": "research-dashboard",
"stage": "experimental",
"label": "Research Dashboard",
"file": "research-dashboard.vue",
"description": "Coordinated-Multiple-Views research dashboard for 10/40-window UPGs (live pray.doxa.life): docked facet rail + map-as-hero + linked table/charts, brushing-and-linking over one in-memory store.",
"element": "research-dashboard-map",
@ -1136,7 +1153,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-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY\" 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-KDXJbKFaAbMwrZNlONidwpxb4AXWHVIHKN+ASJpHjgDTH5Uhfzv5EOXhxVBAzTi0\" 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"
}
@ -1159,6 +1176,7 @@
{
"profile": "research-map-plus-grid",
"stage": "production",
"label": "Research Map + Grid (mobile composite, stacked to scroll)",
"file": "research-map-plus-grid.vue",
"description": "The monolithic 7-tab research map (cap-3) on top, the People Groups grid beneath,",
"element": "research-map-plus-grid",
@ -1201,6 +1219,7 @@
{
"profile": "rudder-voice",
"stage": "experimental",
"label": "Rudder — voice to text (desktop)",
"widget": {
"corner": "bottom-right"
},
@ -1235,6 +1254,7 @@
{
"profile": "stack-demo",
"stage": "experimental",
"label": "Stack Demo (two elements stacked to scroll — StackLayout)",
"file": "stack-demo.vue",
"description": "Groups TWO independent elements TOP-TO-BOTTOM so you can embed the pair on a page and",
"element": "stack-demo",
@ -1268,7 +1288,7 @@
"bundle": "upg-neighbor",
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"output": "dx-maps/upg-neighbor/upg-neighbor.js",
"integrity": "sha384-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc",
"integrity": "sha384-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC",
"elements": [
"upg-neighbor"
],
@ -1277,6 +1297,7 @@
{
"profile": "upg-neighbor",
"stage": "experimental",
"label": "My UPG Neighbors",
"file": "upg-neighbor.vue",
"description": "Near-neighbor mobilization on Winter's E-scale: who to mobilize, in what language, where",
"element": "upg-neighbor",
@ -1286,7 +1307,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-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc\" 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-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC\" 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": [
{
@ -1377,6 +1398,7 @@
{
"profile": "wall-of-people-groups",
"stage": "experimental",
"label": "Wall of People Groups",
"file": "wall-of-people-groups.vue",
"description": "Every Doxa people group as a card on one zoomable prayer wall",
"element": "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-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH" crossorigin="anonymous"></script>
<script src="../doxa-research-map.js" integrity="sha384-B6gF69v23HjaSAYYpOT3XNCu60fKgswgggVrBhT43TB0CGJkOSzYYTTkKDq96+Ch" 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-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH" crossorigin="anonymous"></script>
<script src="../../doxa-research-map.js" integrity="sha384-B6gF69v23HjaSAYYpOT3XNCu60fKgswgggVrBhT43TB0CGJkOSzYYTTkKDq96+Ch" 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-d7XChL9kU5af4g0Wc/t4wlgwhLGXrcAq1JGPWznSALICvY2Bdv8r2gekxkDK1XRW" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-CkbrFX71L8DOqo4LtACDbHX9vw7e/ZSR+TczWh0BTqm8Nm60QzR1O7Zr87tkxcG8" 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-d7XChL9kU5af4g0Wc/t4wlgwhLGXrcAq1JGPWznSALICvY2Bdv8r2gekxkDK1XRW" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-CkbrFX71L8DOqo4LtACDbHX9vw7e/ZSR+TczWh0BTqm8Nm60QzR1O7Zr87tkxcG8" 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-d7XChL9kU5af4g0Wc/t4wlgwhLGXrcAq1JGPWznSALICvY2Bdv8r2gekxkDK1XRW" crossorigin="anonymous"></script>
<script src="../doxa-simple-map.js" integrity="sha384-CkbrFX71L8DOqo4LtACDbHX9vw7e/ZSR+TczWh0BTqm8Nm60QzR1O7Zr87tkxcG8" 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-d7XChL9kU5af4g0Wc/t4wlgwhLGXrcAq1JGPWznSALICvY2Bdv8r2gekxkDK1XRW" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-CkbrFX71L8DOqo4LtACDbHX9vw7e/ZSR+TczWh0BTqm8Nm60QzR1O7Zr87tkxcG8" 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-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i" crossorigin="anonymous"></script>
<script src="../../gospel-internet.js" integrity="sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl" 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-internet-board> custom element. -->
<script src="../gospel-internet.js" integrity="sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i" crossorigin="anonymous"></script>
<script src="../gospel-internet.js" integrity="sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl" 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-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i" crossorigin="anonymous"></script>
<script src="../../gospel-internet.js" integrity="sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl" 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-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i" crossorigin="anonymous"></script>
<script src="../../gospel-internet.js" integrity="sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl" 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-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i" crossorigin="anonymous"></script>
<script src="../../gospel-internet.js" integrity="sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl" 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-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i" crossorigin="anonymous"></script>
<script src="../../gospel-internet.js" integrity="sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl" 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-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i" crossorigin="anonymous"></script>
<script src="../../gospel-internet.js" integrity="sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl" 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

@ -19,6 +19,6 @@
</head>
<body>
<plugin-studio tree-base="."></plugin-studio>
<script src="./plugin-studio/plugin-studio.js" integrity="sha384-1KspSeIUO3xQaKKd+sTg2ezt/+gB/ua2U1g8flIGH+C64uOnzXw2yFLoqLXy8vl8" crossorigin="anonymous"></script>
<script src="./plugin-studio/plugin-studio.js" integrity="sha384-dVe39HIJ0Dw20gfFjUlrOgtMMyN4J99FMOdxnyfoJtdxK3rCy8tjr+RxY5ruTs80" crossorigin="anonymous"></script>
</body>
</html>

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-rulN2I2Zknh0wX7BSlbKVtEb7+7FeIkGQEBdODV+xJROYJhMShYMQFt2q4CSdKe0",
"integrity": "sha384-Hyu82pGG4OWWb5qm5gfp3dDF4vqvXnlZQ8/d86okNGi0nV5GNhyIApwby/FrkZ1g",
"elements": [
"all-people-groups"
],
@ -30,7 +30,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-rulN2I2Zknh0wX7BSlbKVtEb7+7FeIkGQEBdODV+xJROYJhMShYMQFt2q4CSdKe0\" 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-Hyu82pGG4OWWb5qm5gfp3dDF4vqvXnlZQ8/d86okNGi0nV5GNhyIApwby/FrkZ1g\" 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"
}
@ -55,6 +55,7 @@
{
"profile": "big-picture",
"stage": "experimental",
"label": "Big Picture (research header ↔ real people-groups grid via props/events)",
"file": "big-picture.vue",
"description": "The Cat-4 composite that PAIRS the two real capability elements of the",
"element": "bp-big-picture",
@ -108,7 +109,7 @@
"bundle": "cities-internet",
"scriptUrl": "./cities-internet/cities-internet.js",
"output": "dx-maps/cities-internet/cities-internet.js",
"integrity": "sha384-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9",
"integrity": "sha384-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv",
"elements": [
"cities-internet-map"
],
@ -126,12 +127,13 @@
"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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9\" 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-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv\" 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>"
}
},
{
"profile": "connectivity-map",
"stage": "production",
"label": "Cities with Internet — connectivity map",
"file": "connectivity-map.vue",
"description": "Every country shaded by measured internet penetration, with its named carriers and dominant",
"element": "cities-internet-map",
@ -141,7 +143,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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9\" 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-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv\" 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>"
}
},
{
@ -156,7 +158,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-V4AZaATfvzuYWDXNEriVaHwZrAb7tV8MLFaLTwi+u+mgFvU0/ET5UW+yZLov3bD9\" 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-xF3apO1XPKnZJfNBNxWRVjaJOG5uhEqm5SqMXid8fF8/481LpPDs+gUjrMwgWAwv\" 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>"
}
}
]
@ -165,7 +167,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "dx-maps/country-posters/country-posters.js",
"integrity": "sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+",
"integrity": "sha384-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4",
"elements": [
"country-posters-map"
],
@ -187,7 +189,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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" 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-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4\" 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>"
}
},
{
@ -202,12 +204,13 @@
"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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" 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-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4\" 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>"
}
},
{
"profile": "country-posters-mfe",
"stage": "experimental",
"label": "Country Posters — Wall + Map",
"file": "country-posters-mfe.vue",
"description": "Country Posters as ONE two-tab element — the countries map and the printable",
"element": "country-posters-mfe",
@ -217,7 +220,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-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" 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-rEKY48xZ75Hf09EduTtEELEIdpGoEFDujcRk3Lwx9/E3P2W/f0iZDRY0JHg2xSM4\" 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>"
}
}
]
@ -226,7 +229,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-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ",
"integrity": "sha384-KKQCv8v895tYjwayG6saIYk3ymn3wmk6X3TEwv+sQ5pU9BDkErSFF7JEuUTdsZCF",
"elements": [
"dashboard-plus-grid"
],
@ -239,6 +242,7 @@
{
"profile": "dashboard-plus-grid",
"stage": "production",
"label": "Dashboard + Grid (baked into one element, stacked to scroll)",
"file": "dashboard-plus-grid.vue",
"description": "Both children are IMPORTED DIRECTLY (compiled into this ONE bundle — no runtime bundle",
"element": "dashboard-plus-grid",
@ -248,7 +252,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-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ\" 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-KKQCv8v895tYjwayG6saIYk3ymn3wmk6X3TEwv+sQ5pU9BDkErSFF7JEuUTdsZCF\" 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": [
{
@ -272,7 +276,7 @@
"bundle": "demo-map",
"scriptUrl": "./demo-map/demo-map.js",
"output": "dx-maps/demo-map/demo-map.js",
"integrity": "sha384-fqvqn/UaQLfib5r8Bs5plcIouQckolyhgYzV/nXeoS7ltC99oH/T5ZuFye/+ZJSt",
"integrity": "sha384-okPjbmNdBwckUKJibLgUkoTjZ2+rwOQNGxWZO+hv8HXCPMWWOZyAawTHo6EOqBk3",
"elements": [
"demo-map"
],
@ -290,7 +294,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-fqvqn/UaQLfib5r8Bs5plcIouQckolyhgYzV/nXeoS7ltC99oH/T5ZuFye/+ZJSt\" 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-okPjbmNdBwckUKJibLgUkoTjZ2+rwOQNGxWZO+hv8HXCPMWWOZyAawTHo6EOqBk3\" 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": [
{
@ -335,6 +339,7 @@
{
"profile": "doxa-maps-spa",
"stage": "experimental",
"label": "Research Gallery (vertical-tab app shell: the seven production maps)",
"file": "doxa-maps-spa.vue",
"description": "The DX-maps app itself: one element whose vertical-tab rail nests every other",
"element": "doxa-maps-spa",
@ -371,7 +376,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-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH",
"integrity": "sha384-B6gF69v23HjaSAYYpOT3XNCu60fKgswgggVrBhT43TB0CGJkOSzYYTTkKDq96+Ch",
"elements": [
"doxa-research-map"
],
@ -380,6 +385,7 @@
{
"profile": "research-map",
"stage": "experimental",
"label": "Research Map",
"file": "research-map.vue",
"description": "The researcher's workbench: every piece a missiologist, demographer or",
"element": "doxa-research-map",
@ -389,7 +395,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-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH\" 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-B6gF69v23HjaSAYYpOT3XNCu60fKgswgggVrBhT43TB0CGJkOSzYYTTkKDq96+Ch\" 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": [
{
@ -415,7 +421,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-d7XChL9kU5af4g0Wc/t4wlgwhLGXrcAq1JGPWznSALICvY2Bdv8r2gekxkDK1XRW",
"integrity": "sha384-CkbrFX71L8DOqo4LtACDbHX9vw7e/ZSR+TczWh0BTqm8Nm60QzR1O7Zr87tkxcG8",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -434,7 +440,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-d7XChL9kU5af4g0Wc/t4wlgwhLGXrcAq1JGPWznSALICvY2Bdv8r2gekxkDK1XRW\" 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-CkbrFX71L8DOqo4LtACDbHX9vw7e/ZSR+TczWh0BTqm8Nm60QzR1O7Zr87tkxcG8\" 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": [
{
@ -604,7 +610,7 @@
"bundle": "gospel-internet",
"scriptUrl": "./gospel-internet/gospel-internet.js",
"output": "dx-maps/gospel-internet/gospel-internet.js",
"integrity": "sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i",
"integrity": "sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl",
"elements": [
"gospel-internet-board"
],
@ -613,6 +619,7 @@
{
"profile": "board",
"stage": "experimental",
"label": "Gospel x Internet — the board",
"heavy": true,
"file": "board.vue",
"description": "For every remaining people group: what gospel resources exist in a language they use, and how much of their country (or Indian state) is online to receive them.",
@ -623,7 +630,7 @@
"scriptUrl": "./gospel-internet/gospel-internet.js",
"embed": {
"iframe": "<iframe src=\"./gospel-internet/board/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-internet/gospel-internet.js\" integrity=\"sha384-oGueXgVn05BKMDaSbY61Gdl/coGTTPu/uMM/BWcYMWCi5Vyr+6N3dk59AKpuDw7i\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
"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-internet/gospel-internet.js\" integrity=\"sha384-r2/iEI33cY/Yx5AxDqaNaXmiqubSasJOXAf6UsW8gS4tD7zmuVLcrcS3522hichl\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
},
"instances": [
{
@ -773,6 +780,7 @@
{
"profile": "gospel-dashboard",
"stage": "production",
"label": "Gospel Dashboard (map + tables baked into one element, stacked to scroll)",
"file": "gospel-dashboard.vue",
"description": "The gospel map and its tables as one scrolling element: 12,379 people-group pins with the real Scripture, film and Bible-story links for each group's own language, above every resource with its URL and the 1,613 groups where nothing was found, exportable as CSV.",
"element": "gospel-resources-map",
@ -803,6 +811,7 @@
{
"profile": "resources-map",
"stage": "experimental",
"label": "Gospel Resources — resources map",
"file": "resources-map.vue",
"description": "12,379 people-group pins over a country choropleth: tap a pin for the Scripture, audio, film, Bible-story and training links that exist in that group's own language with real URLs, tap a country for every group in it, search by group, language or ISO 639-3 code, and filter to the groups where nothing was found.",
"element": "gospel-resources-map",
@ -821,7 +830,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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds",
"integrity": "sha384-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4",
"elements": [
"my-upg-100-list-map"
],
@ -843,7 +852,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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds\" 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-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4\" 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>"
}
},
{
@ -858,12 +867,13 @@
"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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds\" 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-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4\" 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>"
}
},
{
"profile": "upg-100-mfe",
"stage": "production",
"label": "UPG-100 — Map + Prayer Lists",
"file": "upg-100-mfe.vue",
"description": "The standalone, shareable and embeddable composite of the my-upg-100-list family — it nests the map",
"element": "my-upg-100-list-map",
@ -873,7 +883,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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds\" 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-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4\" 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>"
}
}
]
@ -891,6 +901,7 @@
{
"profile": "people-groups-grid",
"stage": "experimental",
"label": "People Groups Grid (Cat-2 prop-table: search + 4 dropdowns + faceted counts; show-search/show-filters + groups-filtered)",
"file": "people-groups-grid.vue",
"description": "The people-groups grid as an owned custom element: card list, search and four",
"element": "people-groups-grid",
@ -945,7 +956,7 @@
"bundle": "plugin-studio",
"scriptUrl": "./plugin-studio/plugin-studio.js",
"output": "dx-maps/plugin-studio/plugin-studio.js",
"integrity": "sha384-1KspSeIUO3xQaKKd+sTg2ezt/+gB/ua2U1g8flIGH+C64uOnzXw2yFLoqLXy8vl8",
"integrity": "sha384-dVe39HIJ0Dw20gfFjUlrOgtMMyN4J99FMOdxnyfoJtdxK3rCy8tjr+RxY5ruTs80",
"elements": [
"plugin-studio"
],
@ -966,6 +977,7 @@
{
"profile": "plugin-studio",
"stage": "experimental",
"label": "Plugin Studio (cap-5 developer studio: every element by capability 5 -> 1)",
"file": "plugin-studio.vue",
"description": "The developer's viewing surface: a sidebar that is the composability ladder",
"element": "plugin-studio",
@ -975,7 +987,7 @@
"scriptUrl": "./plugin-studio/plugin-studio.js",
"embed": {
"iframe": "<iframe src=\"./plugin-studio/plugin-studio/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=\"./plugin-studio/plugin-studio.js\" integrity=\"sha384-1KspSeIUO3xQaKKd+sTg2ezt/+gB/ua2U1g8flIGH+C64uOnzXw2yFLoqLXy8vl8\" crossorigin=\"anonymous\"></script>\n<plugin-studio profile-config='{\"profile\":\"plugin-studio\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></plugin-studio>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./plugin-studio/plugin-studio.js\" integrity=\"sha384-dVe39HIJ0Dw20gfFjUlrOgtMMyN4J99FMOdxnyfoJtdxK3rCy8tjr+RxY5ruTs80\" crossorigin=\"anonymous\"></script>\n<plugin-studio profile-config='{\"profile\":\"plugin-studio\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></plugin-studio>"
},
"instances": [
{
@ -1002,7 +1014,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-p3Skl/DEIsDt/B6QNbW2E5UiI0HCVORMx8ZT5meVLl15FZ97/ZqZeWQETj4dch3+",
"integrity": "sha384-rubpRmSBkm6v202d1whkPHrDHqpD+3+OKsqAYaaYcFHxjH4McsdsZUypXrcHgUVz",
"elements": [
"pplr-data-maps"
],
@ -1011,6 +1023,7 @@
{
"profile": "pplr-data-maps",
"stage": "experimental",
"label": "PPLR Data Maps",
"file": "pplr-data-maps.vue",
"description": "Ten views that let a researcher check the PPLR people-group data by eye",
"element": "pplr-data-maps",
@ -1020,7 +1033,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-p3Skl/DEIsDt/B6QNbW2E5UiI0HCVORMx8ZT5meVLl15FZ97/ZqZeWQETj4dch3+\" 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-rubpRmSBkm6v202d1whkPHrDHqpD+3+OKsqAYaaYcFHxjH4McsdsZUypXrcHgUVz\" 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"
}
@ -1030,7 +1043,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-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs",
"integrity": "sha384-T/NWde52/TY+ljyOu26UBMz9HPVwDymkMlBInRm3XFg8liVBWWfeul1vAPNUUq6K",
"elements": [
"prayer-walk-planner"
],
@ -1048,7 +1061,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-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs\" 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-T/NWde52/TY+ljyOu26UBMz9HPVwDymkMlBInRm3XFg8liVBWWfeul1vAPNUUq6K\" 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>"
}
}
]
@ -1057,7 +1070,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0",
"integrity": "sha384-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy",
"elements": [
"regions-dashboard"
],
@ -1070,6 +1083,7 @@
{
"profile": "region-dashboards",
"stage": "experimental",
"label": "Regions — region + country dashboard",
"file": "region-dashboards.vue",
"description": "The dashboard half of the 2-tab Regions element: given a region (or a",
"element": "regions-dashboard",
@ -1079,12 +1093,13 @@
"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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" 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-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy\" 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>"
}
},
{
"profile": "regions-list",
"stage": "experimental",
"label": "Regions — the list page",
"file": "regions-list.vue",
"description": "A refactor of DX-life's /regions index page (app/pages/regions/index.vue) into",
"element": "regions-dashboard",
@ -1094,12 +1109,13 @@
"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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" 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-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy\" 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>"
}
},
{
"profile": "regions-mfe",
"stage": "production",
"label": "Regions — List + Dashboards",
"file": "regions-mfe.vue",
"description": "The composite: ONE element carrying the SELECT VIEW switcher",
"element": "regions-dashboard",
@ -1109,7 +1125,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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" 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-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy\" 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>"
}
}
]
@ -1118,7 +1134,7 @@
"bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "dx-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY",
"integrity": "sha384-KDXJbKFaAbMwrZNlONidwpxb4AXWHVIHKN+ASJpHjgDTH5Uhfzv5EOXhxVBAzTi0",
"elements": [
"research-dashboard-map"
],
@ -1127,6 +1143,7 @@
{
"profile": "research-dashboard",
"stage": "experimental",
"label": "Research Dashboard",
"file": "research-dashboard.vue",
"description": "Coordinated-Multiple-Views research dashboard for 10/40-window UPGs (live pray.doxa.life): docked facet rail + map-as-hero + linked table/charts, brushing-and-linking over one in-memory store.",
"element": "research-dashboard-map",
@ -1136,7 +1153,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-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY\" 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-KDXJbKFaAbMwrZNlONidwpxb4AXWHVIHKN+ASJpHjgDTH5Uhfzv5EOXhxVBAzTi0\" 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"
}
@ -1159,6 +1176,7 @@
{
"profile": "research-map-plus-grid",
"stage": "production",
"label": "Research Map + Grid (mobile composite, stacked to scroll)",
"file": "research-map-plus-grid.vue",
"description": "The monolithic 7-tab research map (cap-3) on top, the People Groups grid beneath,",
"element": "research-map-plus-grid",
@ -1201,6 +1219,7 @@
{
"profile": "rudder-voice",
"stage": "experimental",
"label": "Rudder — voice to text (desktop)",
"widget": {
"corner": "bottom-right"
},
@ -1235,6 +1254,7 @@
{
"profile": "stack-demo",
"stage": "experimental",
"label": "Stack Demo (two elements stacked to scroll — StackLayout)",
"file": "stack-demo.vue",
"description": "Groups TWO independent elements TOP-TO-BOTTOM so you can embed the pair on a page and",
"element": "stack-demo",
@ -1268,7 +1288,7 @@
"bundle": "upg-neighbor",
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"output": "dx-maps/upg-neighbor/upg-neighbor.js",
"integrity": "sha384-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc",
"integrity": "sha384-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC",
"elements": [
"upg-neighbor"
],
@ -1277,6 +1297,7 @@
{
"profile": "upg-neighbor",
"stage": "experimental",
"label": "My UPG Neighbors",
"file": "upg-neighbor.vue",
"description": "Near-neighbor mobilization on Winter's E-scale: who to mobilize, in what language, where",
"element": "upg-neighbor",
@ -1286,7 +1307,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-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc\" 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-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC\" 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": [
{
@ -1377,6 +1398,7 @@
{
"profile": "wall-of-people-groups",
"stage": "experimental",
"label": "Wall of People Groups",
"file": "wall-of-people-groups.vue",
"description": "Every Doxa people group as a card on one zoomable prayer wall",
"element": "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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds" crossorigin="anonymous"></script>
<script src="../my-upg-100-list.js" integrity="sha384-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4" 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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds" crossorigin="anonymous"></script>
<script src="../my-upg-100-list.js" integrity="sha384-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4" 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-ED6e1MyEoG/x/3yQYi7Rbf7hNW9weyv7Hv8CJ0vwZ60lAMfsfEIlo8TRgoshmQds" crossorigin="anonymous"></script>
<script src="../my-upg-100-list.js" integrity="sha384-C0U354itQsRbzjkVCXMyE8Me4wKbmPqauyckaB+auXRdll+L1HMxbSJ8B9SRY/O4" 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 <plugin-studio> custom element. -->
<script src="../plugin-studio.js" integrity="sha384-1KspSeIUO3xQaKKd+sTg2ezt/+gB/ua2U1g8flIGH+C64uOnzXw2yFLoqLXy8vl8" crossorigin="anonymous"></script>
<script src="../plugin-studio.js" integrity="sha384-dVe39HIJ0Dw20gfFjUlrOgtMMyN4J99FMOdxnyfoJtdxK3rCy8tjr+RxY5ruTs80" 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 <plugin-studio> custom element. -->
<script src="../../plugin-studio.js" integrity="sha384-1KspSeIUO3xQaKKd+sTg2ezt/+gB/ua2U1g8flIGH+C64uOnzXw2yFLoqLXy8vl8" crossorigin="anonymous"></script>
<script src="../../plugin-studio.js" integrity="sha384-dVe39HIJ0Dw20gfFjUlrOgtMMyN4J99FMOdxnyfoJtdxK3rCy8tjr+RxY5ruTs80" 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-p3Skl/DEIsDt/B6QNbW2E5UiI0HCVORMx8ZT5meVLl15FZ97/ZqZeWQETj4dch3+" crossorigin="anonymous"></script>
<script src="../pplr-data-maps.js" integrity="sha384-rubpRmSBkm6v202d1whkPHrDHqpD+3+OKsqAYaaYcFHxjH4McsdsZUypXrcHgUVz" 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-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs" crossorigin="anonymous"></script>
<script src="../prayer-walk-planner.js" integrity="sha384-T/NWde52/TY+ljyOu26UBMz9HPVwDymkMlBInRm3XFg8liVBWWfeul1vAPNUUq6K" 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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy" 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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy" 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-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-C8sYbeAQnDL/S+hHhGHXNtzSjOZXjx9S6usln36EJJ0S9i9kGWS1M+0EDLyRzTcy" 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-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY" crossorigin="anonymous"></script>
<script src="../research-dashboard.js" integrity="sha384-KDXJbKFaAbMwrZNlONidwpxb4AXWHVIHKN+ASJpHjgDTH5Uhfzv5EOXhxVBAzTi0" 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-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC" 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-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC" 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-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc" crossorigin="anonymous"></script>
<script src="../upg-neighbor.js" integrity="sha384-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC" 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-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC" 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-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC" 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-v/CxAUUGTqhuqCO8BGFGuvbKBxnWb5ZWf4XD56dq5SlsG/f2SinCmjGkjsAPIHKc" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-3rvydQZI/y8vGGArQua/O3VWTpBVIbkLcXMK2SQttHKpDOJfJY8epyKY0rJJseJC" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: