Update from source 0d2135425
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 07:10:12 +00:00
parent 529bd65af5
commit 8d4866e4d0
24 changed files with 724 additions and 613 deletions

View file

@ -4,6 +4,7 @@
// Import Vue functions from NPM package
import { ref, computed } from 'vue';
import { readSourceFeatures, matchesExpression, resolveExpr } from '../maps/pin-selection.js';
// Import zoom configuration (region zoom settings are in zoom.js)
import { getRegionZoomConfig, REGION_ZOOM_CONFIG } from '../constants/zoom.js';
@ -470,118 +471,6 @@ export function useMapFly(options = {}) {
} catch (_) { return false; }
}
// Why: map.querySourceFeatures(sourceId, {filter}) is viewport-clipped —
// pins outside the rendered camera are dropped, so legend rows for off-screen
// regions silently no-op when the user is zoomed in. We evaluate the Mapbox
// filter expression against the full source data instead, so fitBounds can
// zoom OUT to a different region or IN to a tight cluster uniformly.
function _resolveExpr(expr, props) {
if (!Array.isArray(expr)) return expr;
const op = expr[0];
switch (op) {
case 'get': return props?.[expr[1]];
case 'literal': return expr[1];
case 'has': return props != null && expr[1] in props;
case '!has': return props == null || !(expr[1] in props);
case '!': return !_resolveExpr(expr[1], props);
case 'coalesce': {
for (let i = 1; i < expr.length; i++) {
const v = _resolveExpr(expr[i], props);
if (v != null) return v;
}
return null;
}
case 'to-number': {
const v = _resolveExpr(expr[1], props);
const n = Number(v);
if (Number.isFinite(n)) return n;
if (expr.length > 2) {
const fb = Number(_resolveExpr(expr[2], props));
return Number.isFinite(fb) ? fb : 0;
}
return NaN;
}
case 'to-string': {
const v = _resolveExpr(expr[1], props);
return v == null ? '' : String(v);
}
case 'to-boolean': return Boolean(_resolveExpr(expr[1], props));
case 'slice': {
const s = _resolveExpr(expr[1], props);
const i = _resolveExpr(expr[2], props);
const j = expr.length > 3 ? _resolveExpr(expr[3], props) : undefined;
if (typeof s !== 'string') return '';
return j != null ? s.slice(i, j) : s.slice(i);
}
default: return expr;
}
}
function _matchesFilter(filter, props) {
if (filter === true) return true;
if (filter === false) return false;
if (!Array.isArray(filter)) return Boolean(filter);
const op = filter[0];
if (op === 'all') {
for (let i = 1; i < filter.length; i++) {
if (!_matchesFilter(filter[i], props)) return false;
}
return true;
}
if (op === 'any') {
for (let i = 1; i < filter.length; i++) {
if (_matchesFilter(filter[i], props)) return true;
}
return false;
}
if (op === '!') return !_matchesFilter(filter[1], props);
if (op === 'has') return props != null && filter[1] in props;
if (op === '!has') return props == null || !(filter[1] in props);
if (op === '==' || op === '!=' || op === '>' || op === '>=' ||
op === '<' || op === '<=') {
// Legacy form: ['==', 'propName', value] (no ['get', ...])
const left = (typeof filter[1] === 'string')
? props?.[filter[1]]
: _resolveExpr(filter[1], props);
const right = _resolveExpr(filter[2], props);
switch (op) {
case '==': return left === right || (left == null && right == null);
case '!=': return !(left === right || (left == null && right == null));
case '>': return left > right;
case '>=': return left >= right;
case '<': return left < right;
case '<=': return left <= right;
}
}
if (op === 'in') {
const v = _resolveExpr(filter[1], props);
const haystack = _resolveExpr(filter[2], props);
if (Array.isArray(haystack)) return haystack.includes(v);
if (typeof haystack === 'string') return haystack.includes(v);
return false;
}
if (op === 'match') {
const input = _resolveExpr(filter[1], props);
const lastIdx = filter.length - 1;
for (let i = 2; i < lastIdx; i += 2) {
const labelRaw = filter[i];
const labels = Array.isArray(labelRaw) ? labelRaw : [labelRaw];
if (labels.includes(input)) return Boolean(_resolveExpr(filter[i + 1], props));
}
return Boolean(_resolveExpr(filter[lastIdx], props));
}
return false;
}
function _readSourceFeatures(map, sourceId) {
const src = map.getSource(sourceId);
if (!src) return [];
const data = src._data ?? src.serialize?.()?.data;
if (!data) return [];
if (Array.isArray(data?.features)) return data.features;
if (data?.type === 'Feature') return [data];
return [];
}
/**
* zoomToLegendRow — uniform "click a legend row, fit the scope it represents."
*
@ -613,7 +502,7 @@ export function useMapFly(options = {}) {
// OUT to fit a few scattered pins. Fit the polygon directly instead, so
// "click Oceania" zooms TO Oceania.
if (opts.regionPolygonSource && map.getSource(opts.regionPolygonSource)) {
const polyFeatures = _readSourceFeatures(map, opts.regionPolygonSource);
const polyFeatures = readSourceFeatures(map, opts.regionPolygonSource);
const regionKey = row.id ?? row.label;
const match = polyFeatures.find(f => {
const p = f?.properties || {};
@ -665,7 +554,7 @@ export function useMapFly(options = {}) {
const filter = opts.matchExpr ?? row.filter;
if (!filter) return;
const allFeatures = _readSourceFeatures(map, sourceId);
const allFeatures = readSourceFeatures(map, sourceId);
if (!allFeatures.length) return;
const lngs = [];
@ -675,7 +564,7 @@ export function useMapFly(options = {}) {
const seen = new Set();
for (const f of allFeatures) {
const props = f?.properties;
if (!_matchesFilter(filter, props)) continue;
if (!matchesExpression(filter, props)) continue;
const id = props?.uniqueId;
if (id != null) {
if (seen.has(id)) continue;

View file

@ -0,0 +1,159 @@
/**
* pin-selection.js — which pins does a Mapbox/MapLibre filter expression actually select?
*
* ★ MOVED, NOT WRITTEN (from useMapFly.js, where it was private). zoomToLegendRow has always had to
* answer this question to fit the camera to a legend row, and it answers it the only way that is
* correct: map.querySourceFeatures(id, {filter}) is VIEWPORT-CLIPPED, so pins outside the camera are
* dropped and an off-screen region silently selects nothing. These read the full source data and
* evaluate the expression in JS instead.
*
* ★ WHY IT HAD TO BE SHARED (PACKETSEL). The research map's prayer packet printed the first 50 of
* every people group whatever the reader had selected. Choosing the right rows means asking exactly
* this question — and the naive alternative, evaluating the filter against the raw data rows, is
* WRONG in a way that would not throw: pin properties are DERIVED from rows (useMapLayers derives
* languageFamily when the API returns null, canonicalizes doxaRegion onto the palette's key forms),
* so a filter written against pin properties does not mean the same thing applied to a row. The
* features the map holds are the only place those two vocabularies agree.
*
* country-posters prints the same kind of packet from the same kind of selection, which is why this
* is in library/ rather than in one plugin.
*
* The evaluator covers the expression subset this product's filters use — all/any/!/has/comparisons/
* in/match, plus get/literal/coalesce/to-number. Anything else evaluates false rather than throwing:
* a packet that prints fewer rows is recoverable, a map that throws mid-print is not.
*/
// Why: map.querySourceFeatures(sourceId, {filter}) is viewport-clipped —
// pins outside the rendered camera are dropped, so legend rows for off-screen
// regions silently no-op when the user is zoomed in. We evaluate the Mapbox
// filter expression against the full source data instead, so fitBounds can
// zoom OUT to a different region or IN to a tight cluster uniformly.
export function resolveExpr(expr, props) {
if (!Array.isArray(expr)) return expr;
const op = expr[0];
switch (op) {
case 'get': return props?.[expr[1]];
case 'literal': return expr[1];
case 'has': return props != null && expr[1] in props;
case '!has': return props == null || !(expr[1] in props);
case '!': return !resolveExpr(expr[1], props);
case 'coalesce': {
for (let i = 1; i < expr.length; i++) {
const v = resolveExpr(expr[i], props);
if (v != null) return v;
}
return null;
}
case 'to-number': {
const v = resolveExpr(expr[1], props);
const n = Number(v);
if (Number.isFinite(n)) return n;
if (expr.length > 2) {
const fb = Number(resolveExpr(expr[2], props));
return Number.isFinite(fb) ? fb : 0;
}
return NaN;
}
case 'to-string': {
const v = resolveExpr(expr[1], props);
return v == null ? '' : String(v);
}
case 'to-boolean': return Boolean(resolveExpr(expr[1], props));
case 'slice': {
const s = resolveExpr(expr[1], props);
const i = resolveExpr(expr[2], props);
const j = expr.length > 3 ? resolveExpr(expr[3], props) : undefined;
if (typeof s !== 'string') return '';
return j != null ? s.slice(i, j) : s.slice(i);
}
default: return expr;
}
}
export function matchesExpression(filter, props) {
if (filter === true) return true;
if (filter === false) return false;
if (!Array.isArray(filter)) return Boolean(filter);
const op = filter[0];
if (op === 'all') {
for (let i = 1; i < filter.length; i++) {
if (!matchesExpression(filter[i], props)) return false;
}
return true;
}
if (op === 'any') {
for (let i = 1; i < filter.length; i++) {
if (matchesExpression(filter[i], props)) return true;
}
return false;
}
if (op === '!') return !matchesExpression(filter[1], props);
if (op === 'has') return props != null && filter[1] in props;
if (op === '!has') return props == null || !(filter[1] in props);
if (op === '==' || op === '!=' || op === '>' || op === '>=' ||
op === '<' || op === '<=') {
// Legacy form: ['==', 'propName', value] (no ['get', ...])
const left = (typeof filter[1] === 'string')
? props?.[filter[1]]
: resolveExpr(filter[1], props);
const right = resolveExpr(filter[2], props);
switch (op) {
case '==': return left === right || (left == null && right == null);
case '!=': return !(left === right || (left == null && right == null));
case '>': return left > right;
case '>=': return left >= right;
case '<': return left < right;
case '<=': return left <= right;
}
}
if (op === 'in') {
const v = resolveExpr(filter[1], props);
const haystack = resolveExpr(filter[2], props);
if (Array.isArray(haystack)) return haystack.includes(v);
if (typeof haystack === 'string') return haystack.includes(v);
return false;
}
if (op === 'match') {
const input = resolveExpr(filter[1], props);
const lastIdx = filter.length - 1;
for (let i = 2; i < lastIdx; i += 2) {
const labelRaw = filter[i];
const labels = Array.isArray(labelRaw) ? labelRaw : [labelRaw];
if (labels.includes(input)) return Boolean(resolveExpr(filter[i + 1], props));
}
return Boolean(resolveExpr(filter[lastIdx], props));
}
return false;
}
export function readSourceFeatures(map, sourceId) {
const src = map.getSource(sourceId);
if (!src) return [];
const data = src._data ?? src.serialize?.()?.data;
if (!data) return [];
if (Array.isArray(data?.features)) return data.features;
if (data?.type === 'Feature') return [data];
return [];
}
/**
* The ids of the pins a set of expressions currently selects, as a Set of strings.
*
* Every expression must match (they are ANDed) because they describe different halves of the same
* question: the layer's own filter says which pins RENDER, and a dim expression says which of those
* are lit. A pin at opacity 0 is not what the reader is looking at.
*
* With NO active expressions this returns every pin's id rather than an empty set — "nothing is
* selected" means everything is on screen, not nothing is.
*/
export function selectedPinIds(map, { sourceId = 'language-families', expressions = [], idKey = 'uniqueId' } = {}) {
const ids = new Set()
const exprs = (expressions || []).filter((e) => e != null && e !== true)
for (const f of readSourceFeatures(map, sourceId)) {
const props = f && f.properties
if (!props) continue
if (exprs.length && !exprs.every((e) => matchesExpression(e, props))) continue
const id = props[idKey]
if (id != null) ids.add(String(id))
}
return ids
}

View file

@ -81,11 +81,6 @@ import { useGeocoderSearch } from '@map/composables/useGeocoderSearch.js'
// the import until that happens — see `openPoster()` below.
let _posterPromise = null
// PERF: useMapPacket builds a multi-page PDF (map page + one detail card per
// people group). It reuses useMapPoster's pipeline, so it's at least as heavy.
// EXPERIMENTAL: dormant behind the shared kill-switch — only fires from the
// SemanticTreeLegend Export → Packet menu item. Lazy-loaded once via openPacket().
let _packetPromise = null
// ── Geocoder search logic moved to @map/composables/useGeocoderSearch.js ──────
// The geocoder-clear guard (_geoBeingCleared + clearGeocoderProgrammatic) and the
@ -1240,52 +1235,95 @@ function onExport(kind) {
if (kind === 'packet') return openPacket()
}
// ─── Packet export (multi-page PDF: map + one card per people group) ─────────
// PERF: useMapPacket reuses useMapPoster's render pipeline — heavy. Lazy-load
// once, mirroring loadPoster()/_posterPromise. Defensive throughout: never
// throw uncaught into the UI; guard against double-run.
// ─── Packet (printed through the shared renderer, like Simple Research's) ─────
// Defensive throughout: never throw uncaught into the UI; guard against double-run.
let _packetBusy = false
function _downloadBlob(blob, filename) {
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = filename
document.body.appendChild(a)
a.click()
a.remove()
setTimeout(() => URL.revokeObjectURL(url), 1000)
}
async function openPacket() {
if (_packetBusy) return
_packetBusy = true
try {
if (!_packetPromise) {
_packetPromise = import('@map/composables/useMapPacket.js')
.then(m => m.useMapPacket(() => map.value))
}
const packet = await _packetPromise
// ★ THE PACKET PRINTS, AND IT PRINTS THROUGH THE SHARED RENDERER (the agent-lens audit card 2, and
// the agent's own rule: an export button opens the print dialog, never hands over a file). This
// built a jsPDF document and downloaded packet.pdf while its poster sibling, two functions up,
// already printed. The fix is NOT to wrap that PDF in a dialog — a PDF blob cannot go in the
// <img> the in-place print frame uses, and every workaround (embed, object, the browser's own
// viewer) prints on some engines and silently does nothing on others, which is the dead-button
// class this file has already paid for twice.
//
// library/composables/usePosterPrints.js ALREADY has printPacket: the same pages, authored as HTML
// with @page rules, printed in place. This map was running a private second implementation of a
// shared product feature. Routing to it deletes the duplicate, drops jspdf from this bundle, and
// the packet gains the pages the shared renderer has that the local one never did (the life
// calendar, the funnel, the prayer wheel — see packet-render.buildPacket's page order).
const [{ usePosterPrints }, { defaultPosterSpec }, { useMapPoster }] = await Promise.all([
import('@map/composables/usePosterPrints.js'),
import('@map/constants/posterDefaults.js'),
import('@map/composables/poster/useMapPoster.js'),
])
// Gather the people groups for the current selection. No reliable
// descendant filter exists across all tabs, so use the currently
// normalized groups. CAP at 50 for overnight safety.
// Same 50-group cap as before: an overnight safety limit, not a design choice.
let groups = mapData.normalizedPeopleGroups.value || []
if (groups.length > 50) {
console.warn(`[research-map] packet export truncated ${groups.length} → 50 people groups`)
console.warn(`[country-posters] packet export truncated ${groups.length} → 50 people groups`)
groups = groups.slice(0, 50)
}
const { defaultPosterSpec } = await import('@map/constants/posterDefaults.js')
// ★ AN EXPLICIT ADAPTER, because the two halves name the same fields differently and a mismatch
// here is SILENT — the packet would print with blank names and empty photos rather than failing.
// The renderer reads slug / name / population / religion / country_code, and usePosterPrints reads
// image_url; this map's normalized rows carry country and imageUrl in camelCase. Mapped once, here,
// where the difference is visible, rather than renaming either side's vocabulary.
const records = groups.map((g) => ({
slug: String(g.slug || g.uniqueId || g.id || ''),
name: g.name,
population: g.population,
// ★ THE DISPLAY NAME, NOT THE CODE, and the order is the whole point. The card prints these two
// straight into the page — flat(g.religion) and flat(g.country_code) — so they are read by a
// person, not matched by a machine. DataSourceManager normalizes `religion` to the CODE and puts
// the readable form in `religionName` (it does the same for country: countryIso is the code,
// countryName the label). Reading religion first would have printed MSN under a people group's
// name, and the field name country_code invites exactly that mistake on the country line.
// Checked against the normalizer rather than guessed: library/api/DataSourceManager.js:357-358.
religion: g.religionName || g.religionLabel || g.religion || '',
country_code: g.countryName || g.countryIsoLabel || g.country || g.countryIso || '',
image_url: g.imageUrl || g.image_url || '',
}))
// Page 1 keeps the LIVE map rather than a fetched poster: this half is the one that knows what is
// currently on screen. The shared renderer interpolates `mapSvg` as raw markup, so the PNG this map
// already knows how to produce rides in as an <img> — a data URL, because the print frame is a
// separate document and an object URL created here would be revoked out from under it.
const spec = defaultPosterSpec({ widthIn: 8.27, heightIn: 11.69, dpi: 150, orientation: 'portrait' })
spec.slots.title = { ...spec.slots.title, text: legendTitle.value || 'Doxa Map' }
spec.slots.legend = { ...spec.slots.legend, rows: legend?.rows?.value || [] }
let mapSvg = ''
try {
const mapBlob = await useMapPoster(() => map.value).render(spec, 'png')
const dataUrl = await new Promise((resolve, reject) => {
const r = new FileReader()
r.onload = () => resolve(String(r.result))
r.onerror = reject
r.readAsDataURL(mapBlob)
})
mapSvg = `<img src="${dataUrl}" alt="" style="width:100%;height:100%;object-fit:contain">`
} catch (e) {
// A cover without the map beats no packet — the same call the shared composable documents.
console.warn('[country-posters] packet map page skipped:', e?.message || e)
}
const blob = await packet.renderPacket(spec, groups, {
source: 'pray.doxa.life',
date: new Date().toISOString().slice(0, 10),
const zone = {
id: String(activeTab.value?.id || 'research-map'),
label: legendTitle.value || tabLabel(activeTab.value) || 'Doxa Map',
zoneKey: String(activeTab.value?.id || 'research-map'),
}
const prints = usePosterPrints({
records: () => records,
lang: () => String(uiLocale.value || 'en').split('-')[0],
label: () => zone.label,
})
_downloadBlob(blob, 'packet.pdf')
await prints.printPacket(zone, { mapSvg })
} catch (err) {
console.error('[research-map] packet export failed:', err)
console.error('[country-posters] packet export failed:', err)
} finally {
_packetBusy = false
}

View file

@ -2,7 +2,7 @@
/**
* country-posters-mfe.vue — Country Posters as a TWO-TAB element.
*
* @element country-posters-mfe
* @element country-posters-map
* @description Country Posters as ONE two-tab element — the countries map and the printable
* poster wall behind a single view switcher, structured like the UPG-100 list. The switcher is
* the library's shared ViewSelect, not a third hand-rolled copy.

View file

@ -1405,16 +1405,40 @@ async function openPacket() {
// shared product feature. Routing to it deletes the duplicate, drops jspdf from this bundle, and
// the packet gains the pages the shared renderer has that the local one never did (the life
// calendar, the funnel, the prayer wheel — see packet-render.buildPacket's page order).
const [{ usePosterPrints }, { defaultPosterSpec }, { useMapPoster }] = await Promise.all([
const [{ usePosterPrints }, { defaultPosterSpec }, { useMapPoster }, { selectedPinIds }] = await Promise.all([
import('@map/composables/usePosterPrints.js'),
import('@map/constants/posterDefaults.js'),
import('@map/composables/poster/useMapPoster.js'),
import('@map/maps/pin-selection.js'),
])
// Same 50-group cap as before: an overnight safety limit, not a design choice.
let groups = mapData.normalizedPeopleGroups.value || []
// ★ THE PACKET PRINTS WHAT THE READER IS LOOKING AT (PACKETSEL). It printed the first 50 of every
// people group whatever was selected — a reader who had narrowed the map to one language family
// got a packet about somebody else. The rows now come from the pins currently SELECTED: the
// layer's own filter says which pins render, `_pinMatchExpr` says which of those are lit (the
// affinity tab dims rather than filters), and a pin at opacity 0 is not what the reader sees.
//
// Asked of the MAP's features, not of the rows, and that distinction is the whole reason this
// lives in library/maps/pin-selection.js: pin properties are DERIVED from rows — useMapLayers
// fills languageFamily in when the API returns null and canonicalizes doxaRegion onto the
// palette's key forms — so evaluating a pin filter against a raw row is wrong in a way that never
// throws. The features the map holds are where the two vocabularies agree.
const all = mapData.normalizedPeopleGroups.value || []
const active = [map.value?.getFilter?.('language-family-pins') || null, _pinMatchExpr].filter(Boolean)
let groups = all
if (active.length) {
const ids = selectedPinIds(map.value, { expressions: active })
const picked = all.filter((g) => ids.has(String(g.uniqueId ?? g.id ?? '')))
// A selection that matches no ROW is an id mismatch, not an empty selection — print the whole
// list rather than silently shipping a packet about nothing, and say so.
if (picked.length) groups = picked
else console.warn(`[research-map] packet: ${ids.size} pin(s) selected but no rows matched; printing the full list`)
}
// The cap is an overnight safety limit, not a design choice — so when it bites, the packet says so
// on its cover rather than quietly being a different packet than the reader asked for.
const selectedTotal = groups.length
if (groups.length > 50) {
console.warn(`[research-map] packet export truncated ${groups.length} → 50 people groups`)
console.warn(`[research-map] packet truncated ${groups.length} → 50 people groups`)
groups = groups.slice(0, 50)
}
@ -1461,9 +1485,10 @@ async function openPacket() {
console.warn('[research-map] packet map page skipped:', e?.message || e)
}
const baseLabel = legendTitle.value || tabLabel(activeTab.value) || 'Doxa Map'
const zone = {
id: String(activeTab.value?.id || 'research-map'),
label: legendTitle.value || tabLabel(activeTab.value) || 'Doxa Map',
label: selectedTotal > groups.length ? `${baseLabel} — ${groups.length} of ${selectedTotal}` : baseLabel,
zoneKey: String(activeTab.value?.id || 'research-map'),
}
const prints = usePosterPrints({

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-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY" 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-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY" 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-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY" 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-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL" crossorigin="anonymous"></script>
<script src="../../dashboard-plus-grid.js" integrity="sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee" 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-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL" crossorigin="anonymous"></script>
<script src="../dashboard-plus-grid.js" integrity="sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -167,7 +167,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "dx-maps/country-posters/country-posters.js",
"integrity": "sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp",
"integrity": "sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY",
"elements": [
"country-posters-map"
],
@ -189,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-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" 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-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" 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>"
}
},
{
@ -204,7 +204,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" 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-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" 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>"
}
},
{
@ -213,14 +213,14 @@
"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",
"element": "country-posters-map",
"type": "nested-elements-mfe",
"isMap": true,
"iframeUrl": "./country-posters/country-posters-mfe/index.html",
"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-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" 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-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" 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>"
}
}
]
@ -229,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-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL",
"integrity": "sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee",
"elements": [
"dashboard-plus-grid"
],
@ -252,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-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL\" 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-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee\" 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": [
{
@ -376,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-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9",
"integrity": "sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs",
"elements": [
"doxa-research-map"
],
@ -395,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-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9\" 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-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs\" 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": [
{
@ -421,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-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ",
"integrity": "sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -440,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-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ\" 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-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6\" 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": [
{
@ -1134,7 +1134,7 @@
"bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "dx-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb",
"integrity": "sha384-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP",
"elements": [
"research-dashboard-map"
],
@ -1153,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-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb\" 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-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP\" 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"
}

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-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9" crossorigin="anonymous"></script>
<script src="../doxa-research-map.js" integrity="sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs" 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-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9" crossorigin="anonymous"></script>
<script src="../../doxa-research-map.js" integrity="sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs" 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-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6" 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-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6" 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-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ" crossorigin="anonymous"></script>
<script src="../doxa-simple-map.js" integrity="sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6" 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-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ" crossorigin="anonymous"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -167,7 +167,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "dx-maps/country-posters/country-posters.js",
"integrity": "sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp",
"integrity": "sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY",
"elements": [
"country-posters-map"
],
@ -189,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-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" 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-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" 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>"
}
},
{
@ -204,7 +204,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" 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-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" 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>"
}
},
{
@ -213,14 +213,14 @@
"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",
"element": "country-posters-map",
"type": "nested-elements-mfe",
"isMap": true,
"iframeUrl": "./country-posters/country-posters-mfe/index.html",
"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-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" 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-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" 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>"
}
}
]
@ -229,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-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL",
"integrity": "sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee",
"elements": [
"dashboard-plus-grid"
],
@ -252,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-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL\" 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-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee\" 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": [
{
@ -376,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-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9",
"integrity": "sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs",
"elements": [
"doxa-research-map"
],
@ -395,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-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9\" 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-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs\" 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": [
{
@ -421,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-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ",
"integrity": "sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -440,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-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ\" 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-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6\" 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": [
{
@ -1134,7 +1134,7 @@
"bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "dx-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb",
"integrity": "sha384-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP",
"elements": [
"research-dashboard-map"
],
@ -1153,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-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb\" 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-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP\" 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"
}

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-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb" crossorigin="anonymous"></script>
<script src="../research-dashboard.js" integrity="sha384-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: