Update from source f3c19e2f
This commit is contained in:
parent
bca8ce73ad
commit
0646cce8ef
37 changed files with 658 additions and 359 deletions
|
|
@ -144,11 +144,23 @@ const SITES = [
|
|||
// file is the wrong place to make a product decision by default.
|
||||
// First site on the {t, te, locale} form: it needs locale for toLocaleString.
|
||||
['plugin-designs/all-people-groups/all-people-groups.vue', 'useOptionalI18n', 'fallback: (full) =>'],
|
||||
// wave 3c — my-upg-100-list (owner: upg100). Both used the humanizeKey fallback and no namespace,
|
||||
// since callers pass full keys. Each keeps humanizeKey, so a bare host reads the same title-cased
|
||||
// last segment it always did.
|
||||
['plugin-designs/my-upg-100-list/poster-wall.vue', 'useOptionalT', 'humanizeKey(k)'],
|
||||
['plugin-designs/my-upg-100-list/upg-100-mfe.vue', 'useOptionalT', 'humanizeKey(k)'],
|
||||
// wave 3c — my-upg-100-list (owner: upg100-plugin). No namespace, since callers pass full keys.
|
||||
// ⚠ THE THIRD COLUMN IS null, NOT 'humanizeKey(k)', and that is a DEPARTURE from 4c05e589, which
|
||||
// kept the fallback. Correct as regions-plugin wrote it; wrong the moment dx-shepherd took the
|
||||
// product call (UPGHK, 2026-09-27) to delete it. A row asserting a fallback the code no longer
|
||||
// passes fails by design — the same hole regions flagged to me in the opposite direction.
|
||||
// ★ WHY IT WAS DELETED. humanizeKey rendered a key's last segment title-cased, failing two ways: on
|
||||
// the messages keys it printed "Upg100 Wall Intro" where a whole sentence exists (wrong even in
|
||||
// English), and on the tabs keys it printed the RIGHT English by coincidence — those keys are named
|
||||
// after the words — so it looked correct forever while every non-English reader silently got
|
||||
// English. A fallback that agrees with en is indistinguishable from a working translation until
|
||||
// someone changes locale.
|
||||
// The premise for keeping it ("these keys are not fully catalogued") was MINE and was FALSE: seven
|
||||
// keys across both files, all string literals, every one present in all eleven locales, 0 gaps.
|
||||
// Same class of decision gospel-plugin took for its four sites above, and the OPPOSITE of the 3d
|
||||
// reading directly above — which is right, because that file is unowned and these two are not.
|
||||
['plugin-designs/my-upg-100-list/poster-wall.vue', 'useOptionalT', null],
|
||||
['plugin-designs/my-upg-100-list/upg-100-mfe.vue', 'useOptionalT', null],
|
||||
]
|
||||
// ★ ONE FILE KEEPS TWO BARE useI18n CALLS ON PURPOSE, and the count is asserted rather than waived.
|
||||
// resources-map.vue reads the LOCALE twice (`useI18n().locale.value`) to decide isEnglish and the
|
||||
|
|
@ -188,9 +200,18 @@ for (const [file, helper, fallbackFrag] of SITES) {
|
|||
// catalogue; gospel's four used to resolve through enLookup's ENGLISH and were MOVED here by their
|
||||
// owner's decision. Saying "as it always did" for those four would be a false statement inside a
|
||||
// gate message, which is the one place a reader has no reason to doubt.
|
||||
const moved = file.includes('gospel-resources')
|
||||
// ⚠ AND my-upg-100-list's TWO ARE ALSO "moved", added 2026-09-27. They used humanizeKey until
|
||||
// dx-shepherd took the product call (UPGHK) to delete it, so "as it always did" would have been
|
||||
// false for them the moment they were registered — the exact failure this branch already guards
|
||||
// against for gospel's four. A register that is right about the assertion and wrong in the sentence
|
||||
// it prints is still teaching the next reader something untrue.
|
||||
const MOVED_TO_CATALOGUE = ['gospel-resources', 'my-upg-100-list']
|
||||
const moved = MOVED_TO_CATALOGUE.some((m) => file.includes(m))
|
||||
const who = file.includes('gospel-resources')
|
||||
? "gospel-plugin moved it here from enLookup's English"
|
||||
: 'upg100-plugin moved it here from humanizeKey, a title-cased key segment'
|
||||
ok(!/fallback:/.test(code), moved
|
||||
? `${short}: takes the locale-honouring CATALOGUE fallback (gospel-plugin moved it here from enLookup's English)`
|
||||
? `${short}: takes the locale-honouring CATALOGUE fallback (${who})`
|
||||
: `${short}: takes the CATALOGUE fallback, as it always did`)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,9 +17,11 @@
|
|||
// SKIP (exit 0) only when the directory is genuinely absent or empty: packets are
|
||||
// generated on demand and a clean checkout has none. A skip says so out loud, with the
|
||||
// count, so "0 packets checked" can never read as "all packets passed".
|
||||
import { existsSync, readdirSync } from 'node:fs'
|
||||
import { existsSync, readdirSync, readFileSync } from 'node:fs'
|
||||
import { resolve, dirname, join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
// pathToFileURL, not a bare path: a dynamic import() of an absolute POSIX path works by luck on
|
||||
// linux and throws ERR_UNSUPPORTED_ESM_URL_SCHEME the moment anyone runs this on windows.
|
||||
import { fileURLToPath, pathToFileURL } from 'node:url'
|
||||
import { spawnSync } from 'node:child_process'
|
||||
|
||||
const HERE = dirname(fileURLToPath(import.meta.url))
|
||||
|
|
@ -93,22 +95,68 @@ for (const f of files) {
|
|||
// PASS line from overclaiming.
|
||||
const zoneOf = (f) => f.replace(/\.html$/, '').replace(/\.[a-z]{2}$/, '')
|
||||
const zones = [...new Set(files.map(zoneOf))].sort()
|
||||
|
||||
// ★ THE DENOMINATOR NOW COMES FROM THE SAME PLACE THE NUMERATOR DOES.
|
||||
//
|
||||
// ⚠ IT DID NOT, AND THAT HID A BUG FOR THREE DAYS. This counted out/posters/*.html — POSTER files —
|
||||
// while the numerator counts PACKET zones. Two different populations, printed either side of the word
|
||||
// "of". out/posters is also itself GENERATED, so on a clean checkout the denominator was null and the
|
||||
// shortfall warning silently vanished: the one line whose job was to stop an overclaim could not fire
|
||||
// precisely when nothing had been rendered at all.
|
||||
// MEASURED 2026-09-27: posters = 28, packet-able zones = 27, and the missing one was `deaf` — a legend
|
||||
// row and a poster with NO reachable packet, because packet.mjs's allZones() looped three cluster keys
|
||||
// and clusters.json carries zones in a fourth (deaf_lists, collapsed by legend-tree.js into one leaf).
|
||||
// So "2 of 28" was not 26-to-go: it was 25-to-go plus one that could not be generated by any command.
|
||||
// Fixed in packet.mjs (it now enumerates via leafZones, deaf included); this line stops the two sides
|
||||
// from ever drifting again by reading the SAME seam rather than a directory listing of a side effect.
|
||||
let totalZones = null
|
||||
let zoneIds = null
|
||||
try {
|
||||
const postersDir = resolve(REPO, 'library/scripts/posters/out/posters')
|
||||
if (existsSync(postersDir)) totalZones = readdirSync(postersDir).filter((f) => f.endsWith('.html')).length
|
||||
} catch { /* the denominator is a nicety; its absence must not fail the gate */ }
|
||||
const DATA = resolve(REPO, 'plugin-designs/my-upg-100-list/data')
|
||||
const clusters = JSON.parse(readFileSync(join(DATA, 'clusters.json'), 'utf8'))
|
||||
const { buildLegendNodes, leafZones } = await import(pathToFileURL(join(DATA, 'legend-tree.js')).href)
|
||||
zoneIds = leafZones(buildLegendNodes(clusters, { records: null })).map((z) => z.id).sort()
|
||||
totalZones = zoneIds.length
|
||||
} catch (e) {
|
||||
// The denominator is a nicety and its absence must not fail the gate — but SAY so, because a
|
||||
// silently-absent denominator is exactly how the shortfall warning disappeared before.
|
||||
console.log(` (zone total unavailable: ${e.message})`)
|
||||
}
|
||||
|
||||
console.log(`\nPACKETS-ALL: ${files.length} packet(s) checked, ${files.length - failed.length} passed`)
|
||||
console.log(` zones covered : ${zones.length}${totalZones ? ` of ${totalZones}` : ''} — ${zones.join(', ')}`)
|
||||
if (totalZones && zones.length < totalZones) {
|
||||
console.log(` ⚠ ${totalZones - zones.length} zone(s) have NO packet here and were not rendered by`)
|
||||
console.log(' anything. Generate another with: bun run packet:ci (one zone, committed fixture,')
|
||||
console.log(' no network), or ONLY=<zone> node library/scripts/posters/packet.mjs.')
|
||||
// ★ COUNT AND LIST FROM ONE SET, derived the same way. My first version printed
|
||||
// `totalZones - zones.length` next to a list built by filtering zoneIds, and they disagreed on sight:
|
||||
// "21 zone(s)" above a list of 26. zones[] holds every FILE stem, which includes things that are not
|
||||
// zones at all — the four fixture-* packets and the `<zone>.frontier` ?list= variant — so it overcounts
|
||||
// coverage against a real-zone denominator. Two numbers describing one quantity, computed two ways, is
|
||||
// how a report contradicts itself in public; the derived list is now the single source and the count
|
||||
// is just its length.
|
||||
const covered = (zoneIds || []).filter((z) => zones.includes(z))
|
||||
const missing = (zoneIds || []).filter((z) => !zones.includes(z))
|
||||
const extras = zones.filter((z) => zoneIds && !zoneIds.includes(z))
|
||||
console.log(` zones covered : ${totalZones ? `${covered.length} of ${totalZones}` : zones.length}`
|
||||
+ ` — ${(totalZones ? covered : zones).join(', ') || '(none)'}`)
|
||||
// The fixture and ?list= packets are real coverage of the RENDERER and no coverage at all of a zone's
|
||||
// data shape. Reported separately rather than folded into the numerator, which is what made the old
|
||||
// line read "7 of 28" when only 2 real zones had ever been rendered.
|
||||
if (extras.length) {
|
||||
console.log(` also checked : ${extras.length} non-zone packet(s) — ${extras.join(', ')}`)
|
||||
console.log(' (fixtures and ?list= variants: they exercise the renderer, not a zone\'s data shape)')
|
||||
}
|
||||
if (totalZones && missing.length) {
|
||||
// ★ NAME THE MISSING ZONES, do not just count them. "26 zone(s) have no packet" tells a reader the
|
||||
// size of the hole; it does not tell them what to type, so nobody ever closed it. The list is the
|
||||
// actionable form — and it is what surfaced `deaf` as unreachable rather than merely ungenerated.
|
||||
console.log(` ⚠ ${missing.length} zone(s) have NO packet here and were not rendered by`)
|
||||
console.log(` anything: ${missing.join(', ')}`)
|
||||
console.log(' Generate all of them (committed fixture, NO network):')
|
||||
console.log(' node internal/build-packet-fixtures.mjs # the fixture zones')
|
||||
console.log(' ONLY=<zone> node library/scripts/posters/packet.mjs')
|
||||
}
|
||||
if (failed.length) {
|
||||
console.error(`PACKETS-ALL: FAIL — ${failed.length} packet(s): ${failed.join(', ')}`)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`PACKETS-ALL: PASS — every generated packet renders, across ${zones.length} zone(s) `
|
||||
+ 'and every locale present. This does NOT cover zones no one generated.')
|
||||
console.log(`PACKETS-ALL: PASS — every generated packet renders, across `
|
||||
+ `${totalZones ? `${covered.length} of ${totalZones}` : zones.length} zone(s) and every locale `
|
||||
+ `present.${missing.length ? ` This does NOT cover the ${missing.length} zone(s) named above.` : ''}`)
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import { ENGAGEMENT_COLORS } from '../../colors/engagement.js'
|
|||
import { ADOPTION_COLORS } from '../../colors/adoption.js'
|
||||
import { getLanguageFamilyColor } from '../../colors/language-family.js'
|
||||
import { getColorStrategy, COLOR_MODES } from '../../colors/_registry.js'
|
||||
import { PALETTE as RELIGION_COLORS, RELIGION_FAMILIES, getReligionFamily } from '../../colors/religion.js'
|
||||
import { PALETTE as RELIGION_COLORS, getReligionFamily, religionFamilyLabel } from '../../colors/religion.js'
|
||||
import { useLanguageFamilyLegendData } from './useLanguageFamilyLegendData.js'
|
||||
|
||||
const COLUMNS_SIMPLE = [] // e.g. affinity-blocs — no numeric columns
|
||||
|
|
@ -319,7 +319,11 @@ export function useLegendData(legendTypeRef, opts = {}) {
|
|||
})
|
||||
return order.map(fam => ({
|
||||
key: fam,
|
||||
label: RELIGION_FAMILIES[fam] || 'Unknown',
|
||||
// REGREL: the LABEL is localized, the VALUE is not. `key` and `filterKey` below stay the
|
||||
// canonical family letter, which is what the filter and the map compare on; only this
|
||||
// display string follows the reader's language. RELIGION_FAMILIES is no longer imported here:
|
||||
// religionFamilyLabel() reads it internally, so this file's only use of it was this label.
|
||||
label: religionFamilyLabel(fam) || 'Unknown',
|
||||
color: RELIGION_COLORS[fam] || '#94a3b8',
|
||||
count: familyAggregates[fam].count,
|
||||
population: familyAggregates[fam].population,
|
||||
|
|
|
|||
|
|
@ -77,6 +77,30 @@ export function useCsvExport({ rowStore, rows, selectionSet, filterSet, FACET_AC
|
|||
// What this export calls itself, and who to credit for the data. Defaults keep every existing
|
||||
// caller's file identical to the byte.
|
||||
exportLabel = 'Research Dashboard', sources = '',
|
||||
// ★ FOUR OPTIONS ADDED BY THE KIT'S FIRST REAL CONSUMER (go-int, 2026-09-27). Each one is a
|
||||
// pray-tools assumption this file was making silently; each default is exactly what
|
||||
// research-dashboard already did, so Big Picture's file is unchanged to the byte. A second
|
||||
// consumer is the only thing that finds these — I could not have told you they were assumptions
|
||||
// while there was one caller.
|
||||
//
|
||||
// columns: the EXACT column set and order to export. Default = today's behaviour (the canonical
|
||||
// EXPORT_FIELDS order, then any other key the API returned). go-int's spec asks for the VISIBLE
|
||||
// columns, and projecting rows before handing them over — its workaround — loses the ordering
|
||||
// this file exists to impose.
|
||||
columns = null,
|
||||
// wide: fetch the ALL-FIELDS record before writing. Default true = today's behaviour. A
|
||||
// static-table dashboard has nothing to widen FROM, so the fetch is a wasted network call that
|
||||
// would also pollute its rows with pray-tools fields.
|
||||
wide = true,
|
||||
// filename / hookPrefix: what the downloaded file is called, and the window hooks a browser gate
|
||||
// reads. Defaults are the existing literals, and that matters — __rdash* names are read
|
||||
// elsewhere in this tree, so changing the default would break checks that have nothing to do
|
||||
// with this landing.
|
||||
filename = 'research-dashboard.csv', hookPrefix = '__rdash',
|
||||
// keyOf: how a row identifies itself, for matching a narrow row to its wide twin and for reading
|
||||
// the selection. Default = `slug || id`, which is what this file assumed. config.data.primaryKey
|
||||
// is the config-level spelling of the same thing; go-int flagged the pair, and they should agree.
|
||||
keyOf = (r) => r && (r.slug || r.id),
|
||||
// Defaulted so a caller that predates D1 keeps working exactly as before rather than throwing.
|
||||
rowMatches = (r, ACC) => Object.keys(filterSet).every((k) => { const a = ACC[k]; return a ? a(r) === filterSet[k] : true }) }) {
|
||||
// slug -> wide API record, filled by the lazy all-fields fetch below.
|
||||
|
|
@ -92,6 +116,9 @@ export function useCsvExport({ rowStore, rows, selectionSet, filterSet, FACET_AC
|
|||
* `fields=` covering all of EXPORT_FIELDS instead of the render-sized defaultFields.
|
||||
*/
|
||||
function fetchWideRows() {
|
||||
// Nothing to widen FROM without a source, and nothing asked for when wide is off. Returning a
|
||||
// resolved null rather than throwing keeps exportCsvAsync's single call site unchanged.
|
||||
if (!wide || !(dataOpts && dataOpts.source)) return Promise.resolve(null)
|
||||
if (widePromise) return widePromise
|
||||
widePromise = (async () => {
|
||||
const sourceId = dataOpts.source || sourcesConfig.activeSource
|
||||
|
|
@ -106,7 +133,7 @@ export function useCsvExport({ rowStore, rows, selectionSet, filterSet, FACET_AC
|
|||
// Only the groups of this page's people-group LIST (library/lists/) are exported.
|
||||
const raw = await applyPeopleGroupList(Array.isArray(json) ? json : (json.posts || json.data || json.results || []), profileConfig)
|
||||
const map = new Map()
|
||||
for (const r of raw) { const k = r && (r.slug || r.id); if (k) map.set(k, r) }
|
||||
for (const r of raw) { const k = keyOf(r); if (k) map.set(k, r) }
|
||||
wideStore = map
|
||||
return map
|
||||
})().catch((e) => { widePromise = null; throw e }) // let a later click retry
|
||||
|
|
@ -116,7 +143,7 @@ export function useCsvExport({ rowStore, rows, selectionSet, filterSet, FACET_AC
|
|||
// Swap a loaded (narrow) row for its wide twin when the all-fields fetch has landed.
|
||||
function widen(r) {
|
||||
if (!wideStore) return r
|
||||
const w = wideStore.get(r && (r.slug || r.id))
|
||||
const w = wideStore.get(keyOf(r))
|
||||
return w ? { ...r, ...w } : r
|
||||
}
|
||||
|
||||
|
|
@ -164,8 +191,14 @@ export function useCsvExport({ rowStore, rows, selectionSet, filterSet, FACET_AC
|
|||
// Column order: the canonical EXPORT_FIELDS order first (so the sheet reads identity → place →
|
||||
// people → engagement → resources), then any key the API returned that the list doesn't name.
|
||||
// Union across rows, because a null-valued field can be absent on an individual record.
|
||||
// An explicit `columns` is taken AS GIVEN — order included, and without filtering to keys that
|
||||
// happen to be present. A column the reader can see must appear in the file even when every row
|
||||
// in this particular scope has it empty; dropping it would make the export's shape depend on the
|
||||
// filter, which is the opposite of what a column picker promises.
|
||||
const present = picked.reduce((set, r) => { Object.keys(r).forEach((k) => set.add(k)); return set }, new Set())
|
||||
const cols = [...EXPORT_FIELDS.filter((k) => present.has(k)), ...[...present].filter((k) => !EXPORT_FIELDS.includes(k))]
|
||||
const cols = Array.isArray(columns) && columns.length
|
||||
? columns.slice()
|
||||
: [...EXPORT_FIELDS.filter((k) => present.has(k)), ...[...present].filter((k) => !EXPORT_FIELDS.includes(k))]
|
||||
// Provenance stamp — a HUMAN-READABLE COMMENT line, so People codes are resolved to names
|
||||
// here exactly as the filter chips do. This is the ONLY place labelFor() is applied: the data
|
||||
// columns below are built from the API record via flatten()/cell() and are untouched, because
|
||||
|
|
@ -219,7 +252,7 @@ export function useCsvExport({ rowStore, rows, selectionSet, filterSet, FACET_AC
|
|||
// so it would have looked correct and been wrong — the quiet kind of breakage a positional change
|
||||
// leaves behind.
|
||||
const fields = (csv.split('\r\n')[0] || '').split(',').length
|
||||
try { if (typeof window !== 'undefined') window.__rdashLastCsv = csv } catch (_) { /* verify hook */ }
|
||||
try { if (typeof window !== 'undefined') window[hookPrefix + 'LastCsv'] = csv } catch (_) { /* verify hook */ }
|
||||
let clipboard = false, downloaded = false
|
||||
// 1) clipboard — works inside the sandboxed gem-frame iframe (the guaranteed path)
|
||||
try { if (typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(csv).catch(() => {}); clipboard = true } } catch (_) { /* no clipboard */ }
|
||||
|
|
@ -227,12 +260,12 @@ export function useCsvExport({ rowStore, rows, selectionSet, filterSet, FACET_AC
|
|||
try {
|
||||
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' })
|
||||
const url = URL.createObjectURL(blob)
|
||||
const a = document.createElement('a'); a.href = url; a.download = 'research-dashboard.csv'; a.style.display = 'none'
|
||||
const a = document.createElement('a'); a.href = url; a.download = filename; a.style.display = 'none'
|
||||
document.body.appendChild(a); a.click(); downloaded = true
|
||||
setTimeout(() => { try { URL.revokeObjectURL(url); a.remove() } catch (_) {} }, 200)
|
||||
} catch (_) { /* download blocked — clipboard above already has it */ }
|
||||
Object.assign(lastExport, { rows, clipboard, downloaded, fields, wide: !!wideStore, at: (typeof performance !== 'undefined' ? performance.now() : 0) })
|
||||
try { window.__rdashExportStatus = { rows, clipboard, downloaded, fields, wide: !!wideStore } } catch (_) {}
|
||||
try { window[hookPrefix + 'ExportStatus'] = { rows, clipboard, downloaded, fields, wide: !!wideStore } } catch (_) {}
|
||||
return { csv, rows, clipboard, downloaded, fields, wide: !!wideStore }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,10 @@ import langFamilyByLanguage from '../data/langFamilyByLanguage.json'
|
|||
// Religion search must group by FAMILY (same 10 families the Religion legend shows),
|
||||
// not by raw sub-type names — otherwise search surfaces 'Animism'/'Romanism' rows
|
||||
// the legend can't select. Reuse the legend's exact family logic.
|
||||
import { RELIGION_FAMILIES, getReligionFamily } from '../colors/religion.js'
|
||||
// RELIGION_FAMILIES is no longer imported: its only use here was the label that now goes through
|
||||
// religionFamilyLabel(), which reads the canonical map internally. The KEY still comes from
|
||||
// getReligionFamily, so nothing that is compared or sent changed.
|
||||
import { getReligionFamily, religionFamilyLabel } from '../colors/religion.js'
|
||||
|
||||
// ── Result category ordering by active-tab context (Round 16) ────────────────
|
||||
// The search bar is unified — every category is always searched — but the
|
||||
|
|
@ -319,11 +322,19 @@ function buildAggregates(entries) {
|
|||
// SAME extraction the legend uses (getReligionFamily on the religion code),
|
||||
// so every search result corresponds to a selectable Religion-legend row.
|
||||
// The raw sub-type names ('Animism') still MATCH via religionHay, but collapse
|
||||
// into their family row. label = family name so selection can resolve the
|
||||
// family letter back (see research-map onGeocoderAggregateResult religion branch).
|
||||
// into their family row.
|
||||
// ✗ THIS COMMENT USED TO SAY: "label = family name so selection can resolve the family letter back
|
||||
// (see research-map onGeocoderAggregateResult religion branch)". It was WRONG, and wrong in the
|
||||
// direction that forbids the fix below: it presented an English label as a REQUIREMENT of
|
||||
// selection. Measured 2026-09-27 — onGeocoderAggregateResult does not exist anywhere in this repo
|
||||
// (three comments name it, nothing defines it), and selection resolves by VALUE: aggregate() emits
|
||||
// `key` and `label` as SEPARATE fields (:262-263) with key from getReligionFamily, and the consumer
|
||||
// reads detail.expectedValue, never the label (country-posters/countries-map.vue:1611). So the label
|
||||
// is display-only and safe to localize. A stale comment that argues against a correct change is
|
||||
// worse than no comment: the next reader either reverts it or refuses the next one like it.
|
||||
religions: aggregate(
|
||||
(e) => getReligionFamily(e.feature.religion || e.feature._raw?.religion?.value || e.feature._raw?.religion || ''),
|
||||
(e) => RELIGION_FAMILIES[getReligionFamily(e.feature.religion || e.feature._raw?.religion?.value || e.feature._raw?.religion || '')] || 'Unknown'
|
||||
(e) => religionFamilyLabel(getReligionFamily(e.feature.religion || e.feature._raw?.religion?.value || e.feature._raw?.religion || '')) || 'Unknown'
|
||||
),
|
||||
// WAGF / DOXA regions (doxaRegion) — keyed by the region value so a search
|
||||
// for "Asia" collapses every pin in that region into one row. The click
|
||||
|
|
|
|||
|
|
@ -57,8 +57,20 @@ const API = process.env.VITE_API_BASE_URL || process.env.MAP_APP_API_URL;
|
|||
// BEFORE loadRecords() ever looks at PACKET_RECORDS, so `bun run packet:ci` exited 1 on a
|
||||
// tree that had everything it needed. It only passed in hand-testing because I had been
|
||||
// supplying a dummy host — the real invocation path is what exposed it.
|
||||
if (!API && !process.env.PACKET_RECORDS) {
|
||||
console.error('[packet] No API base — set VITE_API_BASE_URL, or PACKET_RECORDS for a fixture build.');
|
||||
// ⚠ AND THE SAME BUG HAD A SECOND ESCAPE HATCH, fixed 2026-09-27. The note above records this guard
|
||||
// being taught about PACKET_RECORDS; OFFLINE was never added to it. loadRecords() reads
|
||||
// `if (process.env.OFFLINE && existsSync(cache)) return ...` — a path that needs no API either — but
|
||||
// this check ran first and exited 1, so OFFLINE=1 was documented at the top of this file and could
|
||||
// never once have worked. That is worse than an undocumented feature: it sends a reader down a route
|
||||
// the program refuses. Any env var that makes the API unnecessary must be named HERE, next to the
|
||||
// guard, or it is decoration.
|
||||
const CACHE_OK = process.env.OFFLINE && existsSync(join(__dirname, 'out', '_records.json'));
|
||||
if (!API && !process.env.PACKET_RECORDS && !CACHE_OK) {
|
||||
console.error('[packet] No API base — set VITE_API_BASE_URL, or PACKET_RECORDS for a fixture build,');
|
||||
console.error(' or OFFLINE=1 to reuse out/_records.json if a previous run cached it.');
|
||||
if (process.env.OFFLINE) {
|
||||
console.error(' OFFLINE=1 was set but out/_records.json does not exist — nothing to reuse.');
|
||||
}
|
||||
console.error(' Failing closed.');
|
||||
process.exit(1);
|
||||
}
|
||||
|
|
@ -149,6 +161,9 @@ function buildFunnel(membership) {
|
|||
}
|
||||
const { evaluate } = await import(join(DATA, 'selector-evaluator.js'));
|
||||
const { normalizeRecords, extractRecords } = await import(join(DATA, 'normalize.js'));
|
||||
// The zone enumeration itself, so this generator, the poster generator and upg-100-list.vue cannot
|
||||
// disagree about which zones exist (see allZones below).
|
||||
const { buildLegendNodes, leafZones } = await import(join(DATA, 'legend-tree.js'));
|
||||
|
||||
async function loadRecords() {
|
||||
// ★ A COMMITTED FIXTURE, so CI can build a packet at all. out/ is gitignored — both the
|
||||
|
|
@ -168,7 +183,26 @@ async function loadRecords() {
|
|||
}
|
||||
const cache = join(__dirname, 'out', '_records.json');
|
||||
if (process.env.OFFLINE && existsSync(cache)) return JSON.parse(readFileSync(cache, 'utf8'));
|
||||
const fields = 'slug,name,country_code,population,religion,image_url,has_photo,picture_credit,latitude,longitude';
|
||||
// ★ THE FIELD LIST IS PART OF THE SELECTOR CONTRACT — every field a selector READS must be asked
|
||||
// for here, or its zone silently resolves to nothing and gets skipped as "no groups resolved".
|
||||
//
|
||||
// ⚠ SIX OF TWENTY-EIGHT ZONES WERE UNREACHABLE FOR THIS ONE REASON, measured 2026-09-27 while
|
||||
// raising check:packets-all's coverage. This list named country_code and no other selector field,
|
||||
// while selector-evaluator reads three more:
|
||||
// rop1 affinity_bloc -> deaf (rop1Code, :51)
|
||||
// wagf_block wagf_block -> west/east/central-africa (:102)
|
||||
// wagf_region wagf_region -> europe, and the union (:113, :136)
|
||||
// so those six zones evaluated to an EMPTY set for every record. The tell was unmistakable once
|
||||
// looked at: the records cache held 123 groups with "Deaf" in the name and evaluate() still returned
|
||||
// 0 slugs. It reads as missing DATA and is missing FIELDS.
|
||||
// ★ DERIVED, NOT TYPED: the presentation fields are listed, the selector fields come from the
|
||||
// evaluator's own requirements, so adding a selector type that reads a new field is a change in ONE
|
||||
// place. A hand-maintained superset drifts the moment someone adds a selector — which is exactly
|
||||
// what happened here.
|
||||
const PRESENTATION_FIELDS = ['slug', 'name', 'country_code', 'population', 'religion',
|
||||
'image_url', 'has_photo', 'picture_credit', 'latitude', 'longitude'];
|
||||
const SELECTOR_FIELDS = ['country_code', 'wagf_block', 'wagf_region', 'rop1'];
|
||||
const fields = [...new Set([...PRESENTATION_FIELDS, ...SELECTOR_FIELDS])].join(',');
|
||||
const r = await fetch(`${API}/api/people-groups/list?fields=${fields}&lang=${LANG}`,
|
||||
{ headers: { accept: 'application/json' } });
|
||||
if (!r.ok) throw new Error(`PG API ${r.status}`);
|
||||
|
|
@ -177,12 +211,37 @@ async function loadRecords() {
|
|||
return recs;
|
||||
}
|
||||
|
||||
// ★ ENUMERATE FROM THE LEGEND TREE, NOT FROM clusters.json'S KEYS — the same seam the POSTER
|
||||
// generator and upg-100-list.vue use, so all three agree on what "a zone" is.
|
||||
//
|
||||
// THE DEFECT THIS FIXES, measured 2026-09-27 while making check:packets-all cover every zone:
|
||||
// this function looped THREE cluster keys — lists (13) + asia_lists (12) + uncovered_lists (2) = 27
|
||||
// — and clusters.json has a FOURTH that carries zones: deaf_lists (2). legend-tree.js:106 states the
|
||||
// real arithmetic, "13 + 12 + 2 + 1 deaf = 28", because buildLegendNodes COLLAPSES the two deaf_lists
|
||||
// into ONE unified leaf (affinity bloc A017, R1.1). So `deaf` is a poster zone and a legend row that
|
||||
// no packet could ever be generated for: ONLY=deaf exited 1 with "no zone matches".
|
||||
//
|
||||
// ⚠ IT PRESENTED AS A COVERAGE GAP AND WAS A REACHABILITY BUG. check:packets-all printed
|
||||
// "zones covered : 2 of 28", which reads as "26 nobody got round to" — but one of the 26 was
|
||||
// unreachable by construction, and generating all of them would have silently produced 27, still
|
||||
// printed against a denominator of 28. The numerator counted packet zones and the denominator counted
|
||||
// POSTER files (out/posters/*.html), so the two sides were never the same population. A gap you can
|
||||
// close by working harder and a gap you cannot close at all look identical in that line.
|
||||
//
|
||||
// leafZones() carries id/zoneKey/label/count but NOT selector (leaves do not), so the selector is
|
||||
// re-attached by id exactly as generate.mjs:2801-2808 does it, deaf included.
|
||||
function allZones() {
|
||||
const out = [];
|
||||
const tops = buildLegendNodes(clusters, { records: null });
|
||||
const byId = {};
|
||||
for (const k of ['lists', 'asia_lists', 'uncovered_lists']) {
|
||||
for (const z of clusters[k] || []) out.push({ ...z, zoneKey: z.id });
|
||||
for (const z of clusters[k] || []) byId[z.id] = z.selector;
|
||||
}
|
||||
return out;
|
||||
// The unified deaf leaf's selector. DUPLICATED from legend-tree.js:99's DEAF_SELECTOR, which is
|
||||
// function-scoped rather than exported, and from generate.mjs:2805 which hardcodes the same literal.
|
||||
// Kept as a literal here rather than exporting a third consumer's dependency mid-hold; if a fourth
|
||||
// caller ever needs it, export it once from legend-tree.js and delete all three copies.
|
||||
byId.deaf = { type: 'affinity_bloc', rop1: 'A017' };
|
||||
return leafZones(tops).map((z) => ({ ...z, zoneKey: z.zoneKey || z.id, selector: byId[z.id] }));
|
||||
}
|
||||
|
||||
// ── PHOTOS: parallel fetch, inlined as data URIs ────────────────────────────
|
||||
|
|
|
|||
|
|
@ -193,6 +193,7 @@
|
|||
"check:script-flags": "node internal/check-script-flags-reachable.mjs",
|
||||
"check:settled": "node internal/settled-tree-gate.mjs",
|
||||
"check:sfc-parse": "node internal/check-sfc-script-parses.mjs",
|
||||
"check:religion-label-not-value": "node plugin-designs/regions-dashboard/scripts/check-religion-label-not-value.mjs",
|
||||
"check:share-policy": "node internal/check-share-policy.mjs",
|
||||
"check:shared-reached": "node internal/check-shared-component-reached-bundles.mjs",
|
||||
"check:shell-scroll": "node internal/verify-shell-scroll.mjs",
|
||||
|
|
@ -229,7 +230,7 @@
|
|||
"dev": "bun x vite",
|
||||
"fix:sri": "node internal/fix-sri.mjs",
|
||||
"gallery": "node internal/generate-gallery.mjs",
|
||||
"gates:post": "node internal/run-parallel.mjs --label=post -- check:drop check:parse verify check:sri check:public-hygiene check:label-joins check:facet-cascade check:facet-one-field check:heartbeat check:kpi-unit check:composite-reg check:descriptions check:no-abs-paths check:no-codename check:dep-names check:composite-srcs check:embed-targets check:nested-token check:i18n-parity check:tabs-localized check:packets-all check:packet-strings-parity check:zone-census check:share-policy check:library-index check:csv-shape check:capability-citations check:catalog-identity check:no-orphan-gates check:quoted-scripts check:done-evidence check:script-flags check:backlog-status check:capability-exemplars check:packet-fixture check:packet-browser check:provider-switch check:locale-reachable check:url-resolver check:manifest-covers check:one-palette check:pin-dim-slider check:legend-source check:backlog-refs check:clustering-modes check:composite-embed-knobs check:composite-locale-leaks check:linked-vocabulary check:wp-embed check:dashboard-geocoder-provider check:leaf-engine-per-provider check:map-props-unit check:composites-mount check:composite-interop check:no-free-identifiers check:map-fly-reduced-motion check:mst-clustering check:list-prop-unit check:profiles-mount check:cdn-pins check:no-eval check:popup-escaping check:i18n-treeshake check:pinned-umd check:one-palette:self-test check:no-cross-plugin-imports check:no-cross-plugin-imports:self-test check:map-attribution check:studio-rail check:approx-pin-note check:embedder-keys check:provider-for check:legend-logical-insets check:legend-logical-insets:self-test check:optional-t-equivalence check:text-highlight",
|
||||
"gates:post": "node internal/run-parallel.mjs --label=post -- check:drop check:parse verify check:sri check:public-hygiene check:label-joins check:facet-cascade check:facet-one-field check:heartbeat check:kpi-unit check:composite-reg check:descriptions check:no-abs-paths check:no-codename check:dep-names check:composite-srcs check:embed-targets check:nested-token check:i18n-parity check:tabs-localized check:packets-all check:packet-strings-parity check:zone-census check:share-policy check:library-index check:csv-shape check:capability-citations check:catalog-identity check:no-orphan-gates check:quoted-scripts check:done-evidence check:script-flags check:backlog-status check:capability-exemplars check:packet-fixture check:packet-browser check:provider-switch check:locale-reachable check:url-resolver check:manifest-covers check:one-palette check:pin-dim-slider check:legend-source check:backlog-refs check:clustering-modes check:composite-embed-knobs check:composite-locale-leaks check:linked-vocabulary check:wp-embed check:dashboard-geocoder-provider check:leaf-engine-per-provider check:map-props-unit check:composites-mount check:composite-interop check:no-free-identifiers check:map-fly-reduced-motion check:mst-clustering check:list-prop-unit check:profiles-mount check:cdn-pins check:no-eval check:popup-escaping check:i18n-treeshake check:pinned-umd check:one-palette:self-test check:no-cross-plugin-imports check:no-cross-plugin-imports:self-test check:map-attribution check:studio-rail check:approx-pin-note check:embedder-keys check:provider-for check:legend-logical-insets check:legend-logical-insets:self-test check:optional-t-equivalence check:text-highlight check:religion-label-not-value",
|
||||
"gates:pre": "node internal/run-parallel.mjs --label=pre -- check:template-literal check:mjs-parse check:sfc-parse check:tab-radius check:synced-css check:doc-scripts",
|
||||
"internet:adm1": "node plugin-designs/cities-internet/scripts/build-adm1-internet.mjs",
|
||||
"library-index": "node internal/generate-library-index.mjs",
|
||||
|
|
@ -387,6 +388,7 @@
|
|||
"check:provider-switch": "the provider switch must actually SWITCH: counts requests BY HOST (not window globals, which stay defined after a swap) and asserts the maplibre run stays within the leaf HTML's own declared api.mapbox.com preloads. Defaults to the upg-100 leaf; pass a URL or set BASE_URL for another. CONDITIONAL: SKIPs when nothing is served.",
|
||||
"check:published": "what readers are SERVED must be what we BUILT. Every other gate measures the local tree, so all of them stay green while a stale publish serves something else — and manufactures bug reports that cannot be reproduced. Compares the sha384 per bundle. SKIPs when the published host is unreachable (a network gate that goes red on flaky wifi gets ignored).",
|
||||
"check:quoted-scripts": "documentation/README-SECTION-3-cli-commands.md QUOTES the scripts block verbatim; it had silently drifted TWICE (a stale bunx cap:sync, and build:unlocked missing check:public-hygiene + check:label-joins). package.json is what RUNS — update the DOC.",
|
||||
"check:religion-label-not-value": "the library's two RELIGION_FAMILIES sites (useLegendData, useSearch) show religionFamilyLabel() to the reader, while the value a filter or search matches on stays the canonical English family name: a translated label must never become a wire value.",
|
||||
"check:scrim-viewport": "a full-screen SCRIM must cover the VIEWPORT, not just the content pane. A position:fixed;inset:0 scrim is PANE-relative wherever an ancestor sets contain/transform — VerticalTabsLayout sets contain:layout on .vtl-content — so a scrim dimmed 1024x793 @ (256,107) at a 1280x900 viewport and left the 256px rail CLICKABLE behind a modal. A source grep cannot see it: the declaration is correct, the ANCESTOR is the variable. Needs `bun run dev`; browser gate, not in build:unlocked.",
|
||||
"check:scrim-viewport:self-test": "reverts each scrim to plain inset:0 and requires EVERY case to FAIL — a gate that cannot fail is worse than no gate, and this one measures a property that looks fine in a screenshot either way.",
|
||||
"check:sfc-parse": "every .vue script block must parse as the BUILD parses it — catches the LIVE-CSS backtick that check:template-literal cannot see (it reads CSS comments only). 0 false positives on 83 files, where 3 lookahead heuristics scored 98 and 136.",
|
||||
|
|
|
|||
|
|
@ -160,16 +160,23 @@ async function fetchListRecords(list) {
|
|||
// copy a reader reads FIRST was the untranslated part. The <strong> travels inside the
|
||||
// translated string so each language can emphasise its own words, which is not something a
|
||||
// wrapper around an English sentence could do.
|
||||
// Guarded like every other useI18n() here: it throws on a host without vue-i18n.
|
||||
const humanizeKey = (k) => String(k).split('.').pop()
|
||||
.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/^./, (c) => c.toUpperCase())
|
||||
// C4 wave 3c: the guard is library/composables/useOptionalT.js now. humanizeKey STAYS as the fallback,
|
||||
// passed in, so a bare host still reads a title-cased last segment rather than a dotted key. No
|
||||
// namespace: callers pass FULL keys here, exactly as the raw useI18n().t they used to get.
|
||||
// ★ ONE BEHAVIOUR GAIN, stated rather than smuggled: the old i18n path was the bare useI18n().t, so on
|
||||
// a host WITH i18n a missing key rendered the raw dotted key. It now falls through to humanizeKey, the
|
||||
// same fallback the bare host already got. Nothing that resolves today changes.
|
||||
const t = useOptionalT('', { fallback: (k) => humanizeKey(k) })
|
||||
// Guarded like every other useI18n() here: it throws on a host without vue-i18n. useOptionalT stores
|
||||
// that guard once (host i18n -> catalogue -> the key) instead of a hand-rolled copy.
|
||||
// No namespace: callers pass FULL keys here, exactly as the raw useI18n().t they used to get.
|
||||
//
|
||||
// ★ ONE BEHAVIOUR GAIN FROM WAVE 3c (regions-plugin, 4c05e589): the old path was the bare
|
||||
// useI18n().t, so on a host WITH i18n a missing key rendered the raw dotted key. It now falls through.
|
||||
//
|
||||
// ★ AND THE humanizeKey FALLBACK IS GONE — the one deliberate departure from 4c05e589, which kept it.
|
||||
// It rendered a key's last segment title-cased, so a bare host showed "Upg100 Wall Intro" where a
|
||||
// whole SENTENCE exists: wrong even in English, and untranslatable because it comes from the
|
||||
// identifier rather than a catalogue. It was kept on the theory that these keys were not fully
|
||||
// catalogued — I told regions-plugin exactly that, and it was FALSE: this file's three keys are
|
||||
// present in all ELEVEN locales, 0 gaps (enumerated 2026-09-27; the only three, all string literals).
|
||||
// ⚠ IT GUARDS A BARE HOST, NOT A MISSING KEY. Those are different failures and I had them confused.
|
||||
// Product call taken by dx-shepherd (UPGHK, 2026-09-27) under the agent's standing goal that the
|
||||
// production maps be localized.
|
||||
const t = useOptionalT('')
|
||||
const intro = computed(() => t('messages.upg100WallIntro'))
|
||||
const heading = computed(() => t('messages.upg100WallHeading'))
|
||||
const wallTag = computed(() => t('messages.upg100WallTag'))
|
||||
|
|
|
|||
|
|
@ -46,17 +46,26 @@ import ShareButton from '@map/components/map-controls/ShareButton.vue'
|
|||
// wrapper never did. The chrome a reader sees FIRST was the untranslated part.
|
||||
//
|
||||
// ⚠ GUARDED, like every other useI18n() call in this codebase: it THROWS on a host that has not
|
||||
// installed vue-i18n, and this component is mounted by hosts we do not control. The fallback
|
||||
// humanises the key so a bare host shows "Select View", never a blank or a raw dotted key.
|
||||
const humanizeKey = (k) => String(k).split('.').pop()
|
||||
.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/^./, (c) => c.toUpperCase())
|
||||
// C4 wave 3c: the guard is library/composables/useOptionalT.js now. humanizeKey STAYS as the fallback,
|
||||
// passed in, so a bare host still reads a title-cased last segment rather than a dotted key. No
|
||||
// namespace: callers pass FULL keys here, exactly as the raw useI18n().t they used to get.
|
||||
// ★ ONE BEHAVIOUR GAIN, stated rather than smuggled: the old i18n path was the bare useI18n().t, so on
|
||||
// a host WITH i18n a missing key rendered the raw dotted key. It now falls through to humanizeKey, the
|
||||
// same fallback the bare host already got. Nothing that resolves today changes.
|
||||
const t = useOptionalT('', { fallback: (k) => humanizeKey(k) })
|
||||
// installed vue-i18n, and this component is mounted by hosts we do not control. useOptionalT holds
|
||||
// that guard once — host i18n first, then tStatic, then the key — instead of a hand-rolled copy here.
|
||||
// No namespace: callers pass FULL keys here, exactly as the raw useI18n().t they used to get.
|
||||
//
|
||||
// ★ ONE BEHAVIOUR GAIN FROM WAVE 3c, stated rather than smuggled (regions-plugin, 4c05e589): the old
|
||||
// i18n path was the bare useI18n().t, so on a host WITH i18n a missing key rendered the raw dotted key.
|
||||
// It now falls through to the catalogue instead.
|
||||
//
|
||||
// ★ AND THE humanizeKey FALLBACK IS GONE — the one deliberate departure from 4c05e589, which kept it.
|
||||
// It rendered a key's last segment title-cased, so a bare host showed "Select View": fine in English
|
||||
// and simply WRONG for every other reader, because it is derived from the identifier and cannot be
|
||||
// translated. Worse, it AGREED with en on these four keys (they are named after the words), so it
|
||||
// looked correct forever while every non-English reader silently got English. tStatic honours the
|
||||
// reader's locale and still ends at English.
|
||||
// The four keys this file uses (tabs.map / prayerResources / selectView / views) are present in all
|
||||
// ELEVEN locales, 0 gaps, enumerated 2026-09-27 — nothing here was relying on the fallback.
|
||||
// Product call taken by dx-shepherd (UPGHK, 2026-09-27) under the agent's standing goal that the
|
||||
// production maps be localized; it changes what seven vue-i18n-less bundles render, which is not a
|
||||
// decision a migration gets to make for itself.
|
||||
const t = useOptionalT('')
|
||||
|
||||
const cfg = inject('profileConfig', ref(null))
|
||||
const tk = inject('mapboxToken', ref(''))
|
||||
|
|
|
|||
|
|
@ -0,0 +1,105 @@
|
|||
#!/usr/bin/env node
|
||||
/* check-religion-label-not-value.mjs — `bun run check:religion-label-not-value`. Source-only, headless.
|
||||
*
|
||||
* REGREL: two LIBRARY sites showed RELIGION_FAMILIES values as English in every locale. The fix is to
|
||||
* project the LABEL through religionFamilyLabel() and leave the VALUE canonical English — because a
|
||||
* TRANSLATED VALUE MATCHES NOTHING. That is the language-link bug class: the moment a localized string
|
||||
* lands in a filter, a bus payload or an element attribute, the link works in English and silently
|
||||
* fails in Arabic.
|
||||
*
|
||||
* So this gate asserts BOTH halves. Projecting the label is the easy half; the half worth a gate is
|
||||
* that the value did NOT move with it.
|
||||
*/
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { resolve, dirname } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { codeOnly } from './strip-code.mjs'
|
||||
|
||||
const HERE = dirname(fileURLToPath(import.meta.url))
|
||||
const ROOT = resolve(HERE, '..', '..', '..')
|
||||
let fails = 0
|
||||
const ok = (c, m) => { console.log(` ${c ? 'ok ' : 'FAIL'} - ${m}`); if (!c) fails++ }
|
||||
const read = (p) => readFileSync(resolve(ROOT, p), 'utf8')
|
||||
|
||||
// ── 1. BEHAVIOUR, against the SHIPPED catalogues ────────────────────────────────────────────────
|
||||
// religion.js imports tStatic from library/i18n/index.js, which calls import.meta.glob — a Vite
|
||||
// transform plain Node cannot run. So religionFamilyLabel's REAL SOURCE is extracted and executed with
|
||||
// tStatic stubbed over the actual ar/ and en/ religion.json, rather than re-typed here: a copy would
|
||||
// test the copy. Same approach as check-provider-for.mjs and check-optional-t-equivalence.mjs.
|
||||
const relSrc = read('library/colors/religion.js')
|
||||
const famBlock = /export const RELIGION_FAMILIES = \{[\s\S]*?\n\}/.exec(relSrc)
|
||||
const labelFn = /export function religionFamilyLabel\(familyOrName\) \{[\s\S]*?\n\}/.exec(relSrc)
|
||||
if (!famBlock || !labelFn) {
|
||||
console.error(' FAIL - could not extract RELIGION_FAMILIES / religionFamilyLabel: NOT MEASURED, not passing')
|
||||
process.exit(2)
|
||||
}
|
||||
const en = JSON.parse(read('library/i18n/locales/en/religion.json'))
|
||||
const ar = JSON.parse(read('library/i18n/locales/ar/religion.json'))
|
||||
const messages = { en: { religion: en }, ar: { religion: ar } }
|
||||
const tStaticFor = (want) => (path) => {
|
||||
const walk = (loc) => String(path).split('.').reduce((o, k) => (o == null ? o : o[k]), messages[loc])
|
||||
const v = walk(want)
|
||||
return typeof v === 'string' ? v : walk('en')
|
||||
}
|
||||
const build = (want) => new Function('tStatic',
|
||||
famBlock[0].replace(/^export /, '') + ';\n' + labelFn[0].replace(/^export /, '')
|
||||
+ ';\nreturn { RELIGION_FAMILIES, religionFamilyLabel };')(tStaticFor(want))
|
||||
|
||||
const AR = build('ar'), EN = build('en')
|
||||
ok(AR.religionFamilyLabel('C') === ar.family.Christianity,
|
||||
`under ar the LABEL is Arabic ("${ar.family.Christianity}")`)
|
||||
ok(AR.RELIGION_FAMILIES.C === 'Christianity',
|
||||
'while the VALUE stays canonical English ("Christianity") -- a translated value would match nothing')
|
||||
ok(AR.religionFamilyLabel('C') !== AR.RELIGION_FAMILIES.C,
|
||||
'CONTROL: label and value really DIFFER under ar, so the projection is doing something')
|
||||
ok(EN.religionFamilyLabel('C') === 'Christianity',
|
||||
'under en the label equals the canonical name, so nothing changes for an English reader')
|
||||
ok(AR.religionFamilyLabel('M') === ar.family.Islam && AR.religionFamilyLabel('H') === ar.family.Hinduism,
|
||||
'and it holds for more than one family (Islam, Hinduism)')
|
||||
ok(AR.religionFamilyLabel('') === '', 'an empty family gives an empty label, not the word "undefined"')
|
||||
ok(AR.religionFamilyLabel('Christianity') === ar.family.Christianity,
|
||||
'it accepts a NAME as well as a letter, as its signature promises (familyOrName)')
|
||||
ok(AR.religionFamilyLabel('ZZZ') === 'ZZZ',
|
||||
'an unknown family falls through to the input rather than blanking the row')
|
||||
|
||||
// ── 2. THE HALF WORTH A GATE: the VALUE did not move with the label ─────────────────────────────
|
||||
const legend = codeOnly(read('library/composables/legends/useLegendData.js'))
|
||||
ok(/label:\s*religionFamilyLabel\(fam\)/.test(legend), 'useLegendData projects the LABEL through religionFamilyLabel(fam)')
|
||||
ok(/key:\s*fam\b/.test(legend), 'and `key` is still the canonical family letter')
|
||||
ok(/filterKey:\s*fam\b/.test(legend), 'and `filterKey` is still the canonical family letter -- this is what the filter compares')
|
||||
ok(!/key:\s*religionFamilyLabel|filterKey:\s*religionFamilyLabel/.test(legend),
|
||||
'NEG: neither key nor filterKey is derived from the localized label')
|
||||
|
||||
const search = codeOnly(read('library/composables/useSearch.js'))
|
||||
ok(/religions:\s*aggregate\(/.test(search), 'useSearch still aggregates religions')
|
||||
ok(/\(e\) => religionFamilyLabel\(getReligionFamily\(/.test(search),
|
||||
'its LABEL function goes through religionFamilyLabel()')
|
||||
ok(/\(e\) => getReligionFamily\(/.test(search),
|
||||
'and its KEY function is still bare getReligionFamily() -- the value is untouched')
|
||||
ok(/key,\n\s*label:/.test(search) || /\bkey,\s*$/m.test(search),
|
||||
'aggregate() still emits key and label as SEPARATE fields, so a consumer can choose')
|
||||
|
||||
// ── 3. the consumer really does resolve by VALUE, which is why (2) is sufficient ────────────────
|
||||
const consumer = codeOnly(read('plugin-designs/country-posters/countries-map.vue'))
|
||||
ok(/kind === 'religion'/.test(consumer) && /expectedValue = detail\.expectedValue/.test(consumer),
|
||||
'the religion consumer resolves by detail.expectedValue, never by the label (countries-map)')
|
||||
|
||||
// ── 4. the stale comment that argued AGAINST this fix is gone ───────────────────────────────────
|
||||
// ★ THIS ASSERTION FAILED ON MY OWN RETRACTION, which is worth recording. The first version required
|
||||
// that "onGeocoderAggregateResult religion branch" be ABSENT from the file — but the corrected comment
|
||||
// QUOTES that phrase in order to record what it used to claim, so the string is still there, inside the
|
||||
// retraction that fixes it. Requiring the absence of a phrase punishes documenting the error. What I
|
||||
// actually care about is that the claim is no longer presented as CURRENT, so assert the retraction.
|
||||
const searchRaw = read('library/composables/useSearch.js')
|
||||
ok(/USED TO SAY/.test(searchRaw) && /does not exist anywhere in this repo/.test(searchRaw),
|
||||
'the stale claim is RETRACTED in place, with the measurement that falsified it (the cited handler does not exist)')
|
||||
ok(!/\/\/ into their family row\. label = family name so selection/.test(searchRaw),
|
||||
'and it no longer reads as a live requirement -- the original standalone sentence is gone')
|
||||
|
||||
// ── 5. NEG CONTROL: the behavioural half must be capable of failing ─────────────────────────────
|
||||
const brokenLabel = (f) => ({ C: 'Christianity' })[f] || f // an English-only "projection"
|
||||
ok(brokenLabel('C') !== ar.family.Christianity,
|
||||
'NEG CONTROL: an English-only projection FAILS the ar assertion, so passing it means something')
|
||||
|
||||
console.log(fails ? `\nRELIGION-LABEL: ${fails} FAIL(s)` : '\nRELIGION-LABEL: the label follows the reader, the value stays canonical, and the filter still compares the value')
|
||||
process.exit(fails ? 1 : 0)
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <cities-internet-map> custom element. -->
|
||||
<script src="../cities-internet.js" integrity="sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <cities-internet-map> custom element. -->
|
||||
<script src="../cities-internet.js" integrity="sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <cities-internet-map> custom element. -->
|
||||
<script src="../cities-internet.js" integrity="sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+" 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
|
|
@ -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-loz2bnoioFdiQTWwjGA2O85kOboqZorN717h+a0zneEDSrv3uAD972Ivk6htt1gC" crossorigin="anonymous"></script>
|
||||
<script src="../../dashboard-plus-grid.js" integrity="sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-loz2bnoioFdiQTWwjGA2O85kOboqZorN717h+a0zneEDSrv3uAD972Ivk6htt1gC" crossorigin="anonymous"></script>
|
||||
<script src="../dashboard-plus-grid.js" integrity="sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@
|
|||
"bundle": "cities-internet",
|
||||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"output": "dx-maps/cities-internet/cities-internet.js",
|
||||
"integrity": "sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH",
|
||||
"integrity": "sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi",
|
||||
"elements": [
|
||||
"cities-internet-map"
|
||||
],
|
||||
|
|
@ -120,7 +120,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/connectivity-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -134,7 +134,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/connectivity-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -148,7 +148,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -157,7 +157,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "dx-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc",
|
||||
"integrity": "sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -177,7 +177,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc\" 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-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -191,7 +191,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc\" 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-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -205,7 +205,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc\" 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-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -214,7 +214,7 @@
|
|||
"bundle": "dashboard-plus-grid",
|
||||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"integrity": "sha384-loz2bnoioFdiQTWwjGA2O85kOboqZorN717h+a0zneEDSrv3uAD972Ivk6htt1gC",
|
||||
"integrity": "sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI",
|
||||
"elements": [
|
||||
"dashboard-plus-grid"
|
||||
],
|
||||
|
|
@ -234,7 +234,7 @@
|
|||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-loz2bnoioFdiQTWwjGA2O85kOboqZorN717h+a0zneEDSrv3uAD972Ivk6htt1gC\" 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-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -353,7 +353,7 @@
|
|||
"bundle": "doxa-research-map",
|
||||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
|
||||
"integrity": "sha384-r2Ntm0UAR6OVoZwrRWjh4Y73whd7DUGsM2IlKWak1w6DRJQN7PReZi2y3QgRYrqu",
|
||||
"integrity": "sha384-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy",
|
||||
"elements": [
|
||||
"doxa-research-map"
|
||||
],
|
||||
|
|
@ -369,7 +369,7 @@
|
|||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-r2Ntm0UAR6OVoZwrRWjh4Y73whd7DUGsM2IlKWak1w6DRJQN7PReZi2y3QgRYrqu\" 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-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -395,7 +395,7 @@
|
|||
"bundle": "doxa-simple-map",
|
||||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
|
||||
"integrity": "sha384-UeT9FGcOIfUdlQHKiX7b6EzOIazZplsbPDJ+B/khoCbd3hYl5b72VEePBS8UH5Vo",
|
||||
"integrity": "sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu",
|
||||
"elements": [
|
||||
"doxa-map",
|
||||
"doxa-simple-map"
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-UeT9FGcOIfUdlQHKiX7b6EzOIazZplsbPDJ+B/khoCbd3hYl5b72VEePBS8UH5Vo\" 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-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -663,7 +663,7 @@
|
|||
"bundle": "my-upg-100-list",
|
||||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"output": "dx-maps/my-upg-100-list/my-upg-100-list.js",
|
||||
"integrity": "sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj",
|
||||
"integrity": "sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd",
|
||||
"elements": [
|
||||
"my-upg-100-list-map"
|
||||
],
|
||||
|
|
@ -683,7 +683,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -697,7 +697,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -711,7 +711,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -944,7 +944,7 @@
|
|||
"bundle": "research-dashboard",
|
||||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"output": "dx-maps/research-dashboard/research-dashboard.js",
|
||||
"integrity": "sha384-dCJvlRSHcExS1S4hjM2xu09V0J6PF3/+PbpgHEPmJI+8zjohwSoPyaBf2539z43l",
|
||||
"integrity": "sha384-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai",
|
||||
"elements": [
|
||||
"research-dashboard-map"
|
||||
],
|
||||
|
|
@ -960,7 +960,7 @@
|
|||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-dCJvlRSHcExS1S4hjM2xu09V0J6PF3/+PbpgHEPmJI+8zjohwSoPyaBf2539z43l\" 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-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
|
||||
},
|
||||
"bundle": "research-dashboard"
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -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-r2Ntm0UAR6OVoZwrRWjh4Y73whd7DUGsM2IlKWak1w6DRJQN7PReZi2y3QgRYrqu" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-research-map.js" integrity="sha384-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-r2Ntm0UAR6OVoZwrRWjh4Y73whd7DUGsM2IlKWak1w6DRJQN7PReZi2y3QgRYrqu" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-research-map.js" integrity="sha384-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -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-UeT9FGcOIfUdlQHKiX7b6EzOIazZplsbPDJ+B/khoCbd3hYl5b72VEePBS8UH5Vo" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-UeT9FGcOIfUdlQHKiX7b6EzOIazZplsbPDJ+B/khoCbd3hYl5b72VEePBS8UH5Vo" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-UeT9FGcOIfUdlQHKiX7b6EzOIazZplsbPDJ+B/khoCbd3hYl5b72VEePBS8UH5Vo" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-simple-map.js" integrity="sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-UeT9FGcOIfUdlQHKiX7b6EzOIazZplsbPDJ+B/khoCbd3hYl5b72VEePBS8UH5Vo" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@
|
|||
"bundle": "cities-internet",
|
||||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"output": "dx-maps/cities-internet/cities-internet.js",
|
||||
"integrity": "sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH",
|
||||
"integrity": "sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi",
|
||||
"elements": [
|
||||
"cities-internet-map"
|
||||
],
|
||||
|
|
@ -120,7 +120,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/connectivity-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -134,7 +134,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/connectivity-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -148,7 +148,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-tiTYSH8Ogfjdqa2vfpp8w7aN1UxY0rR+sfpm/fGvn9qE+QZoI3cLBjZCvtqh+jvH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-TEa60jUSZEe26Znxq7yk9HM3bWSAMPS2pPJyqR/RK9n2gukIjaFbprZJqyyuEBqi\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -157,7 +157,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "dx-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc",
|
||||
"integrity": "sha384-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -177,7 +177,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc\" 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-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -191,7 +191,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc\" 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-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -205,7 +205,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Lk7U+kyC+Y9jnYHLNFHCkppJOsbhW11o1eeB/Pge3m37anPhFXimn5DgPv10hSmc\" 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-VHRJr6HONCpEwvIPzTo5H/wE9ZZTcbU2EbuAyB1Kp2FZW4h8JXWFtaM04pFNg3U+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -214,7 +214,7 @@
|
|||
"bundle": "dashboard-plus-grid",
|
||||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"integrity": "sha384-loz2bnoioFdiQTWwjGA2O85kOboqZorN717h+a0zneEDSrv3uAD972Ivk6htt1gC",
|
||||
"integrity": "sha384-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI",
|
||||
"elements": [
|
||||
"dashboard-plus-grid"
|
||||
],
|
||||
|
|
@ -234,7 +234,7 @@
|
|||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-loz2bnoioFdiQTWwjGA2O85kOboqZorN717h+a0zneEDSrv3uAD972Ivk6htt1gC\" 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-l70PIAzb9fZHUTbU7+ZlzMBYR6URPHiWbth8ji+Cv1DpQMedVy3JtL0xQqZBf6YI\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -353,7 +353,7 @@
|
|||
"bundle": "doxa-research-map",
|
||||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
|
||||
"integrity": "sha384-r2Ntm0UAR6OVoZwrRWjh4Y73whd7DUGsM2IlKWak1w6DRJQN7PReZi2y3QgRYrqu",
|
||||
"integrity": "sha384-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy",
|
||||
"elements": [
|
||||
"doxa-research-map"
|
||||
],
|
||||
|
|
@ -369,7 +369,7 @@
|
|||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-r2Ntm0UAR6OVoZwrRWjh4Y73whd7DUGsM2IlKWak1w6DRJQN7PReZi2y3QgRYrqu\" 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-VfUw4aKNUIGAZXBQEBnLXxhqj6lXsdu2ad89auanWRSMsrnubHsiLnVFnVRuGhYy\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -395,7 +395,7 @@
|
|||
"bundle": "doxa-simple-map",
|
||||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
|
||||
"integrity": "sha384-UeT9FGcOIfUdlQHKiX7b6EzOIazZplsbPDJ+B/khoCbd3hYl5b72VEePBS8UH5Vo",
|
||||
"integrity": "sha384-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu",
|
||||
"elements": [
|
||||
"doxa-map",
|
||||
"doxa-simple-map"
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-UeT9FGcOIfUdlQHKiX7b6EzOIazZplsbPDJ+B/khoCbd3hYl5b72VEePBS8UH5Vo\" 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-MPXYJ2wFLbY2XHm9qtUyNv6A8AVHr+CdzthtxE8n9Uqd6543c1ROc3QM+JiJw6Nu\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -663,7 +663,7 @@
|
|||
"bundle": "my-upg-100-list",
|
||||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"output": "dx-maps/my-upg-100-list/my-upg-100-list.js",
|
||||
"integrity": "sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj",
|
||||
"integrity": "sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd",
|
||||
"elements": [
|
||||
"my-upg-100-list-map"
|
||||
],
|
||||
|
|
@ -683,7 +683,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -697,7 +697,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -711,7 +711,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -944,7 +944,7 @@
|
|||
"bundle": "research-dashboard",
|
||||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"output": "dx-maps/research-dashboard/research-dashboard.js",
|
||||
"integrity": "sha384-dCJvlRSHcExS1S4hjM2xu09V0J6PF3/+PbpgHEPmJI+8zjohwSoPyaBf2539z43l",
|
||||
"integrity": "sha384-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai",
|
||||
"elements": [
|
||||
"research-dashboard-map"
|
||||
],
|
||||
|
|
@ -960,7 +960,7 @@
|
|||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-dCJvlRSHcExS1S4hjM2xu09V0J6PF3/+PbpgHEPmJI+8zjohwSoPyaBf2539z43l\" 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-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
|
||||
},
|
||||
"bundle": "research-dashboard"
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-jSw2cGOaBfg2LS3+44IHUnI7SJnl9mqRZNNDLjPlLhA95uSlv8CYlVNtuFZE8wrj" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-7CZVqdpzX3zrSD7S9WuJGRamHCqsm4bRO98CPeP+TFSFsnB7sQhz0k0g0/uoF2sd" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -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-dCJvlRSHcExS1S4hjM2xu09V0J6PF3/+PbpgHEPmJI+8zjohwSoPyaBf2539z43l" crossorigin="anonymous"></script>
|
||||
<script src="../research-dashboard.js" integrity="sha384-7USsQFpUeqhogUHXRFY9ZvTpCZ2bqOLyPphxfTYpx/Nj97/28m9Pkb7sb3iuMVai" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
Loading…
Reference in a new issue