Regions: expand a region to its country posters, reusing the shared wall
Driver request: "a toggle or carrot added to the bottom of the region section that says view country posters, which will let you view country posters for each of the countries in the regions" — with View-on-map and Print, "the same reusable code from upg 100 list". This is a third sanctioned addition alongside the tab strip and the no-selection chooser. Almost nothing was built. library/components/poster/PosterWall.vue was already the shared, fully parameterised grid, and it already owned the card layout, the "Show on map" header button, the PRINT OPTIONS footer and the client-side raster. regions-list.vue supplies only data and a toggle — the same division country-poster-wall.vue states in its own header. - A "View country posters" toggle at the bottom of every region section, carrying aria-expanded and aria-controls, using the same caret SVG the header and footer links already use, rotated when open. - Opening a region renders that region's countries. Measured: 41 cards for Africa and all 41 previews LOAD (naturalWidth>0 — a 404 still yields an <img>, so the load is the real check). No assets were copied: public/assets/previews already holds 174 country-*.webp and generate-tree already stages them. - "Show Chad on the map" reaches the Region Dashboards tab with title "Chad" and hash "#chad", by mapping PosterWall's CustomEvent listId back through the country-selected the tabs already exchange. - India prints its own reason with the exact number from the data; China renders a real poster. Only India is unsupported — 855 groups and no sheet, against China's 154 on a 3x4. Two defects the screenshot caught and no assertion did: - PosterWall's root is position:absolute;inset:0, because in its own bundles it IS a pane. Embedded in a region card it painted 1440x1100 over the region's country list. Fixed by parameterising the shared component rather than overriding its CSS locally: new `embedded` and `sectionHeads` props, both defaulting to today's behaviour, so country-posters and key-cities are unchanged by construction. Both re-checked. Re-measured: root static, 1200px wide, panel below the grid, no overlap. - With one unnamed group the wall printed a section head reading the literal "Other" plus a count duplicating the region card's own summary. Suppressed by sectionHeads=false. The dataset moved to library/data/country-posters.json now that it has a second consumer, one import line changed in country-posters, and emit-countries.mjs was retargeted so the next generator run cannot recreate the duplicate. The three new strings do not exist on DX-life, so there was nothing to copy and nothing was invented in another language: en only, with the other seven locales falling back to the key. Regression: 15 suites green, including region-vs-live 73/73, country-vs-live 28/28, mobile 44/44 and 26/26, and a new _probe-region-posters.mjs. check:library-index drifted for real this time (3 new library files) and is regenerated here.
This commit is contained in:
parent
2825ebc286
commit
ddde518a85
17 changed files with 276 additions and 108 deletions
|
|
@ -170,6 +170,8 @@ and a change here can break other maps.
|
|||
`import … from '@map/utils/NetworkClusteringUtil.js'`
|
||||
- **apiBaseUrl** — Back-compat shim. The real apiBaseUrl.js lives in the api/ seam folder.
|
||||
`import … from '@map/utils/apiBaseUrl.js'`
|
||||
- **countries-meta** — countries-meta.js — a PORT of DX-life's config/countries-meta.ts (326 lines), the rollup
|
||||
`import … from '@map/utils/countries-meta.js'`
|
||||
- **embedBase** — embedBase.js — Where THIS bundle's built tree is served from, resolved at runtime.
|
||||
`import … from '@map/utils/embedBase.js'`
|
||||
- **geoUtils** — geoUtils.js — Geographic / GeoJSON Utility Functions
|
||||
|
|
@ -199,6 +201,10 @@ and a change here can break other maps.
|
|||
|
||||
### Data (static reference tables)
|
||||
|
||||
- **countries** — "value": "AFG",
|
||||
`import … from '@map/data/countries.json'`
|
||||
- **country-posters** — "stats": {
|
||||
`import … from '@map/data/country-posters.json'`
|
||||
- **iso-numeric-to-alpha2** — "4":"AF","8":"AL","12":"DZ","24":"AO","32":"AR","36":"AU","40":"AT","50":"BD",
|
||||
`import … from '@map/data/iso-numeric-to-alpha2.json'`
|
||||
- **langFamilyByIso** — "aar": "Afro-Asiatic",
|
||||
|
|
|
|||
|
|
@ -77,6 +77,18 @@ const props = defineProps({
|
|||
// prayer list for each country generated.")
|
||||
prayerListSoonMessage: { type: String,
|
||||
default: 'Coming soon — the prayer list for each people group is in build.' },
|
||||
// EMBEDDED mode (added 2026-09-24 for the regions-tab poster dropdown). The wall's root is
|
||||
// `position:absolute;inset:0` because in country-posters and my-upg-100-list it IS a pane and
|
||||
// fills it. Dropped inside another component — a region card, say — that absolute root covers
|
||||
// the whole element: MEASURED at 1440x1100 painted over the region's country list, which no
|
||||
// assertion caught and the screenshot did. Embedded returns it to normal flow and drops the
|
||||
// pane background so it inherits its host's. Default false, so both existing panes are
|
||||
// byte-identical.
|
||||
embedded: { type: Boolean, default: false },
|
||||
// Section heads carry the group name and its totals. A caller that has ALREADY named the
|
||||
// group in its own chrome (the region card's header and summary) would otherwise repeat it,
|
||||
// and with a single unnamed group the head renders the literal "Other". Default true.
|
||||
sectionHeads:{ type: Boolean, default: true },
|
||||
})
|
||||
|
||||
const plural = computed(() => props.itemNounPlural || `${props.itemNoun}s`)
|
||||
|
|
@ -217,6 +229,10 @@ useShadowStyles(
|
|||
'.wall{position:absolute;inset:0;overflow-y:auto;padding:22px 18px 44px;' +
|
||||
"background:#f6f7f9;color:#0f1419;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}" +
|
||||
'.wall.is-dark{background:#0a1410;color:#e5e7eb}' +
|
||||
// Embedded: normal flow, no pane background, no pane padding. inset:auto matters as much
|
||||
// as position:static — leaving inset set keeps the box stretched even once static.
|
||||
'.wall--embedded{position:static;inset:auto;overflow-y:visible;padding:0;background:transparent}' +
|
||||
'.wall--embedded.is-dark{background:transparent}' +
|
||||
'.wall-h{margin:0 0 6px;font-size:19px;font-weight:700;text-align:center}' +
|
||||
'.wall-tag{margin:0 auto 12px;width:fit-content;padding:3px 11px;border-radius:999px;' +
|
||||
'background:rgba(16,185,129,.13);color:#0b7a5b;border:1px solid rgba(16,185,129,.28);' +
|
||||
|
|
@ -354,14 +370,14 @@ useShadowStyles(
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="wall" :class="{ 'is-dark': isDark }">
|
||||
<div class="wall" :class="{ 'is-dark': isDark, 'wall--embedded': embedded }">
|
||||
<h2 class="wall-h">{{ heading }}</h2>
|
||||
<div v-if="tag" class="wall-tag">{{ tag }}</div>
|
||||
<p v-if="intro" class="wall-sub" v-html="intro"></p>
|
||||
|
||||
<section v-for="sec in sections" :key="sec.name" class="sec">
|
||||
<!-- A <button> when collapsible so the whole head is keyboard-reachable. -->
|
||||
<component :is="collapsible ? 'button' : 'div'" class="sec-head"
|
||||
<component v-if="sectionHeads" :is="collapsible ? 'button' : 'div'" class="sec-head"
|
||||
:class="{ 'is-toggle': collapsible, 'is-shut': collapsible && isCollapsed(sec.name) }"
|
||||
:type="collapsible ? 'button' : null"
|
||||
:aria-expanded="collapsible ? String(!isCollapsed(sec.name)) : null"
|
||||
|
|
|
|||
|
|
@ -49,5 +49,8 @@
|
|||
"WAGF Block": "WAGF Block",
|
||||
"WAGF Region": "WAGF Region",
|
||||
"people groups adopted": "people groups adopted",
|
||||
"people groups engaged": "people groups engaged"
|
||||
"people groups engaged": "people groups engaged",
|
||||
"View country posters": "View country posters",
|
||||
"Hide country posters": "Hide country posters",
|
||||
"No poster has been generated for this country yet.": "No poster has been generated for this country yet."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
// bbox, and which sheet size it takes.
|
||||
//
|
||||
// node emit-countries.mjs
|
||||
// -> ../../plugin-designs/country-posters/data/countries.json
|
||||
// -> ../../data/country-posters.json (library/data — two consumers)
|
||||
//
|
||||
// SHEET LADDER (design note 2026-08-01) — the count selects the SHEET SIZE, it does not
|
||||
// exclude a country:
|
||||
|
|
@ -23,7 +23,10 @@ import { fileURLToPath } from 'node:url';
|
|||
import { dirname, join, resolve } from 'node:path';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const OUT_DIR = resolve(__dirname, '..', '..', '..', 'plugin-designs', 'country-posters', 'data');
|
||||
// Writes to library/data now, not into the country-posters bundle: the regions-dashboard
|
||||
// poster dropdown is a SECOND consumer of this dataset, and a generator that still wrote to
|
||||
// one plugin's folder would quietly recreate the duplicate this move removed.
|
||||
const OUT_DIR = resolve(__dirname, '..', '..', 'data');
|
||||
const RECORDS = join(__dirname, 'out', '_records.json');
|
||||
const ADM0 = resolve(__dirname, '..', '..', '..', 'plugin-designs', 'my-upg-100-list', 'data', 'adm0', 'world-adm0.geojson');
|
||||
|
||||
|
|
@ -124,7 +127,7 @@ const stats = {
|
|||
};
|
||||
|
||||
if (!existsSync(OUT_DIR)) mkdirSync(OUT_DIR, { recursive: true });
|
||||
writeFileSync(join(OUT_DIR, 'countries.json'), JSON.stringify({ stats, countries }, null, 1));
|
||||
writeFileSync(join(OUT_DIR, 'country-posters.json'), JSON.stringify({ stats, countries }, null, 1));
|
||||
|
||||
console.log(`[countries] ${stats.countries} countries, ${stats.people_groups} people groups`);
|
||||
console.log(`[countries] 3x3=${stats.sheet_3x3} 3x4=${stats.sheet_3x4} unsupported=${stats.unsupported}`);
|
||||
|
|
|
|||
|
|
@ -37,7 +37,10 @@
|
|||
*/
|
||||
import { computed, inject, ref } from 'vue'
|
||||
import PosterWall from '@map/components/poster/PosterWall.vue'
|
||||
import data from './data/countries.json'
|
||||
// MOVED to the shared library 2026-09-24: the regions-dashboard poster dropdown is a second
|
||||
// consumer of this same dataset, and RULE 2 puts a dataset with a named second consumer in
|
||||
// library/. Generated by library/scripts/posters/emit-countries.mjs, which now writes there.
|
||||
import data from '@map/data/country-posters.json'
|
||||
import { resolveAssetsBase } from '@map/utils/embedBase.js'
|
||||
|
||||
const profileConfig = inject('profileConfig', ref(null))
|
||||
|
|
|
|||
|
|
@ -40,6 +40,20 @@ import { RTL_LOCALES } from '@map/i18n/index.js'
|
|||
import { useI18n } from 'vue-i18n'
|
||||
import { useDocumentFont, BEBAS_NEUE_FACES, POPPINS_FACES } from '@map/composables/useDocumentFont.js'
|
||||
import { summarizeRegions, slugify, emptyStats, toNumber, PEOPLE_GROUP_LIST_FIELDS } from '@map/utils/countries-meta.js'
|
||||
// THE COUNTRY-POSTER DROPDOWN (Driver 2026-09-24) — the THIRD sanctioned addition, after the
|
||||
// SELECT VIEW tab strip and the no-selection chooser. Their wording: "a toggle or carrot added
|
||||
// to the bottom of each region section that says view country posters".
|
||||
//
|
||||
// NOTHING HERE IS REBUILT. PosterWall is already the shared, fully parameterised grid that
|
||||
// my-upg-100-list/poster-wall.vue and country-posters/country-poster-wall.vue both render, and
|
||||
// it already owns the card layout, the "Show on map" header button, the Print Options footer
|
||||
// and the client-side raster. This file supplies only data and a toggle — the same division of
|
||||
// labour country-poster-wall.vue states in its own header ("this profile supplies only its
|
||||
// data and taxonomy").
|
||||
import PosterWall from '@map/components/poster/PosterWall.vue'
|
||||
import posterData from '@map/data/country-posters.json'
|
||||
import { resolveAssetsBase } from '@map/utils/embedBase.js'
|
||||
import { onBeforeUnmount } from 'vue'
|
||||
|
||||
const props = defineProps({
|
||||
profileConfig: { type: String, default: '' },
|
||||
|
|
@ -180,6 +194,74 @@ async function loadRegions() {
|
|||
}
|
||||
}
|
||||
|
||||
// ─── COUNTRY POSTERS, per region ─────────────────────────────────────────────────────────
|
||||
// One wall per region, opened by the footer toggle. instanceId is suffixed with the region
|
||||
// slug because PosterWall scopes its CustomEvent by instanceId so several embeds on one page
|
||||
// never cross-talk (PosterWall.vue:40) — and here there genuinely are several.
|
||||
const POSTER_EVENT = 'doxa-regions:show-country-on-map'
|
||||
// Read off the injected config the same way every other value in this file is (see the note
|
||||
// above cfg) — a bare default here would make two embeds on one page answer each other's
|
||||
// poster events.
|
||||
const instanceId = computed(() => cfg.value.instanceId || 'regions-list')
|
||||
const posterAssetsBase = computed(() => resolveAssetsBase(cfg.value))
|
||||
const openPosters = ref(new Set())
|
||||
|
||||
function togglePosters(region) {
|
||||
const next = new Set(openPosters.value)
|
||||
next.has(region.slug) ? next.delete(region.slug) : next.add(region.slug)
|
||||
openPosters.value = next // a new Set, so the computed template actually re-renders
|
||||
}
|
||||
const postersOpen = (region) => openPosters.value.has(region.slug)
|
||||
|
||||
// The poster dataset is keyed by ISO-3 (`iso3`); the regions rollup keys by `code`. Same
|
||||
// codes, so the join is direct.
|
||||
const POSTER_BY_ISO3 = new Map((posterData.countries || []).map(c => [String(c.iso3 || '').toUpperCase(), c]))
|
||||
|
||||
// Every country in the region gets a card, in PosterWall's own shape. A country with no
|
||||
// generated poster is NOT dropped — it is passed with a reason, which is what the wall's
|
||||
// `unsupported` slot is for, so the grid never silently loses a country.
|
||||
function postersFor(region) {
|
||||
return (region.countries || []).map((c) => {
|
||||
const rec = POSTER_BY_ISO3.get(String(c.code || '').toUpperCase())
|
||||
if (rec) return rec
|
||||
return {
|
||||
id: `country-${String(c.code || '').toLowerCase()}`,
|
||||
iso3: c.code,
|
||||
label: c.name,
|
||||
count: c.count,
|
||||
unsupportedReason: t('No poster has been generated for this country yet.'),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Their own not-yet reason travels WITH the record, so the number the wall prints can never
|
||||
// drift from the data — country-poster-wall.vue:63 does exactly this. India is the only
|
||||
// country in the dataset that carries one (855 people groups, no sheet); China is fine at 3x4.
|
||||
const posterUnsupported = (c) => c.unsupportedReason || null
|
||||
|
||||
// One region's wall is already inside a region section, so it needs no second level of
|
||||
// collapsing and no grouping: everything in it is that one region.
|
||||
const posterGroupBy = () => 'countries'
|
||||
|
||||
// PosterWall's "Show on map" dispatches a window CustomEvent carrying listId (the poster id,
|
||||
// e.g. "country-chn") or null when the user toggles the same card off. Mapping that id back to
|
||||
// the country record and reusing selectCountry() is what makes the button open the dashboard
|
||||
// tab for that country — the Driver's "click view on map button, which will open the country
|
||||
// dashboard page for that country".
|
||||
function onPosterShowOnMap(ev) {
|
||||
const d = ev?.detail || {}
|
||||
if (!String(d.instanceId || '').startsWith(instanceId.value)) return
|
||||
if (!d.listId) return // a deselect is not a navigation
|
||||
const iso3 = String(d.listId).replace(/^country-/, '').toUpperCase()
|
||||
for (const region of regions.value) {
|
||||
const hit = (region.countries || []).find(c => String(c.code || '').toUpperCase() === iso3)
|
||||
if (hit) { selectCountry(hit, region); return }
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => { if (typeof window !== 'undefined') window.addEventListener(POSTER_EVENT, onPosterShowOnMap) })
|
||||
onBeforeUnmount(() => { if (typeof window !== 'undefined') window.removeEventListener(POSTER_EVENT, onPosterShowOnMap) })
|
||||
|
||||
onMounted(loadRegions)
|
||||
|
||||
// Design values are a DIRECT PORT of DX-life's live /regions page (root-dx-life/doxa-life —
|
||||
|
|
@ -312,6 +394,11 @@ useShadowStyles(
|
|||
// NO margin-bottom. This element is a <p>; its user-agent default margin-block-end (~19.5312px at
|
||||
// this font-size) was leaking through because only margin-top was ever set -- pin margin:0
|
||||
// first, then apply margin-top, so the bottom UA default can't survive the cascade.
|
||||
// The toggle row and the wall it opens. The caret rotates rather than swapping glyphs,
|
||||
// which is what makes open/closed legible at a glance.
|
||||
'.region-card__posters-toggle{ margin-top:0; }' +
|
||||
'.region-card__icon--open{ transform:rotate(180deg); }' +
|
||||
'.region-card__posters{ margin-top:13.3px; }' +
|
||||
'.region-card__footer{ display:flex; justify-content:flex-end; margin:0; margin-top:23.5264px;' +
|
||||
' padding:0 clamp(17.689px, 4cqw, 41.6158px) 23.5264px; }' +
|
||||
'.region-card__footer-link{ appearance:none; background:none; border:0; padding:0; margin:0;' +
|
||||
|
|
@ -384,6 +471,56 @@ useShadowStyles(
|
|||
</svg>
|
||||
</button>
|
||||
</p>
|
||||
|
||||
<!-- THE POSTER TOGGLE — Driver 2026-09-24: "a toggle or carrot added to the bottom
|
||||
of the region section that says view country posters, which will let you view
|
||||
country posters for each of the countries in the regions". The caret is the
|
||||
same SVG the header and footer links already use, rotated when open, so the
|
||||
control reads as part of this card rather than bolted on. aria-expanded and
|
||||
aria-controls are what make it a real disclosure for a screen reader. -->
|
||||
<p class="region-card__footer region-card__posters-toggle">
|
||||
<button
|
||||
type="button"
|
||||
class="region-card__footer-link"
|
||||
:aria-expanded="postersOpen(region) ? 'true' : 'false'"
|
||||
:aria-controls="`posters-${region.slug}`"
|
||||
@click="togglePosters(region)"
|
||||
>
|
||||
{{ postersOpen(region) ? t('Hide country posters') : t('View country posters') }}
|
||||
<svg
|
||||
class="region-card__icon"
|
||||
:class="{ 'region-card__icon--open': postersOpen(region) }"
|
||||
viewBox="0 0 489.67 289.877"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<path d="M439.017,211.678L263.258,35.919c-3.9-3.9-8.635-6.454-13.63-7.665-9.539-2.376-20.051.161-27.509,7.619L46.361,211.632c-11.311,11.311-11.311,29.65,0,40.961h0c11.311,11.311,29.65,11.311,40.961,0L242.667,97.248l155.39,155.39c11.311,11.311,29.65,11.311,40.961,0h0c11.311-11.311,11.311-29.65,0-40.961Z" />
|
||||
</svg>
|
||||
</button>
|
||||
</p>
|
||||
|
||||
<!-- The wall itself: the SHARED component, given only this region's countries. No
|
||||
second level of collapsing (we are already inside one region) and no grouping,
|
||||
hence posterGroupBy returning ''. -->
|
||||
<div v-if="postersOpen(region)" :id="`posters-${region.slug}`" class="region-card__posters">
|
||||
<PosterWall
|
||||
:items="postersFor(region)"
|
||||
:group-by="posterGroupBy"
|
||||
:instance-id="`${instanceId}-${region.slug}`"
|
||||
:assets-base="posterAssetsBase"
|
||||
:event-name="POSTER_EVENT"
|
||||
:heading="''"
|
||||
:intro="''"
|
||||
unit="UPG"
|
||||
item-noun="country"
|
||||
item-noun-plural="countries"
|
||||
:collapsible="false"
|
||||
:embedded="true"
|
||||
:section-heads="false"
|
||||
:unsupported="posterUnsupported"
|
||||
download-prefix="doxa-country"
|
||||
prayer-list-soon-message="Coming soon — a prayer list will be generated for each country, naming every unengaged people group within it."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -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-XVF2t6ecN5IIl9qocMK2FRd96NhAhdT4iO6qth4CpAWjvnzZdh0RYrHpnjuYSxru" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-SEW7qAQI1xONm5JtqYW48DMlv+M36uYUqRMms+simkUtXNLFn36H3r3O2PicVP4F" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
|
||||
<script src="../country-posters.js" integrity="sha384-XVF2t6ecN5IIl9qocMK2FRd96NhAhdT4iO6qth4CpAWjvnzZdh0RYrHpnjuYSxru" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-SEW7qAQI1xONm5JtqYW48DMlv+M36uYUqRMms+simkUtXNLFn36H3r3O2PicVP4F" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
94
public/doxa-maps/country-posters/country-posters.js
generated
94
public/doxa-maps/country-posters/country-posters.js
generated
File diff suppressed because one or more lines are too long
2
public/doxa-maps/index.html
generated
2
public/doxa-maps/index.html
generated
File diff suppressed because one or more lines are too long
32
public/doxa-maps/key-cities/key-cities.js
generated
32
public/doxa-maps/key-cities/key-cities.js
generated
File diff suppressed because one or more lines are too long
14
public/doxa-maps/manifest.json
generated
14
public/doxa-maps/manifest.json
generated
|
|
@ -154,7 +154,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "doxa-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-XVF2t6ecN5IIl9qocMK2FRd96NhAhdT4iO6qth4CpAWjvnzZdh0RYrHpnjuYSxru",
|
||||
"integrity": "sha384-SEW7qAQI1xONm5JtqYW48DMlv+M36uYUqRMms+simkUtXNLFn36H3r3O2PicVP4F",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -170,7 +170,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-XVF2t6ecN5IIl9qocMK2FRd96NhAhdT4iO6qth4CpAWjvnzZdh0RYrHpnjuYSxru\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-SEW7qAQI1xONm5JtqYW48DMlv+M36uYUqRMms+simkUtXNLFn36H3r3O2PicVP4F\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -184,7 +184,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-XVF2t6ecN5IIl9qocMK2FRd96NhAhdT4iO6qth4CpAWjvnzZdh0RYrHpnjuYSxru\" 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-SEW7qAQI1xONm5JtqYW48DMlv+M36uYUqRMms+simkUtXNLFn36H3r3O2PicVP4F\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -838,7 +838,7 @@
|
|||
"bundle": "regions-dashboard",
|
||||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
|
||||
"integrity": "sha384-yPEXCgLT7Mu6wGnVC132x+U8Sff1w3OxbQilNQ/y7x1KK6Ykqk2vta8qHB24Fofg",
|
||||
"integrity": "sha384-8RyxSBCKq3msHWoz2K5/MMemGhsRoeR+oU8KFnp9aMKVMp6TiGDze4kGRCh7luAD",
|
||||
"elements": [
|
||||
"regions-dashboard"
|
||||
],
|
||||
|
|
@ -858,7 +858,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-yPEXCgLT7Mu6wGnVC132x+U8Sff1w3OxbQilNQ/y7x1KK6Ykqk2vta8qHB24Fofg\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-8RyxSBCKq3msHWoz2K5/MMemGhsRoeR+oU8KFnp9aMKVMp6TiGDze4kGRCh7luAD\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -872,7 +872,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-yPEXCgLT7Mu6wGnVC132x+U8Sff1w3OxbQilNQ/y7x1KK6Ykqk2vta8qHB24Fofg\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-8RyxSBCKq3msHWoz2K5/MMemGhsRoeR+oU8KFnp9aMKVMp6TiGDze4kGRCh7luAD\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -886,7 +886,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-yPEXCgLT7Mu6wGnVC132x+U8Sff1w3OxbQilNQ/y7x1KK6Ykqk2vta8qHB24Fofg\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-8RyxSBCKq3msHWoz2K5/MMemGhsRoeR+oU8KFnp9aMKVMp6TiGDze4kGRCh7luAD\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
|
||||
<script src="../regions-dashboard.js" integrity="sha384-yPEXCgLT7Mu6wGnVC132x+U8Sff1w3OxbQilNQ/y7x1KK6Ykqk2vta8qHB24Fofg" crossorigin="anonymous"></script>
|
||||
<script src="../regions-dashboard.js" integrity="sha384-8RyxSBCKq3msHWoz2K5/MMemGhsRoeR+oU8KFnp9aMKVMp6TiGDze4kGRCh7luAD" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
|
||||
<script src="../regions-dashboard.js" integrity="sha384-yPEXCgLT7Mu6wGnVC132x+U8Sff1w3OxbQilNQ/y7x1KK6Ykqk2vta8qHB24Fofg" crossorigin="anonymous"></script>
|
||||
<script src="../regions-dashboard.js" integrity="sha384-8RyxSBCKq3msHWoz2K5/MMemGhsRoeR+oU8KFnp9aMKVMp6TiGDze4kGRCh7luAD" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
|
||||
<script src="../regions-dashboard.js" integrity="sha384-yPEXCgLT7Mu6wGnVC132x+U8Sff1w3OxbQilNQ/y7x1KK6Ykqk2vta8qHB24Fofg" crossorigin="anonymous"></script>
|
||||
<script src="../regions-dashboard.js" integrity="sha384-8RyxSBCKq3msHWoz2K5/MMemGhsRoeR+oU8KFnp9aMKVMp6TiGDze4kGRCh7luAD" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
Loading…
Reference in a new issue