Outbound conversion tracking: utm_source on every people-group link
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions

Every outbound people-group link (pray / adopt / research, popup + dashboard
drawer) now carries a standard utm_source so the destination site's analytics can
measure traffic arriving through the maps. Per-embed override via profile-config
utmSource or window.DOXA_UTM_SOURCE; default 'agwm'. Legacy source=doxalife kept.
Also: three stale shell comments corrected (panes grid is live; bundles use the
window.mapboxgl global, not a rollup external; Gospel Access items are wired).
This commit is contained in:
doxa-maps 2026-09-16 00:43:33 +00:00
parent 5c73248c6e
commit bc8bd971b4
30 changed files with 183 additions and 164 deletions

View file

@ -289,7 +289,7 @@ const activeLegendType = computed(() => legendTypeMap[activeTab.value?.legend] ?
// Maps tab `popup` config → PeopleGroupDetail `action` prop.
// 'adoption' → Adopt button (→ /adopt/<slug>/?source=doxalife on current origin)
// anything else → Pray button (→ https://pray.doxa.life/<slug>?source=doxalife)
// anything else → Pray button (→ https://pray.doxa.life/<slug>?source=doxalife&utm_source=<utmSource|agwm>)
const activePopupAction = computed(() => activeTab.value?.popup === 'adoption' ? 'adopt' : 'pray')
// ─── Map ID ───────────────────────────────────────────────────────────────────

View file

@ -67,14 +67,18 @@ function resolveUrl(spec, r, fallback) {
const prayHref = computed(() => {
const r = record.value
if (!r) return null
const def = `https://pray.doxa.life/${encodeURIComponent(r.slug || '')}?source=doxalife`
// utm_source: outbound-traffic attribution (see PeopleGroupDetail.vue) — cfg
// override wins; default 'agwm'.
const utm = encodeURIComponent(String(detailCfg.value.utmSource || cfg.utmSource || 'agwm'))
const def = `https://pray.doxa.life/${encodeURIComponent(r.slug || '')}?source=doxalife&utm_source=${utm}`
return resolveUrl(detailCfg.value.prayUrl, r, def)
})
const moreInfoHref = computed(() => {
const r = record.value
if (!r) return null
const origin = (typeof window !== 'undefined' && window.location?.origin) || 'https://doxa.life'
const def = `${origin}/research/${encodeURIComponent(r.slug || '')}/`
const utm = encodeURIComponent(String(detailCfg.value.utmSource || cfg.utmSource || 'agwm'))
const def = `${origin}/research/${encodeURIComponent(r.slug || '')}/?utm_source=${utm}`
return resolveUrl(detailCfg.value.moreInfoUrl, r, def)
})
const prayLabel = computed(() => detailCfg.value.prayLabel || 'Pray for this people group')

View file

@ -12,8 +12,9 @@
<link rel="modulepreload" href="./doxa-maps/doxa-simple-map/doxa-simple-map.js" />
<!-- ── Mapbox GL peer: loaded ONCE by the wrapper (the shell owns the version).
Every profile bundle marks mapbox-gl `external`, so they all share THIS
single instance — one download, one parse, one library.
Profile bundles never import mapbox-gl — they use the `window.mapboxgl`
global this shell provides, so they all share THIS single instance — one
download, one parse, one library.
TODO(prod): self-host these files same-origin so CSP can be `worker-src 'self'`
instead of `blob:`, and so the F-Droid/offline builds carry no CDN dep. ── -->
<link href="https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.css" rel="stylesheet" />
@ -842,8 +843,7 @@ const PROFILES = {
// CITIES WITH INTERNET — connectivity where the unengaged people groups live.
// The nav has carried this id as a placeholder since 2026-07-29; this entry is
// what turns it into a real app. `profile` is the .vue FILENAME, not the folder.
// No `panes` key: this ships a list profile only, so the shell keeps its original
// single-mount path. A map pane lands later.
// Ships WITH `panes` (map/list/operators below) — the pane grid is live.
'cities-with-internet': {
tag: 'cities-internet-map',
src: './doxa-maps/cities-internet/cities-internet.js',

View file

@ -70,7 +70,7 @@ export const NAV = [
// ── GOSPEL ACCESS — where the gospel can actually REACH: the infrastructure
// (internet-connected cities) and the assets (gospel resources) that make
// access possible. Populated by the maintainer 2026-07-29.
// ⚠ NO BUNDLES YET — both render the placeholder card.
// Both items are wired to real bundles (cities-internet + gospel-resources).
{
kind: 'section', id: 'gospel-access', label: 'Gospel Access', icon: 'book', target: 'both',
children: [

View file

@ -187,7 +187,7 @@ const props = defineProps({
},
/**
* Which primary action button to show.
* 'pray' → "Pray for them" → https://pray.doxa.life/<slug>?source=doxalife
* 'pray' → "Pray for them" → https://pray.doxa.life/<slug>?source=doxalife&utm_source=<utmSource|agwm>
* 'adopt' → "Adopt them" → https://doxa.life/adopt/<slug>/
* 'none' → primary button hidden; only "More info" shown
* Default comes from injected tab config (later). For now, falls back to 'pray'.
@ -200,6 +200,8 @@ const props = defineProps({
});
const uiStore = inject('uiStore');
// Per-embed config (ProfileLoader provides it) — used for outbound-link attribution.
const profileConfig = inject('profileConfig', null);
// Get legend state for conditional rendering
const legendState = computed(() => uiStore.legendState);
@ -368,16 +370,29 @@ function handleClose() {
uiStore.selectPeopleGroup(null); // Clears selection and returns to prayer mode
}
// ── OUTBOUND TRAFFIC ATTRIBUTION (utm_source) ────────────────────────────────
// Every outbound people-group link carries a standard `utm_source` so the
// destination site's analytics can measure the traffic arriving THROUGH THE MAPS
// (the maps-as-mobilizers conversion metric). Per-embed override: profile-config
// `utmSource` (a partner site sets its own tag) or window.DOXA_UTM_SOURCE (host
// page override); default 'agwm'. The legacy `source=doxalife` param is KEPT so
// any existing consumer of it keeps working.
function utmSource() {
const fromConfig = profileConfig?.value?.utmSource
const fromHost = (typeof window !== 'undefined' && window.DOXA_UTM_SOURCE) || ''
return encodeURIComponent(String(fromConfig || fromHost || 'agwm'))
}
// Slug-based URL templates (see docs/feedback.md → Section E).
// These open the DOXA-site flow for the active people group.
function prayUrl(slug) { return `https://pray.doxa.life/${encodeURIComponent(slug)}?source=doxalife` }
function prayUrl(slug) { return `https://pray.doxa.life/${encodeURIComponent(slug)}?source=doxalife&utm_source=${utmSource()}` }
// Adopt form lives on the SAME WordPress site the map is embedded in — use the
// current origin so the link works in local dev (localhost:10013), staging,
// and production without a hardcoded host. Pattern: /adopt/<slug>/?source=doxalife
function adoptUrl(slug) {
// Same fix as researchUrl — see siteOrigin() below. This had the identical
// window.location.origin bug, so it would have broken in the app too.
return `${siteOrigin()}/adopt/${encodeURIComponent(slug)}/?source=doxalife`
return `${siteOrigin()}/adopt/${encodeURIComponent(slug)}/?source=doxalife&utm_source=${utmSource()}`
}
// ── SITE-LINK ORIGIN ────────────────────────────────────────────────────────
// These links open PAGES ON THE DOXA SITE (a /research/<slug>/ or /adopt/<slug>/
@ -402,7 +417,7 @@ function siteOrigin() {
return String(fromHost || 'https://doxa.life').replace(/\/+$/, '')
}
function researchUrl(slug) {
return `${siteOrigin()}/research/${encodeURIComponent(slug)}/`
return `${siteOrigin()}/research/${encodeURIComponent(slug)}/?utm_source=${utmSource()}`
}
function handleActionPrimary() {

View file

@ -181,7 +181,7 @@ const props = defineProps({
},
/**
* Primary action button rendered in the pin-detail popup.
* 'pray' → "Pray for them" → pray.doxa.life/<slug>?source=doxalife
* 'pray' → "Pray for them" → pray.doxa.life/<slug>?source=doxalife&utm_source=<utmSource|agwm>
* 'adopt' → "Adopt" → /adopt/<slug>/?source=doxalife on current origin
*/
popupAction: {

View file

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

View file

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

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"country-posters","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"country-posters","scriptUrl":"./country-posters/country-posters.js","output":"doxa-maps/country-posters/country-posters.js","integrity":"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw","elements":["country-posters-map"],"profiles":[{"profile":"countries-map","file":"countries-map.vue","description":"","element":"country-posters-map","iframeUrl":"./country-posters/countries-map/index.html","scriptUrl":"./country-posters/country-posters.js","embed":{"iframe":"\u003ciframe src=\"./country-posters/countries-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./country-posters/country-posters.js\" integrity=\"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccountry-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/country-posters-map>"}},{"profile":"country-poster-wall","file":"country-poster-wall.vue","description":"","element":"country-posters-map","iframeUrl":"./country-posters/country-poster-wall/index.html","scriptUrl":"./country-posters/country-posters.js","embed":{"iframe":"\u003ciframe src=\"./country-posters/country-poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./country-posters/country-posters.js\" integrity=\"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccountry-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/country-posters-map>"}}]}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"country-posters","scriptUrl":"./country-posters/country-posters.js","output":"doxa-maps/country-posters/country-posters.js","integrity":"sha384-Ada9iVH/5vy4Jf3tD45dagTboL6LhlJfjxAqLybfLc6y6FHxJ9we7daBjjCqcvXY","elements":["country-posters-map"],"profiles":[{"profile":"countries-map","file":"countries-map.vue","description":"","element":"country-posters-map","iframeUrl":"./country-posters/countries-map/index.html","scriptUrl":"./country-posters/country-posters.js","embed":{"iframe":"\u003ciframe src=\"./country-posters/countries-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./country-posters/country-posters.js\" integrity=\"sha384-Ada9iVH/5vy4Jf3tD45dagTboL6LhlJfjxAqLybfLc6y6FHxJ9we7daBjjCqcvXY\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccountry-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/country-posters-map>"}},{"profile":"country-poster-wall","file":"country-poster-wall.vue","description":"","element":"country-posters-map","iframeUrl":"./country-posters/country-poster-wall/index.html","scriptUrl":"./country-posters/country-posters.js","embed":{"iframe":"\u003ciframe src=\"./country-posters/country-poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./country-posters/country-posters.js\" integrity=\"sha384-Ada9iVH/5vy4Jf3tD45dagTboL6LhlJfjxAqLybfLc6y6FHxJ9we7daBjjCqcvXY\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccountry-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/country-posters-map>"}}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

File diff suppressed because one or more lines are too long

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"doxa-research-map","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"doxa-research-map","scriptUrl":"./doxa-research-map/doxa-research-map.js","output":"doxa-maps/doxa-research-map/doxa-research-map.js","integrity":"sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR","elements":["doxa-research-map"],"profiles":[{"profile":"research-map","file":"research-map.vue","description":"","element":"doxa-research-map","iframeUrl":"./doxa-research-map/research-map/index.html","scriptUrl":"./doxa-research-map/doxa-research-map.js","embed":{"iframe":"\u003ciframe src=\"./doxa-research-map/research-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR\" crossorigin=\"anonymous\">\u003c/script>\n\u003cdoxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/doxa-research-map>"}}]}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"doxa-research-map","scriptUrl":"./doxa-research-map/doxa-research-map.js","output":"doxa-maps/doxa-research-map/doxa-research-map.js","integrity":"sha384-dG3yvWGpnBpJdRh/tIlq/gFSCNqraHcror9WAcCAi37F/Nn9xxfq3COqjz0uELpn","elements":["doxa-research-map"],"profiles":[{"profile":"research-map","file":"research-map.vue","description":"","element":"doxa-research-map","iframeUrl":"./doxa-research-map/research-map/index.html","scriptUrl":"./doxa-research-map/doxa-research-map.js","embed":{"iframe":"\u003ciframe src=\"./doxa-research-map/research-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-dG3yvWGpnBpJdRh/tIlq/gFSCNqraHcror9WAcCAi37F/Nn9xxfq3COqjz0uELpn\" crossorigin=\"anonymous\">\u003c/script>\n\u003cdoxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/doxa-research-map>"}}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

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

File diff suppressed because one or more lines are too long

View file

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

View file

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

View file

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

View file

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

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"doxa-simple-map","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"doxa-simple-map","scriptUrl":"./doxa-simple-map/doxa-simple-map.js","output":"doxa-maps/doxa-simple-map/doxa-simple-map.js","integrity":"sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf","elements":["doxa-map","doxa-simple-map"],"profiles":[{"profile":"doxa-simple-map","file":"doxa-simple-map.vue","description":"","element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/index.html","scriptUrl":"./doxa-simple-map/doxa-simple-map.js","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf\" crossorigin=\"anonymous\">\u003c/script>\n\u003cdoxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/doxa-map>"},"instances":[{"id":"prayer","title":"Prayer Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-prayer","dataSource":"pray-tools","tabs":[{"id":"prayer","colorStrategy":"prayer","legend":"prayer","popup":"prayer"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/prayer/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/prayer/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}},{"id":"engagement","title":"Engagement Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-engagement","dataSource":"pray-tools","tabs":[{"id":"engagement","colorStrategy":"engagement","legend":"engagement","popup":"engagement"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/engagement/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/engagement/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}},{"id":"adoption","title":"Adoption Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-adoption","dataSource":"pray-tools","tabs":[{"id":"adoption","colorStrategy":"adoption","legend":"adoption","popup":"adoption"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/adoption/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/adoption/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}}]}]}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"doxa-simple-map","scriptUrl":"./doxa-simple-map/doxa-simple-map.js","output":"doxa-maps/doxa-simple-map/doxa-simple-map.js","integrity":"sha384-zZre3qEFM7yYxO9VkxotyU7nM0FYNV7ixu1UO6fIQQeEFrFXO4faSD+kNnm2WXY5","elements":["doxa-map","doxa-simple-map"],"profiles":[{"profile":"doxa-simple-map","file":"doxa-simple-map.vue","description":"","element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/index.html","scriptUrl":"./doxa-simple-map/doxa-simple-map.js","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-zZre3qEFM7yYxO9VkxotyU7nM0FYNV7ixu1UO6fIQQeEFrFXO4faSD+kNnm2WXY5\" crossorigin=\"anonymous\">\u003c/script>\n\u003cdoxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/doxa-map>"},"instances":[{"id":"prayer","title":"Prayer Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-prayer","dataSource":"pray-tools","tabs":[{"id":"prayer","colorStrategy":"prayer","legend":"prayer","popup":"prayer"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/prayer/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/prayer/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}},{"id":"engagement","title":"Engagement Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-engagement","dataSource":"pray-tools","tabs":[{"id":"engagement","colorStrategy":"engagement","legend":"engagement","popup":"engagement"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/engagement/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/engagement/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}},{"id":"adoption","title":"Adoption Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-adoption","dataSource":"pray-tools","tabs":[{"id":"adoption","colorStrategy":"adoption","legend":"adoption","popup":"adoption"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/adoption/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/adoption/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}}]}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

File diff suppressed because one or more lines are too long

View file

@ -56,7 +56,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "doxa-maps/country-posters/country-posters.js",
"integrity": "sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw",
"integrity": "sha384-Ada9iVH/5vy4Jf3tD45dagTboL6LhlJfjxAqLybfLc6y6FHxJ9we7daBjjCqcvXY",
"elements": [
"country-posters-map"
],
@ -70,7 +70,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/countries-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></country-posters-map>"
"script": "<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Ada9iVH/5vy4Jf3tD45dagTboL6LhlJfjxAqLybfLc6y6FHxJ9we7daBjjCqcvXY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></country-posters-map>"
}
},
{
@ -82,7 +82,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></country-posters-map>"
"script": "<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Ada9iVH/5vy4Jf3tD45dagTboL6LhlJfjxAqLybfLc6y6FHxJ9we7daBjjCqcvXY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></country-posters-map>"
}
}
]
@ -115,7 +115,7 @@
"bundle": "doxa-research-map",
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"output": "doxa-maps/doxa-research-map/doxa-research-map.js",
"integrity": "sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR",
"integrity": "sha384-dG3yvWGpnBpJdRh/tIlq/gFSCNqraHcror9WAcCAi37F/Nn9xxfq3COqjz0uELpn",
"elements": [
"doxa-research-map"
],
@ -129,7 +129,7 @@
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"embed": {
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></doxa-research-map>"
"script": "<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-dG3yvWGpnBpJdRh/tIlq/gFSCNqraHcror9WAcCAi37F/Nn9xxfq3COqjz0uELpn\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></doxa-research-map>"
}
}
]
@ -138,7 +138,7 @@
"bundle": "doxa-simple-map",
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
"output": "doxa-maps/doxa-simple-map/doxa-simple-map.js",
"integrity": "sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf",
"integrity": "sha384-zZre3qEFM7yYxO9VkxotyU7nM0FYNV7ixu1UO6fIQQeEFrFXO4faSD+kNnm2WXY5",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -153,7 +153,7 @@
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
"embed": {
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></doxa-map>"
"script": "<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-zZre3qEFM7yYxO9VkxotyU7nM0FYNV7ixu1UO6fIQQeEFrFXO4faSD+kNnm2WXY5\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></doxa-map>"
},
"instances": [
{
@ -292,7 +292,7 @@
"bundle": "my-upg-100-list",
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"output": "doxa-maps/my-upg-100-list/my-upg-100-list.js",
"integrity": "sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc",
"integrity": "sha384-HK02YJ86sJDOGeBIc8Y+2oTOlNeVpoM5e8zrdrQ7sYt6+Du7IZubrO+jXanaEXnN",
"elements": [
"my-upg-100-list-map"
],
@ -306,7 +306,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": {
"iframe": "<iframe src=\"./my-upg-100-list/poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></my-upg-100-list-map>"
"script": "<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-HK02YJ86sJDOGeBIc8Y+2oTOlNeVpoM5e8zrdrQ7sYt6+Du7IZubrO+jXanaEXnN\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></my-upg-100-list-map>"
}
},
{
@ -318,7 +318,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": {
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></my-upg-100-list-map>"
"script": "<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-HK02YJ86sJDOGeBIc8Y+2oTOlNeVpoM5e8zrdrQ7sYt6+Du7IZubrO+jXanaEXnN\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></my-upg-100-list-map>"
}
}
]
@ -327,7 +327,7 @@
"bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "doxa-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74",
"integrity": "sha384-Zf3wtybRsrR/qoIEjO2zSuMOT6TwLdjBoKY4SYhBQwdEzH/Rzx8ZIVMH6aWRzgoK",
"elements": [
"research-dashboard-map"
],
@ -341,7 +341,7 @@
"scriptUrl": "./research-dashboard/research-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></research-dashboard-map>"
"script": "<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-Zf3wtybRsrR/qoIEjO2zSuMOT6TwLdjBoKY4SYhBQwdEzH/Rzx8ZIVMH6aWRzgoK\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></research-dashboard-map>"
},
"bundle": "research-dashboard"
}

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"my-upg-100-list","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"my-upg-100-list","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","output":"doxa-maps/my-upg-100-list/my-upg-100-list.js","integrity":"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc","elements":["my-upg-100-list-map"],"profiles":[{"profile":"poster-wall","file":"poster-wall.vue","description":"","element":"my-upg-100-list-map","iframeUrl":"./my-upg-100-list/poster-wall/index.html","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","embed":{"iframe":"\u003ciframe src=\"./my-upg-100-list/poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc\" crossorigin=\"anonymous\">\u003c/script>\n\u003cmy-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/my-upg-100-list-map>"}},{"profile":"upg-100-list","file":"upg-100-list.vue","description":"","element":"my-upg-100-list-map","iframeUrl":"./my-upg-100-list/upg-100-list/index.html","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","embed":{"iframe":"\u003ciframe src=\"./my-upg-100-list/upg-100-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc\" crossorigin=\"anonymous\">\u003c/script>\n\u003cmy-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/my-upg-100-list-map>"}}]}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"my-upg-100-list","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","output":"doxa-maps/my-upg-100-list/my-upg-100-list.js","integrity":"sha384-HK02YJ86sJDOGeBIc8Y+2oTOlNeVpoM5e8zrdrQ7sYt6+Du7IZubrO+jXanaEXnN","elements":["my-upg-100-list-map"],"profiles":[{"profile":"poster-wall","file":"poster-wall.vue","description":"","element":"my-upg-100-list-map","iframeUrl":"./my-upg-100-list/poster-wall/index.html","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","embed":{"iframe":"\u003ciframe src=\"./my-upg-100-list/poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-HK02YJ86sJDOGeBIc8Y+2oTOlNeVpoM5e8zrdrQ7sYt6+Du7IZubrO+jXanaEXnN\" crossorigin=\"anonymous\">\u003c/script>\n\u003cmy-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/my-upg-100-list-map>"}},{"profile":"upg-100-list","file":"upg-100-list.vue","description":"","element":"my-upg-100-list-map","iframeUrl":"./my-upg-100-list/upg-100-list/index.html","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","embed":{"iframe":"\u003ciframe src=\"./my-upg-100-list/upg-100-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-HK02YJ86sJDOGeBIc8Y+2oTOlNeVpoM5e8zrdrQ7sYt6+Du7IZubrO+jXanaEXnN\" crossorigin=\"anonymous\">\u003c/script>\n\u003cmy-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/my-upg-100-list-map>"}}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

File diff suppressed because one or more lines are too long

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js" integrity="sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc" crossorigin="anonymous"></script>
<script src="../my-upg-100-list.js" integrity="sha384-HK02YJ86sJDOGeBIc8Y+2oTOlNeVpoM5e8zrdrQ7sYt6+Du7IZubrO+jXanaEXnN" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js" integrity="sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc" crossorigin="anonymous"></script>
<script src="../my-upg-100-list.js" integrity="sha384-HK02YJ86sJDOGeBIc8Y+2oTOlNeVpoM5e8zrdrQ7sYt6+Du7IZubrO+jXanaEXnN" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"research-dashboard","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"research-dashboard","scriptUrl":"./research-dashboard/research-dashboard.js","output":"doxa-maps/research-dashboard/research-dashboard.js","integrity":"sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74","elements":["research-dashboard-map"],"profiles":[{"profile":"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","iframeUrl":"./research-dashboard/research-dashboard/index.html","scriptUrl":"./research-dashboard/research-dashboard.js","embed":{"iframe":"\u003ciframe src=\"./research-dashboard/research-dashboard/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74\" crossorigin=\"anonymous\">\u003c/script>\n\u003cresearch-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/research-dashboard-map>"},"bundle":"research-dashboard"}]}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"research-dashboard","scriptUrl":"./research-dashboard/research-dashboard.js","output":"doxa-maps/research-dashboard/research-dashboard.js","integrity":"sha384-Zf3wtybRsrR/qoIEjO2zSuMOT6TwLdjBoKY4SYhBQwdEzH/Rzx8ZIVMH6aWRzgoK","elements":["research-dashboard-map"],"profiles":[{"profile":"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","iframeUrl":"./research-dashboard/research-dashboard/index.html","scriptUrl":"./research-dashboard/research-dashboard.js","embed":{"iframe":"\u003ciframe src=\"./research-dashboard/research-dashboard/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-Zf3wtybRsrR/qoIEjO2zSuMOT6TwLdjBoKY4SYhBQwdEzH/Rzx8ZIVMH6aWRzgoK\" crossorigin=\"anonymous\">\u003c/script>\n\u003cresearch-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/research-dashboard-map>"},"bundle":"research-dashboard"}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -193,7 +193,7 @@
.rd-bt{ flex:1 1 auto; height:11px; background:#eef1f6; border-radius:3px; overflow:hidden; }
.rd-bf{ display:block; height:100%; border-radius:3px; transition:width .35s cubic-bezier(.4,0,.2,1); }
.rd-bv{ flex:0 0 auto; color:var(--rd-muted,#6b7686); font-variant-numeric:tabular-nums; min-width:30px; text-align:right; }
`,"rd-charts"),(d,_)=>(Q(),oe("aside",{class:"rd-charts","data-region":"charts-rail",onClick:f},[_[0]||(_[0]=R("div",{class:"rd-h"},"Charts",-1)),(Q(!0),oe(Se,null,tt(i.value,b=>(Q(),oe(Se,{key:b.id},[b.type==="donut"?(Q(),oe("div",{key:0,class:"rd-chart","data-chart":b.facet},[R("div",j_,de(b.title),1),R("div",K_,[(Q(),oe("svg",{class:qe(["rd-donut",{"has-sel":c(b.facet)}]),viewBox:"0 0 132 132",role:"img","aria-label":b.title+" donut"},[(Q(!0),oe(Se,null,tt(b.geometry,y=>(Q(),oe("path",{key:y.key,d:y.path,fill:y.color,class:qe(["rd-slice",{on:l(b.facet,y.key)}]),"data-facet":b.facet,"data-key":y.key},[R("title",null,de(y.key)+": "+de(y.value)+" ("+de(y.pct)+"%)",1)],10,H_))),128))],10,G_)),R("div",z_,[(Q(!0),oe(Se,null,tt(b.geometry,y=>(Q(),oe("span",{key:y.key,class:qe(["rd-li",{on:l(b.facet,y.key)}]),"data-facet":b.facet,"data-key":y.key},[R("i",{style:Bt({background:y.color})},null,4),Ve(de(y.key),1),R("b",null,de(y.value),1)],10,V_))),128))])])],8,U_)):(Q(),oe("div",{key:1,class:"rd-chart","data-chart":b.facet},[R("div",Y_,de(b.title),1),R("div",q_,[(Q(!0),oe(Se,null,tt(b.geometry,y=>(Q(),oe("div",{key:y.key,class:qe(["rd-bar",{on:l(b.facet,y.key)}]),"data-facet":b.facet,"data-key":y.key},[R("span",X_,de(y.key),1),R("span",Z_,[R("span",{class:"rd-bf",style:Bt({width:y.frac*100+"%",background:y.color})},null,4)]),R("span",Q_,de(y.value),1)],10,J_))),128))])],8,W_))],64))),128))]))}},ty={class:"rd-detail","data-region":"detail-drawer"},ny={class:"rd-dh"},oy={key:0,class:"rd-empty","data-detail-empty":""},ay={class:"rd-top"},ry=["src","alt"],sy={key:1,class:"rd-ph","data-detail-thumb":""},iy={class:"rd-name","data-detail-name":""},ly={class:"rd-meta"},cy={class:"rd-actions"},uy=["href","title"],dy=["href","title"],fy={class:"rd-rows"},gy={class:"rd-row"},py={class:"v"},hy={key:0,class:"fam"},my={class:"rd-row"},by={class:"v"},_y={class:"rd-row"},yy={class:"v"},vy={class:"rd-row"},Sy={class:"v"},wy={class:"rd-row"},$y={class:"v"},Ay={class:"rd-row"},ky={class:"v"},Ly={__name:"DashboardDetailDrawer",setup(e){const t=ye("dashboardData",null),n=ye("selectionBus",null),o=ye("dashboardConfig",{}),a=Object.fromEntries(Object.entries(o.facets||{}).map(([g,m])=>[g,m.get])),r=t&&n?Ir({rowStore:t.rowStore,rows:t.rows,selectionSet:n.selectionSet,filterSet:n.filterSet,FACET_ACC:a}):null,s=fe(null),i=[];at(()=>{n&&(i.push(n.on("focusRow",g=>{g&&g.slug&&(s.value=g.slug)})),i.push(n.on("select",g=>{const m=g?[...g]:[];m.length&&(s.value=m[m.length-1])})))}),Wt(()=>{i.forEach(g=>{try{g()}catch{}}),i.length=0});const l=se(()=>{const g=s.value;return!g||!t||!t.rowStore||!t.rowStore.value?null:t.rowStore.value.get(g)||null}),c=g=>g==null||g===""?"—":Number(g).toLocaleString("en-US"),u=se(()=>{const g=l.value;return g?o.detail&&typeof o.detail.photo=="function"?!!o.detail.photo(g):!!(g.has_photo&&g.image_url):!1}),f=se(()=>o.detail||{});function d(g,m,$){if(typeof g=="function")try{return g(m)||$}catch{return $}return typeof g=="string"&&g?g.replace("{slug}",encodeURIComponent(m.slug||"")):$}const _=se(()=>{const g=l.value;if(!g)return null;const m=`https://pray.doxa.life/${encodeURIComponent(g.slug||"")}?source=doxalife`;return d(f.value.prayUrl,g,m)}),b=se(()=>{var S;const g=l.value;if(!g)return null;const $=`${typeof window<"u"&&((S=window.location)==null?void 0:S.origin)||"https://doxa.life"}/research/${encodeURIComponent(g.slug||"")}/`;return d(f.value.moreInfoUrl,g,$)}),y=se(()=>f.value.prayLabel||"Pray for this people group"),k=se(()=>f.value.moreInfoLabel||"More information");function E(){!r||!n||(!n.selectionSet.size&&s.value&&n.toggleSelect(s.value),r.exportCsv())}function w(){s.value=null,n&&typeof n.clearSelection=="function"&&n.clearSelection()}return it(`
`,"rd-charts"),(d,_)=>(Q(),oe("aside",{class:"rd-charts","data-region":"charts-rail",onClick:f},[_[0]||(_[0]=R("div",{class:"rd-h"},"Charts",-1)),(Q(!0),oe(Se,null,tt(i.value,b=>(Q(),oe(Se,{key:b.id},[b.type==="donut"?(Q(),oe("div",{key:0,class:"rd-chart","data-chart":b.facet},[R("div",j_,de(b.title),1),R("div",K_,[(Q(),oe("svg",{class:qe(["rd-donut",{"has-sel":c(b.facet)}]),viewBox:"0 0 132 132",role:"img","aria-label":b.title+" donut"},[(Q(!0),oe(Se,null,tt(b.geometry,y=>(Q(),oe("path",{key:y.key,d:y.path,fill:y.color,class:qe(["rd-slice",{on:l(b.facet,y.key)}]),"data-facet":b.facet,"data-key":y.key},[R("title",null,de(y.key)+": "+de(y.value)+" ("+de(y.pct)+"%)",1)],10,H_))),128))],10,G_)),R("div",z_,[(Q(!0),oe(Se,null,tt(b.geometry,y=>(Q(),oe("span",{key:y.key,class:qe(["rd-li",{on:l(b.facet,y.key)}]),"data-facet":b.facet,"data-key":y.key},[R("i",{style:Bt({background:y.color})},null,4),Ve(de(y.key),1),R("b",null,de(y.value),1)],10,V_))),128))])])],8,U_)):(Q(),oe("div",{key:1,class:"rd-chart","data-chart":b.facet},[R("div",Y_,de(b.title),1),R("div",q_,[(Q(!0),oe(Se,null,tt(b.geometry,y=>(Q(),oe("div",{key:y.key,class:qe(["rd-bar",{on:l(b.facet,y.key)}]),"data-facet":b.facet,"data-key":y.key},[R("span",X_,de(y.key),1),R("span",Z_,[R("span",{class:"rd-bf",style:Bt({width:y.frac*100+"%",background:y.color})},null,4)]),R("span",Q_,de(y.value),1)],10,J_))),128))])],8,W_))],64))),128))]))}},ty={class:"rd-detail","data-region":"detail-drawer"},ny={class:"rd-dh"},oy={key:0,class:"rd-empty","data-detail-empty":""},ay={class:"rd-top"},ry=["src","alt"],sy={key:1,class:"rd-ph","data-detail-thumb":""},iy={class:"rd-name","data-detail-name":""},ly={class:"rd-meta"},cy={class:"rd-actions"},uy=["href","title"],dy=["href","title"],fy={class:"rd-rows"},gy={class:"rd-row"},py={class:"v"},hy={key:0,class:"fam"},my={class:"rd-row"},by={class:"v"},_y={class:"rd-row"},yy={class:"v"},vy={class:"rd-row"},Sy={class:"v"},wy={class:"rd-row"},$y={class:"v"},Ay={class:"rd-row"},ky={class:"v"},Ly={__name:"DashboardDetailDrawer",setup(e){const t=ye("dashboardData",null),n=ye("selectionBus",null),o=ye("dashboardConfig",{}),a=Object.fromEntries(Object.entries(o.facets||{}).map(([g,m])=>[g,m.get])),r=t&&n?Ir({rowStore:t.rowStore,rows:t.rows,selectionSet:n.selectionSet,filterSet:n.filterSet,FACET_ACC:a}):null,s=fe(null),i=[];at(()=>{n&&(i.push(n.on("focusRow",g=>{g&&g.slug&&(s.value=g.slug)})),i.push(n.on("select",g=>{const m=g?[...g]:[];m.length&&(s.value=m[m.length-1])})))}),Wt(()=>{i.forEach(g=>{try{g()}catch{}}),i.length=0});const l=se(()=>{const g=s.value;return!g||!t||!t.rowStore||!t.rowStore.value?null:t.rowStore.value.get(g)||null}),c=g=>g==null||g===""?"—":Number(g).toLocaleString("en-US"),u=se(()=>{const g=l.value;return g?o.detail&&typeof o.detail.photo=="function"?!!o.detail.photo(g):!!(g.has_photo&&g.image_url):!1}),f=se(()=>o.detail||{});function d(g,m,$){if(typeof g=="function")try{return g(m)||$}catch{return $}return typeof g=="string"&&g?g.replace("{slug}",encodeURIComponent(m.slug||"")):$}const _=se(()=>{const g=l.value;if(!g)return null;const m=encodeURIComponent(String(f.value.utmSource||o.utmSource||"agwm")),$=`https://pray.doxa.life/${encodeURIComponent(g.slug||"")}?source=doxalife&utm_source=${m}`;return d(f.value.prayUrl,g,$)}),b=se(()=>{var T;const g=l.value;if(!g)return null;const m=typeof window<"u"&&((T=window.location)==null?void 0:T.origin)||"https://doxa.life",$=encodeURIComponent(String(f.value.utmSource||o.utmSource||"agwm")),S=`${m}/research/${encodeURIComponent(g.slug||"")}/?utm_source=${$}`;return d(f.value.moreInfoUrl,g,S)}),y=se(()=>f.value.prayLabel||"Pray for this people group"),k=se(()=>f.value.moreInfoLabel||"More information");function E(){!r||!n||(!n.selectionSet.size&&s.value&&n.toggleSelect(s.value),r.exportCsv())}function w(){s.value=null,n&&typeof n.clearSelection=="function"&&n.clearSelection()}return it(`
.rd-detail{ box-sizing:border-box; background:var(--rd-panel,#fff); border-left:1px solid var(--rd-line,#e2e6ec);
border-bottom:1px solid var(--rd-line,#e2e6ec); padding:var(--s3,12px);
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif; color:var(--rd-ink,#1f2733); flex:0 0 auto; }

View file

@ -29,7 +29,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-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74" crossorigin="anonymous"></script>
<script src="../research-dashboard.js" integrity="sha384-Zf3wtybRsrR/qoIEjO2zSuMOT6TwLdjBoKY4SYhBQwdEzH/Rzx8ZIVMH6aWRzgoK" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -12,8 +12,9 @@
<link rel="modulepreload" href="./doxa-maps/doxa-simple-map/doxa-simple-map.js" />
<!-- ── Mapbox GL peer: loaded ONCE by the wrapper (the shell owns the version).
Every profile bundle marks mapbox-gl `external`, so they all share THIS
single instance — one download, one parse, one library.
Profile bundles never import mapbox-gl — they use the `window.mapboxgl`
global this shell provides, so they all share THIS single instance — one
download, one parse, one library.
TODO(prod): self-host these files same-origin so CSP can be `worker-src 'self'`
instead of `blob:`, and so the F-Droid/offline builds carry no CDN dep. ── -->
<link href="https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.css" rel="stylesheet" />
@ -842,8 +843,7 @@ const PROFILES = {
// CITIES WITH INTERNET — connectivity where the unengaged people groups live.
// The nav has carried this id as a placeholder since 2026-07-29; this entry is
// what turns it into a real app. `profile` is the .vue FILENAME, not the folder.
// No `panes` key: this ships a list profile only, so the shell keeps its original
// single-mount path. A map pane lands later.
// Ships WITH `panes` (map/list/operators below) — the pane grid is live.
'cities-with-internet': {
tag: 'cities-internet-map',
src: './doxa-maps/cities-internet/cities-internet.js',

View file

@ -70,7 +70,7 @@ export const NAV = [
// ── GOSPEL ACCESS — where the gospel can actually REACH: the infrastructure
// (internet-connected cities) and the assets (gospel resources) that make
// access possible. Populated by the maintainer 2026-07-29.
// ⚠ NO BUNDLES YET — both render the placeholder card.
// Both items are wired to real bundles (cities-internet + gospel-resources).
{
kind: 'section', id: 'gospel-access', label: 'Gospel Access', icon: 'book', target: 'both',
children: [