Update from source 2b826795
This commit is contained in:
parent
7de15f213d
commit
f294159b64
118 changed files with 1719 additions and 728 deletions
|
|
@ -28,6 +28,8 @@ and a change here can break other maps.
|
|||
`import … from '@map/components/charts/BarChart.vue'`
|
||||
- **ProgressBar** — ProgressBar.vue — the DX-life progress bar: a single-value track, or a segmented one with a legend.
|
||||
`import … from '@map/components/charts/ProgressBar.vue'`
|
||||
- **DashboardBreadcrumb** — ── KIT LANDING 4c-4: MOVED FROM plugin-designs/research-dashboard/ ───────────────────────────
|
||||
`import … from '@map/components/dashboards/DashboardBreadcrumb.vue'`
|
||||
- **DashboardFacetRail** — DashboardFacetRail (was Sidebar.vue) — RDASH redesign phase 2: the floating @map SemanticTreeLegend is DROPPED
|
||||
`import … from '@map/components/dashboards/DashboardFacetRail.vue'`
|
||||
- **DashboardFilterChips** — DashboardFilterChips — the live filterSet rendered as removable AND-stacked chips
|
||||
|
|
@ -133,6 +135,8 @@ and a change here can break other maps.
|
|||
`import … from '@map/composables/useCountryOutline.js'`
|
||||
- **useCsvExport** — useCsvExport.js — ★ SHARED LIBRARY CODE (dashboard-kit landing 3). Two parameters make it
|
||||
`import … from '@map/composables/useCsvExport.js'`
|
||||
- **useDashboardData** — useDashboardData.js — RDASH phase 2: the single in-memory row store (kills the hardcode).
|
||||
`import … from '@map/composables/useDashboardData.js'`
|
||||
- **useDashboardLayout** — useDashboardLayout.js — reusable drag-resize + persistence engine for the CMV dashboard grid.
|
||||
`import … from '@map/composables/useDashboardLayout.js'`
|
||||
- **useDashboardSearch** — useDashboardSearch.js — the ONE free-text search the whole dashboard shares.
|
||||
|
|
@ -212,6 +216,8 @@ and a change here can break other maps.
|
|||
`import … from '@map/utils/countryName.js'`
|
||||
- **embedBase** — embedBase.js — Where THIS bundle's built tree is served from, resolved at runtime.
|
||||
`import … from '@map/utils/embedBase.js'`
|
||||
- **formatCount** — formatCount — the ONE place the fleet decides how a COUNT is punctuated.
|
||||
`import … from '@map/utils/formatCount.js'`
|
||||
- **geoUtils** — geoUtils.js — Geographic / GeoJSON Utility Functions
|
||||
`import … from '@map/utils/geoUtils.js'`
|
||||
- **html** — html.js — the two helpers every HTML string built in library/ must use (CRITIC-3, 2026-09-26).
|
||||
|
|
|
|||
|
|
@ -73,6 +73,12 @@ function shadowCssOf(script, filename) {
|
|||
if (node.type === 'CallExpression' && node.callee && node.callee.name === 'useShadowStyles') {
|
||||
const acc = { css: '', complete: true }
|
||||
fold(node.arguments[0], acc)
|
||||
// The style ID (second argument). A plain identifier is the only correct shape: a CSS rule moved
|
||||
// past the first argument concatenates onto it ('@media(...){...}doxa-gospel-map'), which is valid
|
||||
// JS, keeps the build green and silently loses the rule (gospel-plugin's trap, COMMON.md).
|
||||
const lab = { text: '', literal: true, present: !!node.arguments[1] }
|
||||
if (node.arguments[1]) { const la = { css: '', complete: true }; fold(node.arguments[1], la); lab.text = la.css; lab.literal = la.complete }
|
||||
acc.label = lab
|
||||
found.push(acc)
|
||||
}
|
||||
for (const k of Object.keys(node)) {
|
||||
|
|
@ -153,6 +159,14 @@ ok(r.open === 1 && !r.orphans.length, 'a data: URL with a ; inside url() does no
|
|||
ok(got.length === 1 && got[0].complete === false,
|
||||
'an argument built partly from an imported constant is reported PARTIAL, not scanned as a whole sheet')
|
||||
}
|
||||
{
|
||||
// gospel-plugin's trap: a rule moved past the CSS argument concatenates onto the style id
|
||||
const trap = "useShadowStyles('.a{ color:red; }', '@media (max-width:1px){ .b{ color:red; } }' + 'doxa-gospel-map')"
|
||||
const lab = shadowCssOf(trap, 'x.js')[0].label
|
||||
ok(lab.literal && !/^[a-z0-9-]+$/.test(lab.text), 'the style-id arm reads a rule concatenated onto the id as NOT a plain identifier')
|
||||
const good = shadowCssOf("useShadowStyles('.a{ color:red; }', 'doxa-gospel-map')", 'x.js')[0].label
|
||||
ok(good.literal && /^[a-z0-9-]+$/.test(good.text), 'NEG CONTROL: a plain id passes the style-id arm')
|
||||
}
|
||||
|
||||
// ── the tree ────────────────────────────────────────────────────────────────────────────────────
|
||||
const walk = (d) => readdirSync(d).flatMap((f) => {
|
||||
|
|
@ -172,7 +186,13 @@ for (const f of files) {
|
|||
let blocks
|
||||
try { blocks = scriptsOf(f, src).flatMap((s) => shadowCssOf(s, f)) }
|
||||
catch (e) { console.log(` FAIL - ${rel(f)}: could not be parsed (${e.message.slice(0, 70)})`); fails++; continue }
|
||||
for (const { css, complete } of blocks) {
|
||||
for (const { css, complete, label } of blocks) {
|
||||
// ID arm: a literal style ID must be a plain identifier. A computed one (a variable) is left alone.
|
||||
if (label && label.present && label.literal && !/^[a-z0-9-]+$/.test(label.text)) {
|
||||
console.log(` FAIL - ${rel(f)}: useShadowStyles id is not a plain identifier: ${JSON.stringify(label.text.slice(0, 80))}`)
|
||||
console.log(' a CSS rule has probably been concatenated onto the id; move it back into the first argument')
|
||||
fails++
|
||||
}
|
||||
if (!/[{}]/.test(css)) { partials.push(f); continue }
|
||||
// ★ A PARTIAL ARGUMENT IS STILL SCANNED, and skipping it was a false green waiting to happen.
|
||||
// region-dashboards.vue builds its sheet as DXLIFE_TOKENS + SHADOW_BOX_SIZING_RESET + literals,
|
||||
|
|
|
|||
172
internal/check-square-map-controls.mjs
Normal file
172
internal/check-square-map-controls.mjs
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
#!/usr/bin/env node
|
||||
// check-square-map-controls.mjs — `bun run check:square-map-controls`. Source-only, headless, no network.
|
||||
//
|
||||
// The square map-control variant: is it the ENGINE'S card, and does nothing else move?
|
||||
//
|
||||
// The agent asked for square controls as an OPTION beside the round ones. The key fact that shaped
|
||||
// the implementation is that the square look is not a design of DX-life's at all: their CountryMap.vue
|
||||
// adds mapboxgl.NavigationControl + FullscreenControl and overrides NOTHING, so what he admired is the
|
||||
// ENGINE'S DEFAULT grouped card. That makes the target published and exact rather than a matter of
|
||||
// taste -- so this check reads the engine's own stylesheet out of node_modules and compares our ported
|
||||
// values against it. A port checked against its SOURCE cannot drift with my memory of it.
|
||||
//
|
||||
// AND IT ASSERTS THE BLAST RADIUS, which is the half a visual review cannot see: round is the default
|
||||
// and no consumer opts in, so all nine maps that use MapToolbar render exactly as before.
|
||||
import { readFileSync, existsSync } from 'node:fs'
|
||||
import { resolve, dirname, join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
// Each copy of this repo grades ITS OWN tree (check:no-abs-paths, 2026-09-24).
|
||||
const REPO = process.env.DOXA_REPO || resolve(dirname(fileURLToPath(import.meta.url)), '..')
|
||||
const rd = (p) => readFileSync(join(REPO, p), 'utf8')
|
||||
|
||||
let fails = 0
|
||||
const ok = (c, m) => { console.log(` ${c ? 'ok ' : 'FAIL'} - ${m}`); if (!c) fails++ }
|
||||
|
||||
const TOOLBAR_SRC = rd('library/components/map-controls/MapToolbar.vue')
|
||||
const BUTTON = rd('library/components/map-controls/MapControlButton.vue')
|
||||
|
||||
// ★ CSS ASSERTIONS READ THE STYLESHEET, NOT THE FILE. The first run of this check went red on
|
||||
// "we do not adopt 29px" -- because the prop's own doc comment QUOTES the engine's rule, 29px and all.
|
||||
// A comment is not a declaration, and a checker that cannot tell them apart will keep finding the
|
||||
// documentation it is standing on. So the CSS tests run against the text actually passed to
|
||||
// useShadowStyles; the prop and template tests still read the whole file, which is where they live.
|
||||
function shadowCss(src) {
|
||||
const at = src.indexOf('useShadowStyles(')
|
||||
const open = src.indexOf('`', at)
|
||||
const close = src.indexOf('`', open + 1)
|
||||
return open < 0 || close < 0 ? '' : src.slice(open + 1, close)
|
||||
}
|
||||
const TOOLBAR = shadowCss(TOOLBAR_SRC)
|
||||
if (!TOOLBAR.trim()) { console.log(' FAIL - could not extract MapToolbar\'s stylesheet; nothing below was measured'); process.exit(1) }
|
||||
|
||||
// ── 1. the ENGINE is the oracle, read from node_modules ─────────────────────────────────────────
|
||||
const ENGINE = 'node_modules/maplibre-gl/dist/maplibre-gl.css'
|
||||
if (existsSync(join(REPO, ENGINE))) {
|
||||
const css = rd(ENGINE).replace(/\/\*[\s\S]*?\*\//g, ' ')
|
||||
const rule = (sel) => {
|
||||
const m = css.match(new RegExp(sel.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '\\s*\\{([^}]*)\\}'))
|
||||
return m ? m[1].replace(/\s+/g, ' ').trim() : null
|
||||
}
|
||||
const group = rule('.maplibregl-ctrl-group')
|
||||
const filled = rule('.maplibregl-ctrl-group:not(:empty)')
|
||||
const divider = rule('.maplibregl-ctrl-group button+button')
|
||||
console.log(`\n the engine's own rules, read from ${ENGINE}:`)
|
||||
console.log(` group { ${group} }`)
|
||||
console.log(` filled { ${filled} }`)
|
||||
console.log(` divider { ${divider} }`)
|
||||
|
||||
const radius = (group || '').match(/border-radius:\s*([^;]+)/)
|
||||
ok(!!radius && radius[1].trim() === '4px', `the engine's group radius is 4px, and ours is too`)
|
||||
ok(/border-radius:\s*4px;/.test(TOOLBAR), 'our .map-toolbar--square carries border-radius:4px')
|
||||
|
||||
const ring = (filled || '').match(/box-shadow:\s*([^;]+)/)
|
||||
ok(!!ring, 'the engine states a ring on a non-empty group')
|
||||
ok(/box-shadow:\s*0 0 0 2px rgba\(0, 0, 0, 0\.1\)/.test(TOOLBAR),
|
||||
`our ring matches the engine's 0 0 0 2px rgba(0,0,0,.1) (engine: ${ring && ring[1]})`)
|
||||
|
||||
ok(/border-top:\s*1px solid #ddd/.test(TOOLBAR),
|
||||
`our divider matches the engine's 1px solid #ddd (engine: ${divider})`)
|
||||
|
||||
// ★ the ONE value deliberately NOT ported
|
||||
const btn = rule('.maplibregl-ctrl-group button')
|
||||
const eng = (btn || '').match(/height:\s*(\d+)px/)
|
||||
ok(!!eng && eng[1] === '29', `the engine sizes its buttons ${eng && eng[1]}px`)
|
||||
ok(!new RegExp('height:\\s*29px').test(TOOLBAR) && !new RegExp('width:\\s*29px').test(TOOLBAR),
|
||||
'and we DO NOT adopt 29px -- the variant takes the SHAPE and leaves the SIZE, so the touch target is not cut')
|
||||
ok(/--map-btn-size/.test(TOOLBAR), 'our size still comes from --map-btn-size')
|
||||
} else {
|
||||
console.log(`\n NOT MEASURED against the engine: ${ENGINE} is absent, so the ported values were not compared to their source.`)
|
||||
fails++ // a missing oracle is not a pass
|
||||
}
|
||||
|
||||
// ── 2. the grouped card is a CONTAINER, not a radius swap ───────────────────────────────────────
|
||||
ok(/\.map-toolbar--square\s*\{[^}]*gap:\s*0/.test(TOOLBAR), 'the square toolbar sets gap:0 -- one panel, not a spaced column')
|
||||
ok(/\.map-toolbar--square\s*\{[^}]*background:\s*#fff/.test(TOOLBAR), 'the PANEL owns the background')
|
||||
ok(/\.map-toolbar--square \.mcb[^{]*\{[^}]*background:\s*transparent/.test(TOOLBAR), 'and the buttons own none of it')
|
||||
ok(/\.map-toolbar--square \.mcb[^{]*\{[^}]*box-shadow:\s*none/.test(TOOLBAR), 'the buttons drop their own shadow, so there is one ring not N')
|
||||
ok(/\.map-toolbar--square > \* \+ \*\s*\{[^}]*border-top/.test(TOOLBAR),
|
||||
'the divider is on the toolbar CHILDREN, so it still lands where two different control types meet')
|
||||
ok(/\.map-toolbar--square \.hbg-ctrl\s*\{[^}]*margin:\s*0/.test(TOOLBAR),
|
||||
"the hamburger wrapper's 10px margin is zeroed -- it would otherwise tear the panel apart")
|
||||
|
||||
// ★ no overflow:hidden, and the reason is a focus ring
|
||||
ok(!/\.map-toolbar--square\s*\{[^}]*overflow:\s*hidden/.test(TOOLBAR),
|
||||
'the square panel does NOT use overflow:hidden -- it would clip a focus ring on any inner button')
|
||||
ok(/:first-child[^{]*\{[^}]*border-radius:\s*4px 4px 0 0/.test(TOOLBAR) &&
|
||||
/:last-child[^{]*\{[^}]*border-radius:\s*0 0 4px 4px/.test(TOOLBAR),
|
||||
'outer corners come from first/last child rounding instead, which is the engine\'s own mechanism')
|
||||
ok(/:only-child[^{]*\{[^}]*border-radius:\s*4px/.test(TOOLBAR), 'and a lone control is rounded on all four corners')
|
||||
|
||||
// ── 2b. THE PANEL SURVIVES THE PHONE, which it did not at first ────────────────────────
|
||||
// A media query adds NO specificity, so the mobile `.map-toolbar { gap: 6px }` is (0,1,0) exactly like
|
||||
// `.map-toolbar--square { gap: 0 }` and, coming later, WON -- a square toolbar fell back to six
|
||||
// separate buttons inside one ringed panel on every phone. The --no-geocoder pair is (0,2,0) and
|
||||
// outranked the variant whatever the order, so it needs the two-class answer.
|
||||
{
|
||||
const mq = TOOLBAR.indexOf('@media (max-width: 767px)')
|
||||
ok(mq > -1, 'the mobile media block is present')
|
||||
const mobile = mq > -1 ? TOOLBAR.slice(mq) : ''
|
||||
ok(/\.map-toolbar--square[^{]*\{[^}]*gap:\s*0/.test(mobile),
|
||||
'the square variant re-states gap:0 INSIDE the mobile block, so the phone rule cannot outrank it')
|
||||
ok(/\.map-toolbar--square\.map-toolbar--no-geocoder[^{]*\{[^}]*gap:\s*0/.test(mobile),
|
||||
'and answers the (0,2,0) --no-geocoder pair with the two-class form')
|
||||
const sqGap = TOOLBAR.indexOf('.map-toolbar--square {')
|
||||
ok(sqGap > -1 && sqGap < mq, 'CONTROL: the base square rule really does come BEFORE the media block, which is why the override is needed at all')
|
||||
}
|
||||
|
||||
// ── 3. forced colours, which the round buttons never had ────────────────────────────────────────
|
||||
ok(/@media \(forced-colors: active\)/.test(TOOLBAR), 'the square variant ships a forced-colors block')
|
||||
ok(/ButtonText/.test(TOOLBAR), 'using ButtonText, so the ring and dividers survive a replaced palette')
|
||||
|
||||
// ── 4. the standalone per-button override ───────────────────────────────────────────────────────
|
||||
ok(/shape:\s*\{ type: String,\s*default: 'round' \}/.test(BUTTON), "MapControlButton's shape defaults to 'round'")
|
||||
ok(/\.mcb--square\{ border-radius:4px; \}/.test(BUTTON), 'a standalone square takes the engine\'s 4px corners')
|
||||
ok(/'mcb--square': shape === 'square'/.test(BUTTON), 'and the class is bound to the prop')
|
||||
|
||||
// ── 5. BLAST RADIUS: round is the default and nobody opted in ────────────────────────────────────
|
||||
ok(/controls:\s*\{ type: String, default: 'round' \}/.test(TOOLBAR_SRC), "MapToolbar's controls prop defaults to 'round'")
|
||||
const CONSUMERS = [
|
||||
['doxa-simple-map', 'plugin-designs/doxa-simple-map/doxa-simple-map.vue', 8],
|
||||
['resources-map', 'plugin-designs/gospel-resources/resources-map.vue', 5],
|
||||
['upg-100-list', 'plugin-designs/my-upg-100-list/upg-100-list.vue', 6],
|
||||
['countries-map', 'plugin-designs/country-posters/countries-map.vue', 5],
|
||||
['DashboardMapPanel', 'plugin-designs/research-dashboard/src/components/dashboards/DashboardMapPanel.vue', 2],
|
||||
['demo-map', 'plugin-designs/demo-map/demo-map.vue', 5],
|
||||
['connectivity-map', 'plugin-designs/cities-internet/connectivity-map.vue', 5],
|
||||
['research-map', 'plugin-designs/doxa-research-map/research-map.vue', 7],
|
||||
['all-people-groups', 'plugin-designs/all-people-groups/all-people-groups.vue', 1],
|
||||
]
|
||||
let optedIn = 0
|
||||
for (const [name, path] of CONSUMERS) {
|
||||
const src = rd(path)
|
||||
const m = src.match(/<MapToolbar[^>]*controls=/)
|
||||
if (m) { optedIn++; console.log(` ${name} opts in`) }
|
||||
}
|
||||
ok(optedIn === 0, `none of the ${CONSUMERS.length} MapToolbar consumers passes controls=, so every one renders exactly as before (${optedIn} opted in)`)
|
||||
|
||||
// ── 6. THE GEOMETRY, for rega to confirm with eyes ──────────────────────────────────────────────
|
||||
// A square toolbar is SHORTER, because the gaps become dividers. That is the one measurable knock-on:
|
||||
// MapControlMenu's matchToolbar limits a menu to the toolbar column's height.
|
||||
const BTN = 32, GAP_DESKTOP = 8, GAP_MOBILE = 6
|
||||
console.log('\n toolbar column height, round vs square (button 32px; ring is box-shadow, so outside layout):')
|
||||
for (const [name, , n] of CONSUMERS) {
|
||||
const round = n * BTN + (n - 1) * GAP_DESKTOP
|
||||
const square = n * BTN + (n - 1) * 1 // 1px dividers replace the 8px gaps
|
||||
console.log(` ${String(n).padStart(2)} control(s) ${name.padEnd(18)} round ${String(round).padStart(3)}px square ${String(square).padStart(3)}px shorter by ${round - square}px`)
|
||||
}
|
||||
const five = { round: 5 * BTN + 4 * GAP_DESKTOP, square: 5 * BTN + 4 }
|
||||
ok(five.square < five.round,
|
||||
`a 5-control toolbar goes ${five.round}px -> ${five.square}px, so a matchToolbar menu gets ${five.round - five.square}px shorter -- rega should confirm the menu still fits its content`)
|
||||
console.log(` at mobile gap ${GAP_MOBILE}px a 5-control toolbar is ${5 * BTN + 4 * GAP_MOBILE}px round vs ${five.square}px square`)
|
||||
|
||||
// ── 7. NEG CONTROLS ─────────────────────────────────────────────────────────────────────────────
|
||||
ok(!/\.map-toolbar\s*\{[^}]*border-radius/.test(TOOLBAR),
|
||||
'NEG CONTROL: the DEFAULT .map-toolbar has no border-radius, so the square rules are genuinely scoped to the variant')
|
||||
ok(/border-radius:\s*50%/.test(BUTTON),
|
||||
'NEG CONTROL: the round button is still a 50% circle -- the default was not quietly changed')
|
||||
ok(!/controls === 'round'/.test(TOOLBAR_SRC),
|
||||
'NEG CONTROL: nothing branches on round, so round is the ABSENCE of the square class rather than a second code path')
|
||||
|
||||
console.log(fails ? `\nSQUARE-CONTROLS: ${fails} FAIL(s)` : '\nSQUARE-CONTROLS: the variant matches the engine\'s own rules, keeps our touch target, and changes no consumer')
|
||||
process.exit(fails ? 1 : 0)
|
||||
|
|
@ -5,7 +5,9 @@
|
|||
* The agent's ask (2026-09-26): one FOLDER per BUNDLE with its ELEMENTS inside, bundles sorted by
|
||||
* capability, highest first. Runs the studio's REAL treeSections / compositionTrees / rowsFromManifest
|
||||
* (loaded through Vite, no browser) against the BUILT manifest and asserts:
|
||||
* - sections run CAP 5 → 1, and each bundle sits in the section of its HIGHEST capability, once;
|
||||
* - PRODUCTION bundles (manifest bundle.stage, from their .meta.json) sit in capability sections that run
|
||||
* CAP 5 → 1, each in the section of its HIGHEST capability, once; every EXPERIMENTAL bundle sits in one
|
||||
* final Experimental section, highest capability first (the agent, 2026-09-27);
|
||||
* - bundles within a section are in name order;
|
||||
* - a bundle with several elements is ONE folder holding all of them; a single-element bundle is its element;
|
||||
* - every studio row has exactly ONE canonical node (one identity per plugin; parts only target it).
|
||||
|
|
@ -36,7 +38,11 @@ try {
|
|||
ctx.resolveRef = (ref, fb) => comp.methods.resolveRef.call(ctx, ref, fb)
|
||||
ctx.compositionTrees = comp.computed.compositionTrees.call(ctx)
|
||||
const secs = comp.computed.treeSections.call(ctx)
|
||||
const caps = secs.map((s) => s.cap)
|
||||
const stageOf = new Map(manifest.bundles.map((b) => [b.bundle, b.stage === 'production' ? 'production' : 'experimental']))
|
||||
const expIdx = secs.findIndex((s) => s.id === 'stage-experimental')
|
||||
if (expIdx !== -1 && expIdx !== secs.length - 1) fail('the Experimental section is not last')
|
||||
const capSecs = secs.filter((s) => s.id !== 'stage-experimental')
|
||||
const caps = capSecs.map((s) => s.cap)
|
||||
if (caps.join() !== [...caps].sort((a, b) => b - a).join()) fail(`sections not CAP 5 → 1: ${caps.join(',')}`)
|
||||
const byBundle = new Map()
|
||||
for (const r of ctx.rows) { if (!byBundle.has(r.bundle)) byBundle.set(r.bundle, []); byBundle.get(r.bundle).push(r) }
|
||||
|
|
@ -44,13 +50,21 @@ try {
|
|||
for (const s of secs) {
|
||||
const tops = s.nodes.filter((n) => n.depth === 0)
|
||||
const names = tops.map((n) => (n.folder ? n.label : ctx.rows.find((r) => r.key === n.target)?.bundle))
|
||||
if (names.join() !== [...names].sort((a, b) => a.localeCompare(b)).join()) fail(`CAP ${s.cap}: bundles not in name order (${names.join(', ')})`)
|
||||
const isExp = s.id === 'stage-experimental'
|
||||
const topCap = (b) => Math.max(...(byBundle.get(b) || []).map((r) => r.cap))
|
||||
const want = isExp ? [...names].sort((a, b) => topCap(b) - topCap(a) || a.localeCompare(b)) : [...names].sort((a, b) => a.localeCompare(b))
|
||||
if (names.join() !== want.join()) fail(`${isExp ? 'Experimental' : 'CAP ' + s.cap}: bundles not in order (${names.join(', ')})`)
|
||||
for (const b of names) {
|
||||
const st = stageOf.get(b)
|
||||
if (isExp && st === 'production') fail(`production bundle ${b} is filed under Experimental`)
|
||||
if (!isExp && st !== 'production') fail(`experimental bundle ${b} is filed under CAP ${s.cap}, not Experimental`)
|
||||
}
|
||||
for (const [i, n] of tops.entries()) {
|
||||
const b = names[i]; const rows = byBundle.get(b) || []
|
||||
if (seen.has(b)) fail(`bundle ${b} appears twice (CAP ${seen.get(b)} and CAP ${s.cap})`)
|
||||
seen.set(b, s.cap)
|
||||
const top = Math.max(...rows.map((r) => r.cap))
|
||||
if (top !== s.cap) fail(`bundle ${b} (highest CAP ${top}) filed under CAP ${s.cap}`)
|
||||
if (!isExp && top !== s.cap) fail(`bundle ${b} (highest CAP ${top}) filed under CAP ${s.cap}`)
|
||||
if (rows.length > 1) {
|
||||
if (!n.folder) fail(`bundle ${b} has ${rows.length} elements but is not a folder`)
|
||||
const kids = s.nodes.filter((k) => k.parent === n.id && k.canonical).map((k) => k.target).sort()
|
||||
|
|
@ -61,7 +75,8 @@ try {
|
|||
for (const b of byBundle.keys()) if (!seen.has(b)) fail(`bundle ${b} is missing from the rail`)
|
||||
const canon = secs.flatMap((s) => s.nodes.filter((n) => n.canonical))
|
||||
for (const r of ctx.rows) { const c = canon.filter((n) => n.target === r.key).length; if (c !== 1) fail(`${r.key} has ${c} canonical nodes (want 1)`) }
|
||||
console.log(`STUDIO-RAIL: ${byBundle.size} bundle(s), ${ctx.rows.length} element(s), ${secs.length} capability section(s); folders: ${secs.flatMap((s) => s.nodes.filter((n) => n.folder).map((n) => n.label + '(' + n.kids + ')')).join(', ')}`)
|
||||
const nProd = [...stageOf.values()].filter((v) => v === 'production').length
|
||||
console.log(`STUDIO-RAIL: ${byBundle.size} bundle(s) (${nProd} production, ${byBundle.size - nProd} experimental), ${ctx.rows.length} element(s), ${secs.length} section(s); folders: ${secs.flatMap((s) => s.nodes.filter((n) => n.folder).map((n) => n.label + '(' + n.kids + ')')).join(', ')}`)
|
||||
} finally { await server.close() }
|
||||
if (bad) { console.log(`STUDIO-RAIL: FAIL — ${bad} problem(s).`); process.exit(1) }
|
||||
console.log('STUDIO-RAIL: PASS — one folder per bundle with its elements inside, bundles grouped by their highest capability (5 → 1) and in name order, one identity per plugin.')
|
||||
console.log('STUDIO-RAIL: PASS — one folder per bundle with its elements inside; production bundles grouped by their highest capability (5 → 1) in name order, experimental bundles in one final Experimental section; one identity per plugin.')
|
||||
|
|
|
|||
|
|
@ -58,7 +58,6 @@ const BUNDLES = [
|
|||
]
|
||||
const ALLOW = {
|
||||
'prayer-walk-planner:ENG-PIN': 'keyless by design: always MapLibre, needs no token (index.js header)',
|
||||
'key-cities:ENG-STYLE': 'gated, Mapbox-only by design (mapbox:// styles, ensureEngineScript(\'mapbox\'))',
|
||||
'all-people-groups:LIST-DSM': 'draws the IMB dataset (all 12,379 groups), not the DOXA list: a list there is Tier B (SPEC-PEOPLE-GROUP-LIST-PROP.md)',
|
||||
}
|
||||
|
||||
|
|
@ -84,7 +83,31 @@ const RULES = [
|
|||
{ id: 'ENG-PIN', prop: 'engine', re: /useMapInstance\s*\(\s*\{[^}]{0,400}?provider\s*:\s*['"](?:mapbox|maplibre)['"]/g },
|
||||
{ id: 'TOK-GLOBAL', prop: 'token', re: /window\.DOXA_TOKEN\b/g, shipped: 'DOXA_TOKEN' },
|
||||
{ id: 'TOK-LITERAL', prop: 'token', re: /['"`]pk\.ey[A-Za-z0-9_-]{20,}/g, shipped: /pk\.eyJ[A-Za-z0-9_-]{20,}/ },
|
||||
{ id: 'LOC-ENUS', prop: 'locale', warn: true, re: /(?:toLocaleString|NumberFormat|DateTimeFormat)\s*\(\s*['"]en(?:-US)?['"]/g },
|
||||
{ id: 'LOC-ENUS', prop: 'locale', warn: true, test(src) {
|
||||
// ★ A CATCH-BLOCK FALLBACK IS NOT A FIXED FORMAT, and the bare regex was WARNING THE CORRECT
|
||||
// PATTERN. regions formats with `${locale}-u-nu-latn` -- a verbatim clone of DX-life's
|
||||
// RegionDetail.vue:16, Latin digits with the reader's grouping -- and falls back to 'en-US' only
|
||||
// inside a catch, because a bad locale tag throws RangeError in toLocaleString and blanking the
|
||||
// page is worse than one wrong separator. Flagging that told the matrix's locale column to say
|
||||
// "ignores the locale" about code that honours it, which is the kind of false warn that teaches
|
||||
// people to stop reading the column.
|
||||
// MEASURED before changing the rule: of the NINE LOC-ENUS sites in the tree, exactly TWO are
|
||||
// such fallbacks (region-dashboards.vue, regions-list.vue). The other seven are genuinely
|
||||
// operative fixed en-US and are still flagged, including RegionCountryMap's popup, which is a
|
||||
// HELD the agent decision with its own card rather than an oversight.
|
||||
const out = []
|
||||
const re = /(?:toLocaleString|NumberFormat|DateTimeFormat)\s*\(\s*['"]en(?:-US)?['"]/g
|
||||
let m
|
||||
while ((m = re.exec(src))) {
|
||||
const before = src.slice(src.lastIndexOf('\n', m.index) + 1, m.index)
|
||||
// both halves required: a catch, AND a locale-DERIVED format call it is the fallback for.
|
||||
// A lone `catch` nearby must not excuse a hardcoded format that never consulted the locale.
|
||||
const isFallback = /\bcatch\b/.test(before)
|
||||
&& /(?:toLocaleString|NumberFormat|DateTimeFormat)\s*\(\s*`[^`]*\$\{/.test(before)
|
||||
if (!isFallback) out.push(m.index)
|
||||
}
|
||||
return out
|
||||
} },
|
||||
// A whole-file rule: the fetch and the helper need not be on the same line, only in the same file.
|
||||
{ id: 'LIST-FETCH', prop: 'list', test(src) {
|
||||
const m = /\/api\/people-groups\/list|endpoints\?\.bulk|doxa-people-groups\.json/.exec(src)
|
||||
|
|
@ -112,10 +135,29 @@ const CLEAN = `map.setStyle(resolveNamedStyle('ink', p).style || 'mapbox://style
|
|||
useMapInstance({ container: el, style: cfg.style ?? 'mapbox://styles/mapbox/light-v11' })
|
||||
// new mapboxgl.Popup() in a comment is not code
|
||||
n.toLocaleString(locale.value)
|
||||
try { return v.toLocaleString(\`\${locale.value || 'en'}-u-nu-latn\`) } catch (_) { return v.toLocaleString('en-US') }
|
||||
const r2 = await applyPeopleGroupList((await fetch(base + '/api/people-groups/list')).posts, cfg)
|
||||
const dsm2 = new DataSourceManager({ locale: 'en', profileConfig })
|
||||
const INHERITED_PAGE_KEYS = ['locale', 'provider', 'list']`
|
||||
const falsePos = RULES.filter((r) => run(r, stripComments(CLEAN)).length).map((r) => r.id)
|
||||
|
||||
// ── LOC-ENUS discrimination, tested on purpose ──────────────────────────────────────────────────
|
||||
// The fallback exemption is the one rule here that can WIDEN by accident: loosen it and a hardcoded
|
||||
// format with a catch anywhere near it stops being seen. So the three adversarial shapes are pinned.
|
||||
const locRule = RULES.find((r) => r.id === 'LOC-ENUS')
|
||||
const LOC_CASES = [
|
||||
[false, "try { return v.toLocaleString(`${locale.value || 'en'}-u-nu-latn`) } catch (_) { return v.toLocaleString('en-US') }"],
|
||||
[true, "try { return v.toLocaleString('en-US') } catch (_) { return '' }"],
|
||||
[true, "try { return fmt(v) } catch (_) { return v.toLocaleString('en-US') }"],
|
||||
[true, "const pop = Number(p.population).toLocaleString('en-US')"],
|
||||
]
|
||||
const locWrong = LOC_CASES.filter(([shouldFlag, line]) => (run(locRule, line).length > 0) !== shouldFlag)
|
||||
if (locWrong.length) {
|
||||
console.error(`UNIVERSAL-PROPS: SELF-TEST FAILED — LOC-ENUS misjudged ${locWrong.length} case(s); `
|
||||
+ 'the catch-fallback exemption must skip ONLY a locale-derived primary: '
|
||||
+ locWrong.map(([f, l]) => `${f ? 'missed' : 'false-flagged'}: ${l.slice(0, 56)}`).join(' | '))
|
||||
process.exit(3)
|
||||
}
|
||||
if (missed.length || falsePos.length) {
|
||||
console.error(`UNIVERSAL-PROPS: SELF-TEST FAILED — ${missed.length ? 'rules blind to a planted bypass: ' + missed.join(', ') : ''}${falsePos.length ? ' false positives on clean code: ' + falsePos.join(', ') : ''}`)
|
||||
process.exit(3)
|
||||
|
|
@ -133,15 +175,59 @@ function files(dir) {
|
|||
}
|
||||
return out
|
||||
}
|
||||
/* ★ A BUNDLE'S SOURCE IS NOT ONLY ITS OWN FOLDER ANY MORE. This gate scanned
|
||||
* plugin-designs/<bundle>/** and nothing else, which was right while every panel lived in its
|
||||
* plugin. The dashboard-kit extraction moves panels into library/components/dashboards/, and a
|
||||
* bundle still COMPILES them — so a rule that fires on the source stopped firing the moment the
|
||||
* file moved, with the code unchanged. MEASURED: kit landing 4c-3 moved DashboardFacetRail.vue,
|
||||
* which holds 3 toLocaleString('en-US') calls, and this matrix went from 13 warns to 10. Nothing
|
||||
* improved; the audit just stopped looking. LOC-ENUS has no `shipped` matcher, so the built-bundle
|
||||
* pass below could not catch them either.
|
||||
* So each bundle is now audited over the library files it actually IMPORTS, resolved from its own
|
||||
* `@map/...` specifiers and followed transitively. Attribution stays per-bundle, which is what
|
||||
* makes the matrix actionable: a library file consumed by four bundles is reported against all
|
||||
* four, because all four ship it. */
|
||||
function libraryImportsFrom(startFiles) {
|
||||
const seen = new Set()
|
||||
const queue = [...startFiles]
|
||||
while (queue.length) {
|
||||
const f = queue.shift()
|
||||
let src = ''
|
||||
try { src = readFileSync(f, 'utf8') } catch (_) { continue }
|
||||
for (const m of stripComments(src).matchAll(/from\s*['"]@map\/([^'"]+)['"]/g)) {
|
||||
const rel = join('library', m[1])
|
||||
const abs = resolve(ROOT, rel)
|
||||
if (seen.has(abs) || !existsSync(abs)) continue
|
||||
// Same extension filter the per-bundle walk uses. Without it the sweep picked up
|
||||
// library/api/sources.json — the endpoint REGISTRY — and LIST-FETCH reported it as a file that
|
||||
// fetches the list, three times over. A .json file declares endpoints; it fetches nothing.
|
||||
if (!/\.(vue|js|mjs)$/.test(abs)) continue
|
||||
let st
|
||||
try { st = statSync(abs) } catch (_) { continue }
|
||||
if (!st.isFile()) continue
|
||||
seen.add(abs)
|
||||
queue.push(abs)
|
||||
}
|
||||
}
|
||||
return [...seen]
|
||||
}
|
||||
const filesWithLibrary = (dir) => { const own = files(dir); return [...own, ...libraryImportsFrom(own)] }
|
||||
|
||||
const findings = []
|
||||
const matrix = {}
|
||||
for (const b of BUNDLES.filter((x) => !ONLY || ONLY.includes(x))) {
|
||||
const dir = resolve(ROOT, 'plugin-designs', b)
|
||||
if (!existsSync(dir)) continue
|
||||
matrix[b] = { engine: 'ok', token: 'ok', locale: 'ok', list: 'ok' }
|
||||
for (const f of files(dir)) {
|
||||
for (const f of filesWithLibrary(dir)) {
|
||||
const src = stripComments(readFileSync(f, 'utf8'))
|
||||
for (const r of RULES) for (const idx of run(r, src)) {
|
||||
// A module is not a bypass of its own contract. library/api/DataSourceManager.js ends with
|
||||
// `const dataSourceManager = new DataSourceManager()` — the singleton it exports — and LIST-DSM
|
||||
// exists to catch a CALLER constructing one without profileConfig. Reported against three
|
||||
// bundles when the sweep first reached it, which is a gate telling four owners that the library
|
||||
// is broken because it read the definition as a use.
|
||||
if (r.id === 'LIST-DSM' && /library\/api\/DataSourceManager\.js$/.test(f.replace(/\\/g, '/'))) continue
|
||||
const allowed = ALLOW[`${b}:${r.id}`]
|
||||
if (allowed) { if (matrix[b][r.prop] === 'ok') matrix[b][r.prop] = 'allowed'; continue }
|
||||
findings.push({ b, rule: r.id, prop: r.prop, warn: !!r.warn, where: `${relative(ROOT, f)}:${lineOf(src, idx)}`, text: src.slice(idx, idx + 70).replace(/\s+/g, ' ').trim() })
|
||||
|
|
|
|||
|
|
@ -301,6 +301,22 @@ function profileReachesAMap(dir, file) {
|
|||
}
|
||||
return false
|
||||
}
|
||||
/**
|
||||
* STAGE and HEAVY, read from <profile>.meta.json and carried into manifest.json (the agent, 2026-09-27:
|
||||
* a public-but-unfinished plugin shows under EXPERIMENTAL in the Plugin Studio and the gallery until it works
|
||||
* as a production map). Both surfaces read the MANIFEST, so they cannot disagree, and neither keeps a list.
|
||||
* "stage": "production" | "experimental" default experimental; a bundle is production if ANY of its
|
||||
* profiles says so (a bundle is one folder in the studio)
|
||||
* "heavy": true the element holds live WebGL contexts, so a host must destroy
|
||||
* it when it leaves the screen (Plugin Studio's HEAVY rows)
|
||||
*/
|
||||
function metaStageHeavy(dir, profileName) {
|
||||
try {
|
||||
const meta = JSON.parse(readFileSync(join(dir, `${profileName}.meta.json`), 'utf8'))
|
||||
return { stage: meta?.stage === 'production' ? 'production' : 'experimental', heavy: meta?.heavy === true }
|
||||
} catch { return { stage: 'experimental', heavy: false } }
|
||||
}
|
||||
|
||||
function metaIsMap(dir, profileName) {
|
||||
try {
|
||||
const meta = JSON.parse(readFileSync(join(dir, `${profileName}.meta.json`), 'utf8'))
|
||||
|
|
@ -1286,8 +1302,11 @@ function scanBundles() {
|
|||
? composesAMapLeaf(dir, profileName, file)
|
||||
: (metaIsMap(dir, profileName) ?? profileReachesAMap(dir, file))
|
||||
|
||||
const { stage: profileStage, heavy: profileHeavy } = metaStageHeavy(dir, profileName)
|
||||
return {
|
||||
profile: profileName,
|
||||
stage: profileStage,
|
||||
...(profileHeavy ? { heavy: true } : {}),
|
||||
file,
|
||||
description: description || fileTag || '',
|
||||
element: tag,
|
||||
|
|
@ -1341,6 +1360,7 @@ function scanBundles() {
|
|||
integrity,
|
||||
elements: bundleElements,
|
||||
...(composesUnique.length ? { composes: composesUnique } : {}),
|
||||
stage: profiles.some((p) => p.stage === 'production') ? 'production' : 'experimental',
|
||||
profiles,
|
||||
})
|
||||
}
|
||||
|
|
@ -1643,6 +1663,15 @@ function main() {
|
|||
staged++
|
||||
}
|
||||
}
|
||||
// people-groups/lists/*.json — the ?list= / profile-config `list` prop fetches the chosen list by name
|
||||
// (frontier-500k, frontier, unreached, unengaged), so the whole folder ships. Missing, every non-default
|
||||
// list 404'd on the built tree and drew 0 pins (go-int / rega at a71007f1).
|
||||
const listsSrc = join(pubAssets, 'people-groups', 'lists')
|
||||
if (existsSync(listsSrc)) {
|
||||
const listsDest = join(treeAssets, 'people-groups', 'lists')
|
||||
mkdirSync(listsDest, { recursive: true })
|
||||
for (const f of readdirSync(listsSrc)) { if (!f.endsWith('.json')) continue; cpSync(join(listsSrc, f), join(listsDest, f)); staged++ }
|
||||
}
|
||||
// previews/ + posters/ — the poster walls fetch these PER CARD, lazily, by id
|
||||
// (`${assetsBase}/previews/<id>.webp`, `${assetsBase}/posters/<id>.webp`), so the
|
||||
// name is dynamic and the whole folder ships. They are the bulk of the tree
|
||||
|
|
|
|||
|
|
@ -1,4 +1,14 @@
|
|||
<script setup>
|
||||
/**
|
||||
* ── KIT LANDING 4c-4: MOVED FROM plugin-designs/research-dashboard/ ───────────────────────────
|
||||
* The breadcrumb completes the facet-cascade group the spec scheduled together — rail (4c-3), chips
|
||||
* (4c-2), breadcrumb. It was left behind when the other two moved, which is the whole reason it is
|
||||
* called out here: a group scheduled as one landing was delivered as two, and the leftover is
|
||||
* invisible unless someone re-reads the spec against the tree.
|
||||
*
|
||||
* Like the chip bar, it is mounted by NOBODY today (it was exported from the plugin barrel and
|
||||
* rendered nowhere), so its gates mean "it mounts and degrades", not "it looks right".
|
||||
*/
|
||||
import { tStatic } from '@map/i18n/index.js'
|
||||
const L = (key, en) => tStatic('dashboard.' + key) || en
|
||||
/**
|
||||
|
|
@ -8,7 +18,7 @@ const L = (key, en) => tStatic('dashboard.' + key) || en
|
|||
*/
|
||||
import { inject, computed } from 'vue'
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { useTreeLegendLabels } from '../../composables/useTreeLegendLabels.js'
|
||||
// No research label import: the shell supplies the resolver on dashboardConfig.legend (landing 4b).
|
||||
|
||||
const bus = inject('selectionBus', null)
|
||||
const cfg = inject('dashboardConfig', {})
|
||||
|
|
@ -18,7 +28,14 @@ const filterSet = bus?.filterSet || {}
|
|||
// filter chips do (dashboard.config.js:54-57 — codes must never reach a user-facing menu).
|
||||
// DISPLAY ONLY: `k` is what popTo() acts on and the stored value is never rewritten, so the bus's
|
||||
// byte-match contract is untouched.
|
||||
const { labelFor } = useTreeLegendLabels(cfg, inject('dataStore', null), inject('searchSourceId', null))
|
||||
// ★ THE SAME RESOLVER, AND THE SAME UNCONFIGURED DEFAULT, AS THE CHIP BAR (4c-2). Identical on
|
||||
// purpose: the breadcrumb and the chips render the same filterSet, so if their defaults differed a
|
||||
// half-configured dashboard would show one value resolved and the other raw, in the same band.
|
||||
// The list join matters for the same reason it did there — a filterSet value is an ARRAY once two
|
||||
// values are selected (spec D1), and `String(['A012','A013'])` prints comma-jammed.
|
||||
// `dataStore` and `searchSourceId` are NOT injected any more: they existed only to construct
|
||||
// useTreeLegendLabels, and an unused inject is a claim about the host.
|
||||
const labelFor = (facet, value) => (cfg?.legend?.labelFor ? cfg.legend.labelFor(facet, value) : (Array.isArray(value) ? value.join(', ') : value))
|
||||
const crumbs = computed(() => Object.entries(filterSet).map(([k, v]) => ({ k, v: String(labelFor(k, v)) })))
|
||||
|
||||
function popTo(k) {
|
||||
|
|
@ -34,6 +34,7 @@ const L = (key, en) => tStatic('dashboard.' + key) || en
|
|||
*/
|
||||
import { inject, ref, reactive, computed, onMounted } from 'vue'
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { formatCount } from '@map/utils/formatCount.js'
|
||||
import { aggregate, lbl, otherLabel } from '@map/composables/useFacetAggregation.js'
|
||||
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '@map/composables/useDashboardSearch.js'
|
||||
// ★ NO RESEARCH COLOUR IMPORTS (kit landing 4b). This component used to import
|
||||
|
|
@ -746,7 +747,7 @@ useShadowStyles(`
|
|||
The four stacked trees below it are People · Place · Language · Religion, in that
|
||||
order — the four axes a researcher navigates to find who has gospel resources. -->
|
||||
<div class="fr-title">{{ L('vertical_legend', 'Vertical Legend') }}</div>
|
||||
<div class="fr-scope" data-scope-count><b>{{ scopeCount.toLocaleString('en-US') }}</b> {{ L('groups_in_scope', 'groups in scope') }}</div>
|
||||
<div class="fr-scope" data-scope-count><b>{{ formatCount(scopeCount) }}</b> {{ L('groups_in_scope', 'groups in scope') }}</div>
|
||||
</div>
|
||||
<div class="fr-body" ref="railEl" @click="onRowClick" @keydown="onRowKey">
|
||||
|
||||
|
|
@ -762,7 +763,7 @@ useShadowStyles(`
|
|||
:tabindex="(r.other || r.zero) ? null : 0"
|
||||
:role="(r.other || r.zero) ? null : 'button'"
|
||||
:aria-pressed="(r.other || r.zero) ? null : (r.active ? 'true' : 'false')"
|
||||
:aria-label="(r.other || r.zero) ? null : ((r.active ? L('remove_filter', 'Remove filter') : L('filter_by', 'Filter by')) + ' ' + r.label + ', ' + r.count.toLocaleString('en-US') + ' ' + L('groups', 'groups') + (r.dashboardOnly ? '. Updates the charts on this dashboard only; it does not filter the list below.' : ''))"
|
||||
:aria-label="(r.other || r.zero) ? null : ((r.active ? L('remove_filter', 'Remove filter') : L('filter_by', 'Filter by')) + ' ' + r.label + ', ' + formatCount(r.count) + ' ' + L('groups', 'groups') + (r.dashboardOnly ? '. Updates the charts on this dashboard only; it does not filter the list below.' : ''))"
|
||||
:title="r.dashboardOnly ? 'Updates this dashboard only — the list below does not filter on ' + r.label : null">
|
||||
<!-- tree trunks: one span per ancestor level, same glyph vocabulary as the
|
||||
research-map's SemanticTreeLegend so the hierarchy is DRAWN, not just padded. -->
|
||||
|
|
@ -781,7 +782,7 @@ useShadowStyles(`
|
|||
<span v-if="r.swatch" class="fr-sw" :style="{ background: r.swatch }" aria-hidden="true"></span>
|
||||
<span class="fr-lbl">{{ r.label }}</span>
|
||||
<span class="fr-bar"><i :style="{ width: Math.max(4, r.frac * 100) + '%' }"></i></span>
|
||||
<span class="fr-cnt">{{ r.count.toLocaleString('en-US') }}</span>
|
||||
<span class="fr-cnt">{{ formatCount(r.count) }}</span>
|
||||
<!-- A VISIBLE mark, not only a title/aria one. A tooltip answers a question the user
|
||||
does not know to ask: the whole defect is that this row LOOKS identical to a row
|
||||
that filters the list. The glyph is what prompts the hover. -->
|
||||
|
|
|
|||
|
|
@ -65,13 +65,27 @@ useShadowStyles(`
|
|||
.mcb.dark:hover:not(:disabled){background:#4e594f;box-shadow:0 2px 8px rgba(0,0,0,0.5);}
|
||||
.mcb.dark.active{background:#4e594f;color:#92b195;}
|
||||
@media(max-width:767px){.mcb{width:36px;height:36px;}}
|
||||
/* shape="square" on a STANDALONE button: their 4px corners, our fill and shadow kept.
|
||||
A button inside .map-toolbar--square is overridden back to 0 by the toolbar's rules. */
|
||||
.mcb--square{ border-radius:4px; }
|
||||
`, 'map-control-button')
|
||||
|
||||
defineProps({
|
||||
isDark: { type: Boolean, default: false },
|
||||
title: { type: String, default: '' },
|
||||
active: { type: Boolean, default: false },
|
||||
disabled: { type: Boolean, default: false }
|
||||
disabled: { type: Boolean, default: false },
|
||||
/**
|
||||
* 'round' (default) is the 50% circle every map ships. 'square' is for a button used OUTSIDE a
|
||||
* MapToolbar -- inside one, set controls="square" on the TOOLBAR instead and it styles its whole
|
||||
* column, because the engine's square form is a grouped panel and a single button cannot be one.
|
||||
* ★ A STANDALONE SQUARE KEEPS ITS OWN FILL AND SHADOW and takes only the 4px corners, which is
|
||||
* what the engine gives a lone control: `button:focus:only-child { border-radius: inherit }` from
|
||||
* a group whose radius is 4px. Inside a toolbar the panel owns the fill, so the toolbar's rules
|
||||
* strip it back off -- the two rule sets compose rather than compete, and the toolbar wins by
|
||||
* being the more specific selector.
|
||||
*/
|
||||
shape: { type: String, default: 'round' }
|
||||
})
|
||||
|
||||
defineEmits(['click'])
|
||||
|
|
@ -96,7 +110,7 @@ defineEmits(['click'])
|
|||
-->
|
||||
<button
|
||||
class="mcb"
|
||||
:class="{ dark: isDark, active }"
|
||||
:class="{ dark: isDark, active, 'mcb--square': shape === 'square' }"
|
||||
:title="title"
|
||||
:aria-label="title || undefined"
|
||||
:disabled="disabled"
|
||||
|
|
|
|||
|
|
@ -21,17 +21,40 @@
|
|||
profiles that DO mount a geocoder.
|
||||
-->
|
||||
<script setup>
|
||||
import { ref, provide } from 'vue'
|
||||
import { computed, ref, provide } from 'vue'
|
||||
import { useShadowStyles } from '../../composables/useShadowStyles.js'
|
||||
|
||||
defineProps({
|
||||
const props = defineProps({
|
||||
hasGeocoder: { type: Boolean, default: true },
|
||||
/**
|
||||
* 'round' (default) keeps the separate floating circles every map ships today.
|
||||
* 'square' is the ENGINE'S OWN grouped card -- one white panel, 4px corners, a 2px ring and 1px
|
||||
* dividers -- which is the look the agent asked for by name. Measured from
|
||||
* node_modules/maplibre-gl/dist/maplibre-gl.css, not invented:
|
||||
* .maplibregl-ctrl-group { background:#fff; border-radius:4px }
|
||||
* .maplibregl-ctrl-group:not(:empty) { box-shadow:0 0 0 2px rgba(0,0,0,.1) }
|
||||
* .maplibregl-ctrl-group button { width:29px; height:29px; background:transparent; border:0 }
|
||||
* .maplibregl-ctrl-group button+button { border-top:1px solid #ddd }
|
||||
* ★ SQUARE IS NOT A RADIUS SWAP, which is why it lives here and not only on the button: round
|
||||
* controls are separate boxes with a gap and a shadow each, and the engine's square form is ONE
|
||||
* container that owns the background, the corners and the ring while its buttons own nothing. Set
|
||||
* border-radius:0 on the buttons alone and you get squares floating 8px apart -- neither shape.
|
||||
* ★ THE 29px IS DELIBERATELY NOT PORTED. Ours stay --map-btn-size (capped to 32px in this
|
||||
* toolbar). 29px would shrink the touch target below what this project has already ruled on twice,
|
||||
* so the variant takes the SHAPE and leaves the SIZE. It is therefore not pixel-identical to the
|
||||
* engine's controls, and that is a choice rather than an oversight.
|
||||
*/
|
||||
controls: { type: String, default: 'round' },
|
||||
})
|
||||
|
||||
// The toolbar's element is provided to its controls: MapControlMenu measures it to place
|
||||
// every menu at the toolbar's top, on its inner side, no taller than the control column.
|
||||
const toolbarEl = ref(null)
|
||||
provide('mapToolbar', { el: toolbarEl })
|
||||
// The shape rides the EXISTING inject so every control reads ONE source of truth. The visual work is
|
||||
// done by CSS descendant rules below -- nothing has to pass a matching prop to each button -- but
|
||||
// MapControlMenu measures this column, and a square toolbar is SHORTER (gap:0), so a menu using
|
||||
// matchToolbar gets a shorter box. Anything that needs to know can read it here instead of guessing.
|
||||
provide('mapToolbar', { el: toolbarEl, shape: computed(() => (props.controls === 'square' ? 'square' : 'round')) })
|
||||
|
||||
useShadowStyles(`
|
||||
.map-toolbar {
|
||||
|
|
@ -54,6 +77,50 @@ useShadowStyles(`
|
|||
.map-toolbar .mcb,
|
||||
.map-toolbar .hbg-btn { width: 32px; height: 32px; }
|
||||
.map-toolbar .hbg-ctrl { margin: 10px 0 0 0; } /* drop the 6px left offset so it lines up with the rest */
|
||||
|
||||
/* ── controls="square": the ENGINE'S grouped card, ported ───────────────────────────────── */
|
||||
.map-toolbar--square {
|
||||
gap: 0; /* the group is one panel, not a spaced column */
|
||||
background: #fff;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1); /* .maplibregl-ctrl-group:not(:empty) */
|
||||
}
|
||||
/* The buttons own nothing: no corners, no shadow, no fill. The panel owns all three. */
|
||||
.map-toolbar--square .mcb,
|
||||
.map-toolbar--square .hbg-btn {
|
||||
border-radius: 0;
|
||||
box-shadow: none;
|
||||
background: transparent;
|
||||
}
|
||||
/* button+button -> a 1px divider. Written on the toolbar's CHILDREN rather than on .mcb pairs
|
||||
because some controls wrap their button in an element of their own (.hbg-ctrl), and a divider
|
||||
that only knew about .mcb would vanish exactly where two different control types meet. */
|
||||
.map-toolbar--square > * + * { border-top: 1px solid #ddd; }
|
||||
/* .hbg-ctrl's 10px top margin would tear the panel apart; inside the group it has no business. */
|
||||
.map-toolbar--square .hbg-ctrl { margin: 0; }
|
||||
/* ★ OUTER CORNERS ONLY, AND NO overflow:hidden. Clipping would have been the quick way to round
|
||||
the panel, but it also clips a focus ring on any inner button -- and the engine does not do it:
|
||||
it rounds the first and last buttons instead (button:focus:first-child -> 4px 4px 0 0, :last-child
|
||||
-> 0 0 4px 4px, :only-child -> inherit). Ported as their mechanism. MapControlMenu teleports out of
|
||||
this element into the map area, so clipping would not have hidden a menu -- the focus ring is the
|
||||
real cost, and it is the invisible kind. */
|
||||
.map-toolbar--square > :first-child,
|
||||
.map-toolbar--square > :first-child .mcb,
|
||||
.map-toolbar--square > :first-child .hbg-btn { border-radius: 4px 4px 0 0; }
|
||||
.map-toolbar--square > :last-child,
|
||||
.map-toolbar--square > :last-child .mcb,
|
||||
.map-toolbar--square > :last-child .hbg-btn { border-radius: 0 0 4px 4px; }
|
||||
.map-toolbar--square > :only-child,
|
||||
.map-toolbar--square > :only-child .mcb,
|
||||
.map-toolbar--square > :only-child .hbg-btn { border-radius: 4px; }
|
||||
/* ★ FORCED COLOURS, which our round buttons have never had. The engine ships this pair because a
|
||||
rgba() ring and a #ddd divider both disappear when the user's own palette replaces them, leaving
|
||||
one undifferentiated block where the controls were. */
|
||||
@media (forced-colors: active) {
|
||||
.map-toolbar--square { box-shadow: 0 0 0 2px ButtonText; }
|
||||
.map-toolbar--square > * + * { border-top: 1px solid ButtonText; }
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
/* Mobile (with geocoder): drop the toolbar well below the search bar so
|
||||
it doesn't sit flush against the search pill. Search = top:10,
|
||||
|
|
@ -62,12 +129,23 @@ useShadowStyles(`
|
|||
/* Mobile (no geocoder): collapse the reserved gap — controls sit flush
|
||||
to the top of the map area with the same 6px inset used on desktop. */
|
||||
.map-toolbar.map-toolbar--no-geocoder { top: 6px; gap: 6px; }
|
||||
/* ★ THE SQUARE PANEL MUST NOT GET ITS GAPS BACK HERE, and it would have. A media query adds NO
|
||||
specificity, so the .map-toolbar gap:6px rule above is (0,1,0) exactly like the
|
||||
.map-toolbar--square gap:0 rule -- and it comes LATER in the sheet, so it won. On any phone a
|
||||
square toolbar would have fallen back into six separate buttons inside one ringed panel: the
|
||||
shape breaking precisely where the agent is most likely to look at it.
|
||||
The --no-geocoder pair is (0,2,0) and outranked the variant regardless of order, so it needs the
|
||||
two-class form to answer it. Same lesson as the goal cards' gap-vs-margin: a ported mechanism is
|
||||
only ported if it still WINS. */
|
||||
.map-toolbar--square,
|
||||
.map-toolbar--square.map-toolbar--no-geocoder { gap: 0; }
|
||||
}
|
||||
`, 'map-toolbar')
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div ref="toolbarEl" class="map-toolbar" :class="{ 'map-toolbar--no-geocoder': !hasGeocoder }">
|
||||
<div ref="toolbarEl" class="map-toolbar"
|
||||
:class="{ 'map-toolbar--no-geocoder': !hasGeocoder, 'map-toolbar--square': controls === 'square' }">
|
||||
<slot />
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -11,6 +11,10 @@
|
|||
*
|
||||
* Shadow-DOM safe: pure data, no DOM/style. Reuses read-only @map config without editing it.
|
||||
*/
|
||||
// KIT LANDING 4d-2: moved from plugin-designs/research-dashboard/src/composables/. It needed no
|
||||
// adapter — every import was already @map/ — and it injects profileConfig in a try/catch because it
|
||||
// can be called outside setup, which is the one property the move had to preserve.
|
||||
|
||||
import { ref, shallowRef, inject } from 'vue'
|
||||
import { getApiBaseUrl } from '@map/api/apiBaseUrl.js'
|
||||
import sourcesConfig from '@map/api/sources.json'
|
||||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "متعدد العروض",
|
||||
"cap2": "إعداد مسبق",
|
||||
"cap1": "مفرد",
|
||||
"stageExperimental": "تجريبي",
|
||||
"toggleList": "إظهار القائمة أو إخفاؤها",
|
||||
"openViews": "فتح قائمة العروض",
|
||||
"expandList": "توسيع القائمة",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "Mehrfachansicht",
|
||||
"cap2": "Voreinstellung",
|
||||
"cap1": "Einzeln",
|
||||
"stageExperimental": "Experimentell",
|
||||
"toggleList": "Liste ein-/ausblenden",
|
||||
"openViews": "Ansichtsliste öffnen",
|
||||
"expandList": "Liste ausklappen",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "Multi-view",
|
||||
"cap2": "Preset",
|
||||
"cap1": "Single",
|
||||
"stageExperimental": "Experimental",
|
||||
"toggleList": "Toggle list",
|
||||
"openViews": "Open the list of views",
|
||||
"expandList": "Expand list",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "Multivista",
|
||||
"cap2": "Preajuste",
|
||||
"cap1": "Individual",
|
||||
"stageExperimental": "Experimental",
|
||||
"toggleList": "Mostrar u ocultar la lista",
|
||||
"openViews": "Abrir la lista de vistas",
|
||||
"expandList": "Expandir la lista",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "Multivue",
|
||||
"cap2": "Préréglage",
|
||||
"cap1": "Simple",
|
||||
"stageExperimental": "Expérimental",
|
||||
"toggleList": "Afficher ou masquer la liste",
|
||||
"openViews": "Ouvrir la liste des vues",
|
||||
"expandList": "Déplier la liste",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "बहु-दृश्य",
|
||||
"cap2": "प्रीसेट",
|
||||
"cap1": "एकल",
|
||||
"stageExperimental": "प्रायोगिक",
|
||||
"toggleList": "सूची दिखाएँ या छिपाएँ",
|
||||
"openViews": "दृश्यों की सूची खोलें",
|
||||
"expandList": "सूची फैलाएँ",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "Multivista",
|
||||
"cap2": "Preimpostato",
|
||||
"cap1": "Singolo",
|
||||
"stageExperimental": "Sperimentale",
|
||||
"toggleList": "Mostra o nascondi l’elenco",
|
||||
"openViews": "Apri l’elenco delle viste",
|
||||
"expandList": "Espandi l’elenco",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "Multivisualização",
|
||||
"cap2": "Predefinição",
|
||||
"cap1": "Único",
|
||||
"stageExperimental": "Experimental",
|
||||
"toggleList": "Mostrar ou ocultar a lista",
|
||||
"openViews": "Abrir a lista de visualizações",
|
||||
"expandList": "Expandir a lista",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "Vizualizări multiple",
|
||||
"cap2": "Presetat",
|
||||
"cap1": "Simplu",
|
||||
"stageExperimental": "Experimental",
|
||||
"toggleList": "Afișează sau ascunde lista",
|
||||
"openViews": "Deschide lista de vizualizări",
|
||||
"expandList": "Extinde lista",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "Несколько видов",
|
||||
"cap2": "Предустановка",
|
||||
"cap1": "Одиночный",
|
||||
"stageExperimental": "Экспериментальные",
|
||||
"toggleList": "Показать или скрыть список",
|
||||
"openViews": "Открыть список представлений",
|
||||
"expandList": "Развернуть список",
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"cap3": "多视图",
|
||||
"cap2": "预设",
|
||||
"cap1": "单一",
|
||||
"stageExperimental": "实验性",
|
||||
"toggleList": "显示或隐藏列表",
|
||||
"openViews": "打开视图列表",
|
||||
"expandList": "展开列表",
|
||||
|
|
|
|||
31
library/utils/formatCount.js
Normal file
31
library/utils/formatCount.js
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* formatCount — the ONE place the fleet decides how a COUNT is punctuated.
|
||||
*
|
||||
* ★ IT HOLDS en-US ON PURPOSE. Whether numerals follow the reader's locale is a DRIVER decision and
|
||||
* it is currently held, so this file changes nothing about what anyone sees: every caller renders
|
||||
* exactly the digits and separators it rendered before. What it changes is the number of places that
|
||||
* decision is written down — from thirteen call sites across four bundles to one.
|
||||
*
|
||||
* That is the whole value while the policy is held: if the answer becomes "follow the locale", this
|
||||
* is a one-line edit here (read the same hostLang -> getRuntimeLocale() -> detectLocale() chain the
|
||||
* text reads) instead of thirteen edits by four owners, each free to pick a different locale source.
|
||||
* The first divergence in that world would be invisible: two panels in one dashboard, same number,
|
||||
* different separators.
|
||||
*
|
||||
* ★ IT FORMATS. IT DOES NOT DECIDE WHAT EMPTY MEANS, and that distinction is not fastidiousness —
|
||||
* it is the bug this fold would otherwise have shipped. The three `fmt` helpers it replaced looked
|
||||
* interchangeable and were not:
|
||||
* DashboardDataTable null/undefined -> '' and '' falls through to Number('') === 0, so "0"
|
||||
* DashboardDetailDrawer null/undefined/'' -> '—'
|
||||
* useDashboardShell null/undefined -> '—' and '' likewise becomes "0"
|
||||
* Three different answers to "what does a missing count look like", in one dashboard. Folding them
|
||||
* onto one empty policy would have silently changed two of the three — a table cell going from blank
|
||||
* to an em dash, or an em dash appearing where a zero used to. So each caller keeps its own guard and
|
||||
* hands this function a value it has already decided is real.
|
||||
*/
|
||||
export const COUNT_LOCALE = 'en-US'
|
||||
|
||||
/** @param {number|string} n a value the caller has already established is present */
|
||||
export const formatCount = (n) => Number(n).toLocaleString(COUNT_LOCALE)
|
||||
|
||||
export default formatCount
|
||||
|
|
@ -216,6 +216,7 @@
|
|||
"check:snapshot-guard": "node internal/check-snapshot-guard.mjs",
|
||||
"check:snapshot-guard:poison": "node internal/check-snapshot-guard.mjs --poison",
|
||||
"check:spa-tab-order": "node internal/check-spa-tab-order.mjs",
|
||||
"check:square-map-controls": "node internal/check-square-map-controls.mjs",
|
||||
"check:sri": "node internal/sri-consistency-check.mjs",
|
||||
"check:stale-sweep-claim": "node internal/check-no-stale-sweep-claim.mjs",
|
||||
"check:studio-all": "node internal/check-studio-every-plugin.mjs",
|
||||
|
|
@ -243,7 +244,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 check:religion-label-not-value check:i18n-stopped-scope check:no-silent-engine check:regions-uses-library check:shadow-css-parses",
|
||||
"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 check:i18n-stopped-scope check:no-silent-engine check:regions-uses-library check:shadow-css-parses check:square-map-controls",
|
||||
"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 check:setup-order check:package-json-unique-keys check:no-credentials-omit check:no-credentials-omit:self-test check:shadow-reduced-motion",
|
||||
"gen:iso3-to-alpha2": "node library/scripts/generate-iso3-to-alpha2.mjs",
|
||||
"internet:adm1": "node plugin-designs/cities-internet/scripts/build-adm1-internet.mjs",
|
||||
|
|
@ -427,6 +428,7 @@
|
|||
"check:link-coverage": "rule 4 of the brief — 'verify a URL resolves before shipping it' — as a gate instead of a habit. verify-gospel-links.mjs does the verifying; nothing asserted the record COVERS what is shipped, so the honest state of the corpus was a number someone had to go and measure. DISCOVERS the URLs by recursing the pin index for any http string rather than naming fields: every field list in this bundle has gone stale (ga and se shipped unscreened, the SUN block and the access table were each added after the fact), and the recursion found 16 links my own hand-rolled measurement had missed. Resolves each against THREE records — the verification table, translator-org-links.json (contacts, fetched by their own script) and sun-deaf-index.json (proved by content against a catch-all control, which is stronger than a status code) — and fails on any unrecorded link, any shipped link recorded BROKEN, and any 'unknown' on a target a status code CAN prove. The status-blind list holds one URL SHAPE, not a host: jesusfilm.org/watch/jesus/<slug> discriminates and 2,049 links depend on that, while /watch/?languageId= does not. Static, sub-second. Self-test: `bun run check:link-coverage:poison`.",
|
||||
"check:snapshot-guard": "every gospel-resources catalogue fetcher must write through scripts/_snapshot-guard.mjs, which refuses a write that loses more than a tenth of the previous snapshot. Written after a rate-limited FCBH run silently replaced 1,666 video scopes with 1,103. Static, sub-second. Self-test: `bun run check:snapshot-guard:poison` injects a raw write and the check must fail on it.",
|
||||
"check:spa-tab-order": "the cap-5 SPA must open on Big Picture and keep the agent's order (Big Picture, UPG-100, Prayer Progress, Gospel Resources) — asserted as PRESENCE + tab-1 + RELATIVE order on the RENDERED rail, because the rail gained three sections and now renders 12 rows with others between them. ⚠ NOT WAVE-WIRED: it FAILS rather than skips when the SPA is unreachable, deliberately (\"a gate that cannot reach its subject has not passed, it has not run\") — correct standalone, but gates:post runs on checkouts with no server. Needs `bun run serve` on 4173.",
|
||||
"check:square-map-controls": "MapToolbar controls=\"square\" must be the ENGINE'S grouped card, not a square of ours. Reads node_modules/maplibre-gl/dist/maplibre-gl.css and compares our ported values against THAT FILE -- 4px corners, 0 0 0 2px rgba(0,0,0,.1) ring, 1px solid #ddd dividers -- because the look the agent asked for is the engine default (DX-life adds NavigationControl and overrides nothing), so the target is published rather than a matter of taste. Asserts the three deliberate deviations: the engine's 29px is NOT adopted (touch target over pixel parity), there is NO overflow:hidden (it clips a focus ring; outer corners come from first/last child rounding, the engine's own mechanism), and a forced-colors block ships. Also asserts the BLAST RADIUS: round is the default and none of the nine MapToolbar consumers passes controls=, so no map changes -- opting one in turns it red. CSS assertions read the text passed to useShadowStyles, not the file, because the prop's doc comment quotes the engine's 29px and a checker that cannot tell a comment from a declaration finds the documentation it stands on.",
|
||||
"check:stale-sweep-claim": "a caveat that has stopped being true is a wrong number. The gospel surfaces carry a paragraph saying which pools were searched; while the GRN sweep ran they truthfully said part of it was unread, the sweep finished, and the sentence stayed for four more commits. The DATA decides here: undecided gap codes mean the claim is allowed, all-decided means it must go, so it re-arms itself for the next slow pool. Does NOT flag a claim rendered under a v-if on the pending count — that form expires on its own. Self-test: `--poison`. Static, sub-second.",
|
||||
"check:surfaces-read-the-tier": "a surface may READ the tier the pin index computed, never re-derive 'this group has nothing' from the raw resource fields. That hand-rolled field list went stale every time a source was added: 7 codes drawn as having nothing while the map showed them a link, then 28 when Scripture Earth landed. Static, sub-second. Self-test: `bun run check:surfaces-read-the-tier:poison` re-injects the old formula into every surface and each must be caught.",
|
||||
"check:tabs-localized": "a chosen locale must CHANGE the rendered tab text. check:i18n-parity compares catalogs to each OTHER, so it cannot tell a shipped translation from a dead one; tabs.json is reached only via a DYNAMIC key (SemanticTreeLegend.vue:40), invisible to any grep. Renders it and reads the result.",
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"stage": "production",
|
||||
"type": "single",
|
||||
"label": "Cities with Internet — connectivity map",
|
||||
"config": {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"stage": "production",
|
||||
"_comment": "Capability-4 composite that BAKES the research-dashboard + people-groups-grid into ONE self-contained element (both components imported directly + compiled into a single bundle, NO runtime bundle injection — unlike stack-demo which composes via src). Rendered stacked via the shared StackLayout so you scroll through both. This is the 'two elements baked into one' element the agent asked for.",
|
||||
"type": "nested-elements-mfe",
|
||||
"composes": ["research-dashboard", "people-groups-grid"],
|
||||
|
|
|
|||
|
|
@ -449,7 +449,9 @@ const HEAVY_ELEMENTS = new Set([
|
|||
'my-upg-100-list-map', 'doxa-map', 'doxa-maps-spa',
|
||||
// composites that NEST a map, so they own a context too (measured, see above)
|
||||
'dashboard-plus-grid', 'research-dashboard-map', 'demo-map', 'all-people-groups',
|
||||
'country-posters-map', 'key-cities-map', 'research-map-plus-grid'
|
||||
'country-posters-map', 'key-cities-map', 'research-map-plus-grid',
|
||||
// up to TWO contexts: its map, plus the language-tree whiteboard once that is opened
|
||||
'gospel-internet-board'
|
||||
])
|
||||
|
||||
// SCROLL-STACK ELEMENTS — the rows this shell mounts WITHOUT the fixed-viewport inline style
|
||||
|
|
@ -591,7 +593,7 @@ function experimentalTabsFromManifest(manifest) {
|
|||
const out = []
|
||||
for (const b of bundles) {
|
||||
const id = b && b.bundle
|
||||
if (!id || placed.has(id) || NOT_EXPERIMENTAL.has(id)) continue
|
||||
if (!id || placed.has(id) || NOT_EXPERIMENTAL.has(id) || b.stage === 'production') continue // stage: the bundle's .meta.json, same field the Plugin Studio reads
|
||||
// Pick the bundle's entry profile: prefer a real MAP profile, else the profile named like the
|
||||
// bundle, else simply the first one. A bundle contributes exactly ONE rail row (see dedupeRows),
|
||||
// so this chooses which of its profiles that row opens on.
|
||||
|
|
|
|||
4
plugin-designs/doxa-simple-map/doxa-simple-map.meta.json
Normal file
4
plugin-designs/doxa-simple-map/doxa-simple-map.meta.json
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"stage": "production",
|
||||
"_comment": "Prayer Progress is a production map: the Plugin Studio and the gallery list it outside Experimental (stage is read into manifest.json by generate-tree)."
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"stage": "production",
|
||||
"_comment": "Capability-4 composite that BAKES this bundle's own map and tables into ONE element, stacked to scroll. Both children are imported directly and compiled into the single gospel-resources bundle — no runtime injection, no second script, and no cross-bundle version skew: the tables you scroll to are built from the same pin index the map above them draws. This is the 'gospel resources dashboard' the agent asked for.",
|
||||
"type": "nested-elements-mfe",
|
||||
"composes": ["resources-map", "data-tables"],
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"stage": "production",
|
||||
"type": "nested-elements-mfe",
|
||||
"label": "UPG-100 — Map + Prayer Lists",
|
||||
"composes": ["my-upg-100-list/upg-100-list", "my-upg-100-list/poster-wall"],
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ import { highlightRanges } from '@map/composables/useTextHighlight.js'
|
|||
import SearchBar from '@map/components/search/SearchBar.vue'
|
||||
import FilterDropdown from '@map/components/search/FilterDropdown.vue'
|
||||
import { resolveAssetsBase } from '@map/utils/embedBase.js'
|
||||
import { formatCount } from '@map/utils/formatCount.js'
|
||||
import { applyPeopleGroupList } from '@map/lists/peopleGroupList.js'
|
||||
import { tStatic, localeFromUrl, RTL_LOCALES, getRuntimeLocale, detectLocale } from '@map/i18n/index.js'
|
||||
import { countrySlug } from './src/countries.js'
|
||||
|
|
@ -998,8 +999,8 @@ onMounted(() => {
|
|||
<div class="font-size-sm">
|
||||
<template v-if="!loading">
|
||||
{{ isNarrowed && !useTotal
|
||||
? (t.showing || 'Showing') + ' ' + total.toLocaleString('en-US')
|
||||
: (t.total || 'Total') + ': ' + total.toLocaleString('en-US') }}
|
||||
? (t.showing || 'Showing') + ' ' + formatCount(total)
|
||||
: (t.total || 'Total') + ': ' + formatCount(total) }}
|
||||
</template>
|
||||
<span v-else> </span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -386,7 +386,10 @@ const HEAVY_ELEMENTS = new Set([
|
|||
'my-upg-100-list-map', 'doxa-map', 'doxa-maps-spa',
|
||||
// composites that NEST a map, so they own a context too (measured, see above)
|
||||
'dashboard-plus-grid', 'research-dashboard-map', 'demo-map', 'all-people-groups',
|
||||
'country-posters-map', 'key-cities-map', 'research-map-plus-grid'
|
||||
'country-posters-map', 'key-cities-map', 'research-map-plus-grid',
|
||||
// gospel-internet-board owns up to TWO contexts (its map and the language-tree whiteboard; go-int).
|
||||
// A profile can also declare "heavy": true in its .meta.json, which the manifest carries (below).
|
||||
'gospel-internet-board'
|
||||
])
|
||||
|
||||
// SUPERSEDED BUNDLES — built, still embeddable, but NOT shown in the studio. big-picture is a dark
|
||||
|
|
@ -574,9 +577,17 @@ export default defineComponent({
|
|||
const treeOf = new Map(this.compositionTrees.map(t => [t.nodes[0].selects, t]))
|
||||
const byBundle = new Map()
|
||||
for (const r of this.rows) { if (!byBundle.has(r.bundle)) byBundle.set(r.bundle, []); byBundle.get(r.bundle).push(r) }
|
||||
const bundles = [...byBundle.entries()].map(([bundle, rows]) => ({ bundle, rows, cap: Math.max(...rows.map(r => r.cap)) }))
|
||||
return [5, 4, 3, 2, 1].map(cap => {
|
||||
const group = bundles.filter(b => b.cap === cap).sort((x, y) => x.bundle.localeCompare(y.bundle))
|
||||
// ★ PRODUCTION vs EXPERIMENTAL (the agent, 2026-09-27): a public plugin that does not yet work as a
|
||||
// production map is listed under Experimental until it does. The stage is the bundle's own
|
||||
// .meta.json "stage", carried by the manifest, so this file keeps no list and the gallery reads the
|
||||
// same field. Production bundles keep their capability sections; every experimental bundle goes in
|
||||
// one Experimental section at the end, highest capability first.
|
||||
const bundles = [...byBundle.entries()].map(([bundle, rows]) => ({ bundle, rows, cap: Math.max(...rows.map(r => r.cap)), stage: rows[0].stage }))
|
||||
const experimental = bundles.filter(b => b.stage !== 'production').sort((x, y) => y.cap - x.cap || x.bundle.localeCompare(y.bundle))
|
||||
const production = bundles.filter(b => b.stage === 'production')
|
||||
const groups = [5, 4, 3, 2, 1].map(cap => ({ cap, group: production.filter(b => b.cap === cap).sort((x, y) => x.bundle.localeCompare(y.bundle)) }))
|
||||
groups.push({ cap: 'experimental', group: experimental })
|
||||
return groups.map(({ cap, group }) => {
|
||||
if (!group.length) return null
|
||||
const nodes = []
|
||||
const pushElement = (r, depth, parent) => {
|
||||
|
|
@ -610,6 +621,7 @@ export default defineComponent({
|
|||
})
|
||||
for (const r of rows) pushElement(r, 1, fid)
|
||||
}
|
||||
if (cap === 'experimental') return { id: 'stage-experimental', cap: 0, label: this.tr('stageExperimental'), title: this.tr('stageExperimental'), icon: 'layers', nodes }
|
||||
return { id: 'cap-' + cap, cap, label: this.tr('cap' + cap), title: this.tr('cap' + cap) + ' · ' + (MACHINE_TYPE[cap] || ''), icon: CAP_ICON[cap] || 'embed', nodes }
|
||||
}).filter(Boolean)
|
||||
},
|
||||
|
|
@ -935,10 +947,12 @@ export default defineComponent({
|
|||
const cap = capFor(p.type || 'single')
|
||||
// A heavy row owns a live WebGL context, so it is torn down on deactivate rather than
|
||||
// hidden. Keyed by tag OR bundle so a bundle whose profiles differ still resolves.
|
||||
const heavy = HEAVY_ELEMENTS.has(tag) || HEAVY_ELEMENTS.has(b.bundle)
|
||||
const heavy = HEAVY_ELEMENTS.has(tag) || HEAVY_ELEMENTS.has(b.bundle) || p.heavy === true
|
||||
out.push({
|
||||
key: b.bundle + '/' + p.profile,
|
||||
bundle: b.bundle,
|
||||
// production | experimental, from the bundle's .meta.json via the manifest (never a list here)
|
||||
stage: b.stage === 'production' ? 'production' : 'experimental',
|
||||
label: DISPLAY_NAME[b.bundle + '/' + p.profile] || p.profile,
|
||||
// The REAL profile id, handed to the element in profile-config. Never the label: a display
|
||||
// name would mount <doxa-maps-spa> with profile "Research Gallery", which it does not have.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"stage": "production",
|
||||
"type": "nested-elements-mfe",
|
||||
"label": "Regions — List + Dashboards",
|
||||
"composes": [
|
||||
|
|
|
|||
|
|
@ -33,10 +33,13 @@ const T = (key, en) => tStatic(key) || en
|
|||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { useDashboardShell, fmt } from './src/composables/useDashboardShell.js'
|
||||
import { useDashboardLayout } from '@map/composables/useDashboardLayout.js'
|
||||
// The facet rail is a KIT component now (landing 4c-3) and is imported from the library directly.
|
||||
// The plugin barrel re-exported it for one cycle so the move and the import change were separate
|
||||
// landings; that shim is gone, so this is the only line that names its location.
|
||||
import DashboardFacetRail from '@map/components/dashboards/DashboardFacetRail.vue'
|
||||
import {
|
||||
DashboardTopBar,
|
||||
DashboardResearchFilters,
|
||||
DashboardFacetRail,
|
||||
DashboardMapPanel,
|
||||
DashboardDataTable,
|
||||
DashboardChartsRail,
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
* or dropping the projection from the visible text, fails 2; translating a RELIGION_FAMILIES value
|
||||
* fails 2 naming the link it would break.
|
||||
*/
|
||||
import { readFileSync, existsSync } from 'node:fs'
|
||||
import { readFileSync, existsSync, readdirSync } from 'node:fs'
|
||||
import { resolve, dirname, join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
|
|
@ -40,6 +40,23 @@ const TAG = 'LEGEND-MIRRORS'
|
|||
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..')
|
||||
const fails = []
|
||||
const notes = []
|
||||
/* Every .vue/.js under the two source roots — the importer sweep needs a file list, and building it
|
||||
* here keeps arm 5 from trusting a hardcoded list of "the files that could import this". */
|
||||
function sources(dir = null, acc = []) {
|
||||
const base = dir || ROOT
|
||||
let entries = []
|
||||
try { entries = readdirSync(base, { withFileTypes: true }) } catch (_) { return acc }
|
||||
for (const e of entries) {
|
||||
const full = join(base, e.name)
|
||||
const rel = full.slice(ROOT.length + 1)
|
||||
if (/(^|\/)(node_modules|dist|public|\.git)(\/|$)/.test(rel)) continue
|
||||
if (dir === null && !/^(plugin-designs|library)$/.test(e.name)) continue
|
||||
if (e.isDirectory()) sources(full, acc)
|
||||
else if (/\.(vue|js|mjs)$/.test(e.name)) acc.push(rel)
|
||||
}
|
||||
return acc
|
||||
}
|
||||
|
||||
const read = (rel) => { const p = join(ROOT, rel); return existsSync(p) ? readFileSync(p, 'utf8') : null }
|
||||
|
||||
// ── 1. logical insets on the two surfaces the survey named ───────────────────────────────────
|
||||
|
|
@ -259,9 +276,45 @@ if (!fails.some((f) => f.startsWith('1'))) notes.push(`insets: ${SURFACES.length
|
|||
fails.push(`5 ${NEW} is missing — the kit component the barrel now points at does not exist.`)
|
||||
} else {
|
||||
if (read(OLD)) fails.push(`5 ${OLD} still exists. A move that leaves the original behind is a COPY, and two chip bars over one filterSet drift apart the moment one is edited.`)
|
||||
// ★ THIS ASSERTION INVERTED WHEN THE SHIM WINDOW CLOSED, and the inversion is the point rather
|
||||
// than an edit. While the one-cycle shim existed, the thing that could break was an importer of
|
||||
// the barrel failing to resolve, so the arm REQUIRED the re-export. Now that the shim is retired
|
||||
// the risk is the opposite and larger: a re-export creeping back makes the plugin barrel look
|
||||
// like the owner of a library component, which is exactly how check:filter-multivalue ended up
|
||||
// reading a shim instead of the panel it was written to guard, and passing vacuously.
|
||||
// A one-cycle shim that nobody retires is permanent, so the gate now holds the window closed.
|
||||
const barrel = read(BARREL) || ''
|
||||
if (!/DashboardFilterChips.*@map\/components\/dashboards/.test(barrel)) {
|
||||
fails.push(`5 ${BARREL} does not re-export DashboardFilterChips from the library — an importer of the barrel would resolve the path that just moved.`)
|
||||
const barrelCode = barrel.replace(/\/\*[\s\S]*?\*\//g, ' ').replace(/(^|[^:])\/\/[^\n]*/g, '$1')
|
||||
for (const moved of ['DashboardFilterChips', 'DashboardFacetRail', 'DashboardBreadcrumb']) {
|
||||
if (new RegExp(`export[^\\n]*${moved}`).test(barrelCode)) {
|
||||
fails.push(`5 ${BARREL} re-exports ${moved}, which lives in library/components/dashboards/. The one-cycle shim is retired: importers read '@map/components/dashboards/${moved}.vue' directly, and a barrel re-export makes the plugin look like the owner of a kit component.`)
|
||||
}
|
||||
// And nobody may still be reading it through the barrel or from the path it left.
|
||||
for (const rel of sources()) {
|
||||
const src = read(rel); if (!src) continue
|
||||
const code = src.replace(/\/\*[\s\S]*?\*\//g, ' ').replace(/(^|[^:])\/\/[^\n]*/g, '$1')
|
||||
// ★ ONE IMPORT STATEMENT AT A TIME. The first version used `import … ${moved} …
|
||||
// [\s\S]{0,200}? from '…'`, and that span CROSSED INTO THE NEXT STATEMENT: after the fix,
|
||||
// research-dashboard.vue reads `import DashboardFacetRail from '@map/…'` immediately followed
|
||||
// by a braced import ending `from './src/components/dashboards'`, so the regex started at the
|
||||
// CORRECT line and found the barrel path two statements later. It reported the file it had
|
||||
// just been fixed in. Third unbounded-span false positive I have written today (the others
|
||||
// walked a brace match past a callback-less watch() and read a chip label's own name as
|
||||
// prose), so the shape is the lesson: never let a span cross a statement boundary — bound it
|
||||
// with a negative lookahead for the next statement keyword.
|
||||
const IMPORTS = /\bimport\b(?:(?!\bimport\b)[\s\S])*?\bfrom\s*'([^']*)'/g
|
||||
let stmt
|
||||
while ((stmt = IMPORTS.exec(code))) {
|
||||
const spec = stmt[0]
|
||||
const path = stmt[1]
|
||||
if (!new RegExp(`\\b${moved}\\b`).test(spec)) continue
|
||||
const viaBarrel = /components\/dashboards$/.test(path)
|
||||
const viaOldPath = new RegExp(`plugin-designs[^']*${moved}\\.vue$`).test(path)
|
||||
if (viaBarrel || viaOldPath) {
|
||||
fails.push(`5 ${rel} still imports ${moved} from '${path}'. It moved to library/components/dashboards/ — import it from '@map/components/dashboards/${moved}.vue'.`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Comments first: this file's own notes name cfg.legend and useTreeLegendLabels.
|
||||
const code = src.replace(/\/\*[\s\S]*?\*\//g, ' ').replace(/(^|[^:])\/\/[^\n]*/g, '$1')
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import { tStatic } from '@map/i18n/index.js'
|
|||
import { inject, computed, ref } from 'vue'
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { aggregate, buildDonut, buildBars, lbl, buildCountryRegionColors, OTHER_KEY, otherLabel } from '../../composables/useDashboardAggregations.js'
|
||||
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '../../composables/useDashboardShell.js'
|
||||
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '@map/composables/useDashboardSearch.js'
|
||||
|
||||
/**
|
||||
* ── THE RAIL'S TAB STRIP ──────────────────────────────────────────────────────────────────────
|
||||
|
|
|
|||
|
|
@ -13,8 +13,9 @@
|
|||
*/
|
||||
import { inject, ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '../../composables/useDashboardShell.js'
|
||||
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '@map/composables/useDashboardSearch.js'
|
||||
import { useCsvExport } from '@map/composables/useCsvExport.js'
|
||||
import { formatCount } from '@map/utils/formatCount.js'
|
||||
import { useTreeLegendLabels } from '../../composables/useTreeLegendLabels.js'
|
||||
import { tStatic } from '@map/i18n/index.js'
|
||||
|
||||
|
|
@ -30,7 +31,8 @@ const cfg = inject('dashboardConfig', {})
|
|||
|
||||
const lbl = (v) => (v === null || v === undefined ? '' : (typeof v === 'object' ? (v.label ?? v.value ?? '') : v))
|
||||
const num = (v) => { if (typeof v === 'number') return v; const n = parseFloat(String(v ?? '').replace(/[^0-9.\-]/g, '')); return isNaN(n) ? null : n }
|
||||
const fmt = (n) => (n === null || n === undefined ? '' : Number(n).toLocaleString('en-US'))
|
||||
// Empty stays '' here, and '' still falls through to "0" — formatCount only punctuates.
|
||||
const fmt = (n) => (n === null || n === undefined ? '' : formatCount(n))
|
||||
|
||||
const COLUMNS = computed(() => cfg.columns || [])
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import { tStatic } from '@map/i18n/index.js'
|
|||
const T = (key, en) => tStatic(key) || en
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { useCsvExport } from '@map/composables/useCsvExport.js'
|
||||
import { formatCount } from '@map/utils/formatCount.js'
|
||||
import { useTreeLegendLabels } from '../../composables/useTreeLegendLabels.js'
|
||||
import { lbl } from '../../composables/useDashboardAggregations.js'
|
||||
|
||||
|
|
@ -51,7 +52,8 @@ const record = computed(() => {
|
|||
if (!s || !dash || !dash.rowStore || !dash.rowStore.value) return null
|
||||
return dash.rowStore.value.get(s) || null
|
||||
})
|
||||
const fmt = (n) => (n === null || n === undefined || n === '' ? '—' : Number(n).toLocaleString('en-US'))
|
||||
// This one treats '' as missing and shows an em dash; the table does not. Preserved exactly.
|
||||
const fmt = (n) => (n === null || n === undefined || n === '' ? '—' : formatCount(n))
|
||||
const showPhoto = computed(() => {
|
||||
const r = record.value
|
||||
if (!r) return false
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ import MapToolbar from '@map/components/map-controls/MapToolbar.vue'
|
|||
import ZoomInButton from '@map/components/map-controls/ZoomInButton.vue'
|
||||
import ZoomOutButton from '@map/components/map-controls/ZoomOutButton.vue'
|
||||
import { lbl } from '../../composables/useDashboardAggregations.js'
|
||||
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '../../composables/useDashboardShell.js'
|
||||
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '@map/composables/useDashboardSearch.js'
|
||||
// ── THE PRAYER COLOUR STRATEGY, REUSED NOT RE-DERIVED ──
|
||||
// applyColor() returns the SAME 3-tier expression the prayer map paints with, keyed off the
|
||||
// FULL_PRAYER_THRESHOLD that library/colors/prayer-progress.js owns. Importing it here means the
|
||||
|
|
|
|||
|
|
@ -12,20 +12,17 @@
|
|||
* standalone GeocoderComponent per config.search entry, each consuming the shared
|
||||
* useGeocoderSearch composable via a busAdapter sink (kind-switch stays in the composable).
|
||||
*/
|
||||
// ── THE TWO MOVED PANELS ARE NOT HERE ────────────────────────────────────────────────────────
|
||||
// DashboardFacetRail, DashboardFilterChips and DashboardBreadcrumb live in library/components/
|
||||
// dashboards/ (kit landings 4c-3, 4c-2 and 4c-4). Each was re-exported from here for ONE cycle so that moving a file and changing
|
||||
// its importers were separate, reviewable landings; both shims are now retired. Import them from
|
||||
// '@map/components/dashboards/<Name>.vue' — deliberately NOT re-added here, because a barrel that
|
||||
// re-exports a library component makes the plugin look like its owner and is the thing that kept
|
||||
// check:filter-multivalue reading a shim instead of the panel it was written to guard.
|
||||
export { default as DashboardTopBar } from './DashboardTopBar.vue'
|
||||
// MOVED to library/components/dashboards/ (kit landing 4c-3), re-exported for one cycle like the
|
||||
// chip bar before it, so research-dashboard.vue's import list does not change in the landing that
|
||||
// moves the file.
|
||||
export { default as DashboardFacetRail } from '@map/components/dashboards/DashboardFacetRail.vue'
|
||||
export { default as DashboardDataTable } from './DashboardDataTable.vue'
|
||||
export { default as DashboardChartsRail } from './DashboardChartsRail.vue'
|
||||
export { default as DashboardDetailDrawer } from './DashboardDetailDrawer.vue'
|
||||
// MOVED to library/components/dashboards/ (kit landing 4c-2) and re-exported here for one cycle,
|
||||
// so no consumer's import line has to change in the same landing that moves the file. Anything
|
||||
// importing DashboardFilterChips from this barrel keeps working; the re-export goes when the rail
|
||||
// follows it in 4c-3 and this barrel becomes the library's own.
|
||||
export { default as DashboardFilterChips } from '@map/components/dashboards/DashboardFilterChips.vue'
|
||||
export { default as DashboardBreadcrumb } from './DashboardBreadcrumb.vue'
|
||||
export { default as DashboardMapPanel } from './DashboardMapPanel.vue'
|
||||
export { default as DashboardSearchHeader } from './DashboardSearchHeader.vue'
|
||||
// DashboardResearchFilters — the DX-life research-page search bar + expand-filters dropdown SET
|
||||
|
|
|
|||
|
|
@ -1,14 +0,0 @@
|
|||
/**
|
||||
* useCsvExport.js — RE-EXPORT SHIM (dashboard-kit landing 3).
|
||||
*
|
||||
* The real thing now lives at library/composables/useCsvExport.js. Same one-cycle contract as
|
||||
* landings 1 and 2: every importer keeps working unchanged while the move is verified on its own,
|
||||
* and this file is deleted in the next landing after a measured check that nothing still imports it.
|
||||
*
|
||||
* EXPORT_FIELDS travels with it. Re-exporting only the composable would have been a silent break:
|
||||
* the field list is imported separately by the gate that checks the CSV's shape.
|
||||
*
|
||||
* It re-exports; it does not duplicate. A second copy would drift silently while both halves kept
|
||||
* passing their gates.
|
||||
*/
|
||||
export { useCsvExport, EXPORT_FIELDS } from '@map/composables/useCsvExport.js'
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
/**
|
||||
* useDashboardLayout.js — RE-EXPORT SHIM (dashboard-kit landing 2).
|
||||
*
|
||||
* The engine now lives at library/composables/useDashboardLayout.js. Same one-cycle contract as
|
||||
* landing 1's bus shim: every importer keeps working unchanged while the move is verified on its
|
||||
* own, and this file is deleted in the next landing.
|
||||
*
|
||||
* It re-exports; it does not duplicate. A second copy would drift silently while both halves kept
|
||||
* passing their gates.
|
||||
*/
|
||||
export { useDashboardLayout } from '@map/composables/useDashboardLayout.js'
|
||||
|
|
@ -26,8 +26,10 @@
|
|||
import { exactMatches, fuzzyMatches, resolveFuzzyValues } from '@map/components/search/fuzzy.js'
|
||||
import { provide, inject, ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'
|
||||
import { createSelectionBus } from '@map/composables/useSelectionBus.js'
|
||||
import { useDashboardData } from './useDashboardData.js'
|
||||
import { useDashboardData } from '@map/composables/useDashboardData.js'
|
||||
import { useCsvExport } from '@map/composables/useCsvExport.js'
|
||||
import { buildSearchAccessors, makeSearchMatcher, filterRowsBySearch } from '@map/composables/useDashboardSearch.js'
|
||||
import { formatCount } from '@map/utils/formatCount.js'
|
||||
import { useTreeLegendLabels } from './useTreeLegendLabels.js'
|
||||
import { useTreeLegendColors } from './useTreeLegendColors.js'
|
||||
import { DataSourceManager } from '@map/api/DataSourceManager.js'
|
||||
|
|
@ -39,83 +41,14 @@ const mapValues = (obj, fn) =>
|
|||
Object.fromEntries(Object.entries(obj || {}).map(([k, v]) => [k, fn(v, k)]))
|
||||
|
||||
// number formatter (same as the old inline `fmt`); exported for the profile's KPI strip.
|
||||
export const fmt = (n) => (n === null || n === undefined ? '—' : Number(n).toLocaleString('en-US'))
|
||||
|
||||
/**
|
||||
* Build the free-text search accessors for a dashboard config (header-1 search bar).
|
||||
* config.searchKeys (facet keys) → those facet accessors; else the string columns' accessors.
|
||||
* ONE declaration reused by the shell (KPIs) AND every panel (table/map/charts/facets) so the
|
||||
* searchable text can never drift from what the panels show, and the substring match is not
|
||||
* copy-pasted into each panel (kills the very duplication DOXA-LIB-2 removed).
|
||||
*/
|
||||
export function buildSearchAccessors(config) {
|
||||
const FACET_ACC = mapValues(config.facets, (f) => f.get)
|
||||
const COL_ACC = Object.fromEntries((config.columns || []).map((c) => [c.key, c.get]))
|
||||
const keys = Array.isArray(config.searchKeys) ? config.searchKeys : null
|
||||
if (keys) return keys.map((k) => FACET_ACC[k] || COL_ACC[k]).filter((fn) => typeof fn === 'function')
|
||||
return (config.columns || []).filter((c) => c.type !== 'num' && typeof c.get === 'function').map((c) => c.get)
|
||||
}
|
||||
|
||||
/**
|
||||
* Reusable predicate: does `row` match the bus's current free-text search term?
|
||||
* Returns true when there is no term (identical to pre-search behaviour). `accessors` is the
|
||||
* array from buildSearchAccessors(config). Case-insensitive substring over each accessor's value.
|
||||
*/
|
||||
export function makeSearchMatcher(bus, accessors) {
|
||||
// ★ FUZZY, NOT SUBSTRING (the agent 2026-09-23: "add an n to the end of a country name" must
|
||||
// still find it -- check what DX-life's search bar bakes in). DX-life runs real Fuse.js with
|
||||
// { threshold: 0.4, ignoreLocation: true, minMatchCharLength: 3 } (UupgsList.vue:288), so its
|
||||
// search tolerates typos. This matcher was a plain .includes() -- the one search surface that
|
||||
// silently lost that behaviour in the migration (measured: 'Bhutan' 13 rows, 'Bhutann' 0).
|
||||
// It now delegates to the shared fuzzyMatches() in @map fuzzy.js -- the same matcher the
|
||||
// grid's Fuse uses -- with the same DX-life options, so every search surface agrees.
|
||||
// Row-level predicates for the TIERED contract (see fuzzy.js exactMatches): the caller
|
||||
// (filterRowsBySearch below) runs the exact tier over the whole row set first and falls back
|
||||
// to the fuzzy tier only when exact yields nothing, so an exact term agrees with the facet.
|
||||
const test = (row, pred) => {
|
||||
const needle = (bus?.searchTerm?.value || '').trim()
|
||||
if (!needle) return true
|
||||
for (const acc of accessors) {
|
||||
const v = acc(row)
|
||||
if (v != null && pred(String(v), needle, { threshold: 0.4, minMatchCharLength: 3 })) return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
const matcher = (row) => test(row, fuzzyMatches)
|
||||
matcher.exact = (row) => test(row, exactMatches)
|
||||
matcher.active = () => !!(bus?.searchTerm?.value || '').trim()
|
||||
matcher.term = () => (bus?.searchTerm?.value || '').trim()
|
||||
matcher.accessors = accessors
|
||||
return matcher
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply the TIERED search to a row set:
|
||||
* 1. exact substring -- an exact term returns exactly the rows the equivalent facet selects.
|
||||
* 2. facet-VALUE resolution (the agent: "Austrian or Canadian... a selection of that country --
|
||||
* the table under the map shows the result for that country"): the term is resolved by
|
||||
* whole-value edit distance against each accessor's DISTINCT values, and the rows returned
|
||||
* are those carrying a resolved value -- byte-identical to picking it as a filter.
|
||||
* 3. the generic windowed fuzzy rescue, only when nothing resolves.
|
||||
*/
|
||||
export function filterRowsBySearch(rows, matcher) {
|
||||
if (!matcher.active()) return rows
|
||||
const exact = rows.filter(matcher.exact)
|
||||
if (exact.length) return exact
|
||||
const term = matcher.term()
|
||||
// ONE pool across every accessor's distinct values, so the GLOBAL best match wins (see
|
||||
// resolveFuzzyValues: ties at the minimal distance stay, everything farther drops --
|
||||
// 'Canadian' resolves to Canada, not to 47 rows of <=3-edit neighbours across facets).
|
||||
const distinct = new Set()
|
||||
for (const acc of matcher.accessors) for (const r of rows) { const v = acc(r); if (v != null && v !== '') distinct.add(String(v)) }
|
||||
const winners = new Set(resolveFuzzyValues(term, [...distinct], { threshold: 0.4 }))
|
||||
if (winners.size) {
|
||||
const resolved = rows.filter((r) => matcher.accessors.some((acc) => { const v = acc(r); return v != null && winners.has(String(v)) }))
|
||||
if (resolved.length) return resolved
|
||||
}
|
||||
return rows.filter(matcher)
|
||||
}
|
||||
export const fmt = (n) => (n === null || n === undefined ? '—' : formatCount(n))
|
||||
|
||||
// ── THE SHARED SEARCH LIVES IN library/composables/useDashboardSearch.js ─────────────────────
|
||||
// It was extracted there by kit landing 4a and these three functions were left DEFINED here as
|
||||
// well — code-identical copies, about 3KB, including the Fuse.js matcher. Nothing had diverged yet,
|
||||
// but the comment that used to sit here said the whole point of ONE declaration is that "the
|
||||
// searchable text can never drift from what the panels show", and two copies is how that drift
|
||||
// starts. This file now imports them like every other consumer; the definitions live in one place.
|
||||
/**
|
||||
* Generic KPI computation driven by config.kpis. Each kpi def declares a `kind`:
|
||||
* count → row count of the filtered scope (+ optional delta = hidden-by-filter count)
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
/**
|
||||
* useSelectionCamera.js — RE-EXPORT SHIM (dashboard-kit landing 3).
|
||||
*
|
||||
* The real thing now lives at library/composables/useSelectionCamera.js. Same one-cycle contract as landings 1
|
||||
* and 2: every importer keeps working unchanged while the move is verified on its own, and this
|
||||
* file is deleted in the next landing after a measured check that nothing still imports it.
|
||||
*
|
||||
* It re-exports; it does not duplicate. A second copy would drift silently while both halves kept
|
||||
* passing their gates.
|
||||
*/
|
||||
export { useSelectionCamera, selectionBounds, CAMERA_POLICY } from '@map/composables/useSelectionCamera.js'
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"stage": "production",
|
||||
"_comment": "Capability-4 composite: the monolithic doxa-research-map (cap-3) stacked above the people-groups-grid (cap-2), scrolled as one element. THE MOBILE SIBLING of dashboard-plus-grid — the agent's 2026-09-22 ruling was two separate cap-4 plugins rather than one element that swaps its top half by aspect ratio ('that would be really complex'); the SPA picks which one to show. Composes by TAG + BUNDLE URL (the stack-demo element/src contract) rather than baking the children in, because importing the research map's .vue directly would bypass doxa-research-map/index.js and silently drop its bundle-private colour strategies, its profileModules registry, its Pinia/i18n pair and the RTL plugin. The grid's own search + filters are ON here (unlike the desktop sibling, where the dashboard header owns them).",
|
||||
"type": "nested-elements-mfe",
|
||||
"composes": ["doxa-research-map", "people-groups-grid"],
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
* facetMatches use `includes` on a scalar fails A; dropping the comma from escapeValue's reserved
|
||||
* set fails C. No browser.
|
||||
*/
|
||||
import { readFileSync, existsSync } from 'node:fs'
|
||||
import { readFileSync, existsSync, readdirSync } from 'node:fs'
|
||||
import { resolve, dirname, join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
|
|
@ -151,6 +151,67 @@ const { createSelectionBus } = await import(BUS)
|
|||
}
|
||||
}
|
||||
|
||||
// ── E. the shared SEARCH is declared once, like the predicate ─────────────────────────────────
|
||||
// Arm B above exists because a copied predicate lets one panel disagree with the others about what
|
||||
// is on screen. The free-text SEARCH is the same hazard with a different name, and it had already
|
||||
// happened: kit landing 4a extracted buildSearchAccessors / makeSearchMatcher / filterRowsBySearch
|
||||
// into library/composables/useDashboardSearch.js and LEFT THEM DEFINED in
|
||||
// plugin-designs/research-dashboard/src/composables/useDashboardShell.js as well — code-identical
|
||||
// copies, ~4.3KB including the Fuse.js matcher. Nothing had diverged, so nothing failed; the rail
|
||||
// simply ran one copy while the shell's KPIs and three panels ran the other. That is the shape this
|
||||
// repo already paid for at Jaccard 0.82 with useNeighborT/usePplrT.
|
||||
// So: ONE module declares them, and nobody may import them from the shell.
|
||||
{
|
||||
const SEARCH_FNS = ['buildSearchAccessors', 'makeSearchMatcher', 'filterRowsBySearch']
|
||||
const SHELL = 'plugin-designs/research-dashboard/src/composables/useDashboardShell.js'
|
||||
const HOME = 'library/composables/useDashboardSearch.js'
|
||||
const strip = (t) => t.replace(/\/\*[\s\S]*?\*\//g, ' ').replace(/(^|[^:])\/\/[^\n]*/g, '$1')
|
||||
const read = (rel) => { const f = join(ROOT, rel); return existsSync(f) ? readFileSync(f, 'utf8') : null }
|
||||
// Every .vue/.js under the two source roots, so the importer sweep cannot rely on a hardcoded list
|
||||
// of "the files that might import this" — which is the assumption that let 4a's copies survive.
|
||||
const sources = (dir = null, acc = []) => {
|
||||
const base = dir || ROOT
|
||||
let entries = []
|
||||
try { entries = readdirSync(base, { withFileTypes: true }) } catch (_) { return acc }
|
||||
for (const e of entries) {
|
||||
const full = join(base, e.name)
|
||||
const rel = full.slice(ROOT.length + 1)
|
||||
if (/(^|\/)(node_modules|dist|public|\.git)(\/|$)/.test(rel)) continue
|
||||
if (dir === null && !/^(plugin-designs|library)$/.test(e.name)) continue
|
||||
if (e.isDirectory()) sources(full, acc)
|
||||
else if (/\.(vue|js|mjs)$/.test(e.name)) acc.push(rel)
|
||||
}
|
||||
return acc
|
||||
}
|
||||
const homeSrc = read(HOME)
|
||||
if (!homeSrc) fails.push(`E ${HOME} is missing — the shared search has no home.`)
|
||||
else for (const fn of SEARCH_FNS) {
|
||||
if (!new RegExp(`export function ${fn}\\b`).test(strip(homeSrc))) {
|
||||
fails.push(`E ${HOME} does not export ${fn} — the module that is supposed to own it does not declare it.`)
|
||||
}
|
||||
}
|
||||
const shellSrc = read(SHELL)
|
||||
if (shellSrc) for (const fn of SEARCH_FNS) {
|
||||
if (new RegExp(`export function ${fn}\\b`).test(strip(shellSrc))) {
|
||||
fails.push(`E ${SHELL} DEFINES ${fn}, which ${HOME} owns. Two copies of the search mean two answers to "what does this term match", and the panels split between them.`)
|
||||
}
|
||||
}
|
||||
for (const rel of sources()) {
|
||||
const src = read(rel); if (!src || rel === SHELL) continue
|
||||
const code = strip(src)
|
||||
const IMPORTS = /\bimport\b(?:(?!\bimport\b)[\s\S])*?\bfrom\s*'([^']*)'/g
|
||||
let m
|
||||
while ((m = IMPORTS.exec(code))) {
|
||||
if (!/useDashboardShell/.test(m[1])) continue
|
||||
const named = SEARCH_FNS.filter((fn) => new RegExp(`\\b${fn}\\b`).test(m[0]))
|
||||
if (named.length) {
|
||||
fails.push(`E ${rel} imports ${named.join(', ')} from the shell. They live in ${HOME} — import them from '@map/composables/useDashboardSearch.js'.`)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!fails.some((f) => f.startsWith('E'))) notes.push('shared search: declared once in library, and no panel reads it through the shell')
|
||||
}
|
||||
|
||||
for (const n of notes) console.log(' · ' + n)
|
||||
if (fails.length) {
|
||||
console.error(`\n${TAG}: FAIL`)
|
||||
|
|
|
|||
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 <all-people-groups> custom element. -->
|
||||
<script src="../all-people-groups.js" integrity="sha384-X36cKTimDAmKXAxlgtTSJ5O1eow2Bntw3x5oC2XPuwdgrSCgBGl8BbmZwPeQIuJ1" crossorigin="anonymous"></script>
|
||||
<script src="../all-people-groups.js" integrity="sha384-raSKQH2zs0KO9FeiQno95xDbTKdTbCO0wJDobbrrvNnaAaVNUfkeSU+L4kWADEm9" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
{"id":"frontier-500k","label":"Project 700: frontier people groups of 500,000 or more","definition":"IMB Lostness Priority 0 and Population of at least 500,000","filter":{"lostness":[0],"minPopulation":500000},"sources":{"imb":"data/people-groups/people_groups.csv","doxa":"https://pray.doxa.life/api/people-groups/list (fetched 2026-09-25)"},"counts":{"imb":737,"doxa":71},"slugs":["agasa","aiyarakulu","akhdam","alawites-turkiye","arab-bedouin","avar-kunsakh","badhai-chhattisgarhi","bairagi-gujarati","baloch-eastern","baloch-western","bania-agarwal-telegu","bederia","bedouin-arabs-saudi-arabia","dar-hamid","deaf-burmese","deaf-congolese-democratic-republic-of-the-congo","deaf-iranians","deaf-pakistanis","digil-rahanweyn","gaaliin","gawamaa","gazan-arabs","guhayna","ha-li","hadrami-arabs","hasania","jains-hindi","jat-muslim","jula-burkina-faso","kawahia","kotokoli-togo","kummara-kumbara","kurd-northern","kuria","laki","lebanese-shia-arabs","lebanese-sunni-arabs","libyan-arabs","luwu","makhuwa-shirima","makua","meadow-mari","mishaba-laluo","moor","mwera","namasudra-assamese","northern-dong","northern-yemeni-arabs","nuer","pila","pingdi-yao","rizeiqat","rufaa","sanusi-bedouins","shiites","shina-pakistan","shirazi","sudra-das","sutradhar","tigre","tihama-yemeni-arabs","tondman","turkmen","west-bank-arabs","western-baloch-pakistan","white-moor","xiaoliangshan-nosu","yao","yazeed","yinuo-nosu","zigua"]}
|
||||
1
public/dx-maps/assets/people-groups/lists/frontier.json
Normal file
1
public/dx-maps/assets/people-groups/lists/frontier.json
Normal file
File diff suppressed because one or more lines are too long
1
public/dx-maps/assets/people-groups/lists/unengaged.json
Normal file
1
public/dx-maps/assets/people-groups/lists/unengaged.json
Normal file
File diff suppressed because one or more lines are too long
1
public/dx-maps/assets/people-groups/lists/unreached.json
Normal file
1
public/dx-maps/assets/people-groups/lists/unreached.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <bp-big-picture> custom element. -->
|
||||
<script src="../../big-picture.js" integrity="sha384-0PLnZBlIJMdSAz9YdW4iQz2rVzuXLDHNV7DgzSqQAPj0eSFMs0sb8PT79RQDYHeY" crossorigin="anonymous"></script>
|
||||
<script src="../../big-picture.js" integrity="sha384-VoI56FhJLieze4gUEG6DPjj8mnd8HLLPeGqbr9rw65+nxJ0S+cLZtH24dpTENg8n" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <bp-big-picture> custom element. -->
|
||||
<script src="../../big-picture.js" integrity="sha384-0PLnZBlIJMdSAz9YdW4iQz2rVzuXLDHNV7DgzSqQAPj0eSFMs0sb8PT79RQDYHeY" crossorigin="anonymous"></script>
|
||||
<script src="../../big-picture.js" integrity="sha384-VoI56FhJLieze4gUEG6DPjj8mnd8HLLPeGqbr9rw65+nxJ0S+cLZtH24dpTENg8n" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <bp-big-picture> custom element. -->
|
||||
<script src="../big-picture.js" integrity="sha384-0PLnZBlIJMdSAz9YdW4iQz2rVzuXLDHNV7DgzSqQAPj0eSFMs0sb8PT79RQDYHeY" crossorigin="anonymous"></script>
|
||||
<script src="../big-picture.js" integrity="sha384-VoI56FhJLieze4gUEG6DPjj8mnd8HLLPeGqbr9rw65+nxJ0S+cLZtH24dpTENg8n" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT" 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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT" 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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT" 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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj" 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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj" 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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj" 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-/kZKKn306T0Fd6nAEn8Pq/5DSA9T2iF7aozfGxsych2hDNkIK1wKKLI6LQY+BuwO" crossorigin="anonymous"></script>
|
||||
<script src="../../dashboard-plus-grid.js" integrity="sha384-n0wwrzPqkvguUWfD6L7oFkEFpjpT49CadmrtAZC6Ie0dtmVjAYBlrH1rK8YwwrJe" 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-/kZKKn306T0Fd6nAEn8Pq/5DSA9T2iF7aozfGxsych2hDNkIK1wKKLI6LQY+BuwO" crossorigin="anonymous"></script>
|
||||
<script src="../dashboard-plus-grid.js" integrity="sha384-n0wwrzPqkvguUWfD6L7oFkEFpjpT49CadmrtAZC6Ie0dtmVjAYBlrH1rK8YwwrJe" 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 <demo-map> custom element. -->
|
||||
<script src="../demo-map.js" integrity="sha384-5OLSI2MOHUjXFOjqlsdvUY53dISZbT0LKkqtQAmc5N2LEkijcPQ/m+G014KKl05D" crossorigin="anonymous"></script>
|
||||
<script src="../demo-map.js" integrity="sha384-LGarhUQZY8nDdv+kbXK7JQYA1UdId+Q+muZgWKegOEwEGRGrczWe5p0EqbbW9+d/" 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 <demo-map> custom element. -->
|
||||
<script src="../../demo-map.js" integrity="sha384-5OLSI2MOHUjXFOjqlsdvUY53dISZbT0LKkqtQAmc5N2LEkijcPQ/m+G014KKl05D" crossorigin="anonymous"></script>
|
||||
<script src="../../demo-map.js" integrity="sha384-LGarhUQZY8nDdv+kbXK7JQYA1UdId+Q+muZgWKegOEwEGRGrczWe5p0EqbbW9+d/" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
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 <doxa-maps-spa> custom element. -->
|
||||
<script src="../../doxa-maps-spa.js" integrity="sha384-p3mrseluGiP7Uj0HWWEA5IeZcGisLZwSBMxvkcTKROt8Qdlkb4s4NFCZigNWP5dY" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-maps-spa.js" integrity="sha384-hljZG8f1TGBPN3VJu7CPMg2CSIGlfGVFjmZNydYCZw70GRXYtmqWcapc3zJBYriN" 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 <doxa-maps-spa> custom element. -->
|
||||
<script src="../doxa-maps-spa.js" integrity="sha384-p3mrseluGiP7Uj0HWWEA5IeZcGisLZwSBMxvkcTKROt8Qdlkb4s4NFCZigNWP5dY" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-maps-spa.js" integrity="sha384-hljZG8f1TGBPN3VJu7CPMg2CSIGlfGVFjmZNydYCZw70GRXYtmqWcapc3zJBYriN" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -12,13 +12,15 @@
|
|||
"bundle": "all-people-groups",
|
||||
"scriptUrl": "./all-people-groups/all-people-groups.js",
|
||||
"output": "dx-maps/all-people-groups/all-people-groups.js",
|
||||
"integrity": "sha384-X36cKTimDAmKXAxlgtTSJ5O1eow2Bntw3x5oC2XPuwdgrSCgBGl8BbmZwPeQIuJ1",
|
||||
"integrity": "sha384-raSKQH2zs0KO9FeiQno95xDbTKdTbCO0wJDobbrrvNnaAaVNUfkeSU+L4kWADEm9",
|
||||
"elements": [
|
||||
"all-people-groups"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "all-people-groups",
|
||||
"stage": "experimental",
|
||||
"file": "all-people-groups.vue",
|
||||
"description": "All 12,379 people groups (peoplegroups.org) in four colors — reached,",
|
||||
"element": "all-people-groups",
|
||||
|
|
@ -28,7 +30,7 @@
|
|||
"scriptUrl": "./all-people-groups/all-people-groups.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./all-people-groups/all-people-groups/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-X36cKTimDAmKXAxlgtTSJ5O1eow2Bntw3x5oC2XPuwdgrSCgBGl8BbmZwPeQIuJ1\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-raSKQH2zs0KO9FeiQno95xDbTKdTbCO0wJDobbrrvNnaAaVNUfkeSU+L4kWADEm9\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
|
||||
},
|
||||
"bundle": "all-people-groups"
|
||||
}
|
||||
|
|
@ -38,7 +40,7 @@
|
|||
"bundle": "big-picture",
|
||||
"scriptUrl": "./big-picture/big-picture.js",
|
||||
"output": "dx-maps/big-picture/big-picture.js",
|
||||
"integrity": "sha384-0PLnZBlIJMdSAz9YdW4iQz2rVzuXLDHNV7DgzSqQAPj0eSFMs0sb8PT79RQDYHeY",
|
||||
"integrity": "sha384-VoI56FhJLieze4gUEG6DPjj8mnd8HLLPeGqbr9rw65+nxJ0S+cLZtH24dpTENg8n",
|
||||
"elements": [
|
||||
"bp-big-picture",
|
||||
"bp-research-header",
|
||||
|
|
@ -48,9 +50,11 @@
|
|||
"bp-research-header",
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "big-picture",
|
||||
"stage": "experimental",
|
||||
"file": "big-picture.vue",
|
||||
"description": "The Cat-4 composite that PAIRS the two real capability elements of the",
|
||||
"element": "bp-big-picture",
|
||||
|
|
@ -60,7 +64,7 @@
|
|||
"scriptUrl": "./big-picture/big-picture.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./big-picture/big-picture/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=\"./big-picture/big-picture.js\" integrity=\"sha384-0PLnZBlIJMdSAz9YdW4iQz2rVzuXLDHNV7DgzSqQAPj0eSFMs0sb8PT79RQDYHeY\" crossorigin=\"anonymous\"></script>\n<bp-big-picture profile-config='{\"profile\":\"big-picture\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></bp-big-picture>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./big-picture/big-picture.js\" integrity=\"sha384-VoI56FhJLieze4gUEG6DPjj8mnd8HLLPeGqbr9rw65+nxJ0S+cLZtH24dpTENg8n\" crossorigin=\"anonymous\"></script>\n<bp-big-picture profile-config='{\"profile\":\"big-picture\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></bp-big-picture>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -104,13 +108,15 @@
|
|||
"bundle": "cities-internet",
|
||||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"output": "dx-maps/cities-internet/cities-internet.js",
|
||||
"integrity": "sha384-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl",
|
||||
"integrity": "sha384-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT",
|
||||
"elements": [
|
||||
"cities-internet-map"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "connectivity-list",
|
||||
"stage": "experimental",
|
||||
"file": "connectivity-list.vue",
|
||||
"description": "Countries where DX people groups live, grouped by region, showing measured internet penetration",
|
||||
"element": "cities-internet-map",
|
||||
|
|
@ -120,11 +126,12 @@
|
|||
"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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl\" 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-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "connectivity-map",
|
||||
"stage": "production",
|
||||
"file": "connectivity-map.vue",
|
||||
"description": "Every country shaded by measured internet penetration, with its named carriers and dominant",
|
||||
"element": "cities-internet-map",
|
||||
|
|
@ -134,11 +141,12 @@
|
|||
"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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl\" 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-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "data-tables",
|
||||
"stage": "experimental",
|
||||
"file": "data-tables.vue",
|
||||
"description": "Four validated research tables, one tab each, with sortable and filterable columns, CSV and JSON",
|
||||
"element": "cities-internet-map",
|
||||
|
|
@ -148,7 +156,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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl\" 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-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT\" 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 +165,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "dx-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN",
|
||||
"integrity": "sha384-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -165,9 +173,11 @@
|
|||
"country-posters/country-poster-wall",
|
||||
"country-posters/countries-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "countries-map",
|
||||
"stage": "experimental",
|
||||
"file": "countries-map.vue",
|
||||
"description": "The researcher's workbench retargeted from people groups to COUNTRIES — region",
|
||||
"element": "country-posters-map",
|
||||
|
|
@ -177,11 +187,12 @@
|
|||
"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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN\" 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-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "country-poster-wall",
|
||||
"stage": "experimental",
|
||||
"file": "country-poster-wall.vue",
|
||||
"description": "One printable card per country, grouped into COLLAPSIBLE regional sections so the",
|
||||
"element": "country-posters-map",
|
||||
|
|
@ -191,11 +202,12 @@
|
|||
"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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN\" 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-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "country-posters-mfe",
|
||||
"stage": "experimental",
|
||||
"file": "country-posters-mfe.vue",
|
||||
"description": "Country Posters as ONE two-tab element — the countries map and the printable",
|
||||
"element": "country-posters-mfe",
|
||||
|
|
@ -205,7 +217,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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN\" 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-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj\" 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 +226,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-/kZKKn306T0Fd6nAEn8Pq/5DSA9T2iF7aozfGxsych2hDNkIK1wKKLI6LQY+BuwO",
|
||||
"integrity": "sha384-n0wwrzPqkvguUWfD6L7oFkEFpjpT49CadmrtAZC6Ie0dtmVjAYBlrH1rK8YwwrJe",
|
||||
"elements": [
|
||||
"dashboard-plus-grid"
|
||||
],
|
||||
|
|
@ -222,9 +234,11 @@
|
|||
"research-dashboard",
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "dashboard-plus-grid",
|
||||
"stage": "production",
|
||||
"file": "dashboard-plus-grid.vue",
|
||||
"description": "Both children are IMPORTED DIRECTLY (compiled into this ONE bundle — no runtime bundle",
|
||||
"element": "dashboard-plus-grid",
|
||||
|
|
@ -234,7 +248,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-/kZKKn306T0Fd6nAEn8Pq/5DSA9T2iF7aozfGxsych2hDNkIK1wKKLI6LQY+BuwO\" 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-n0wwrzPqkvguUWfD6L7oFkEFpjpT49CadmrtAZC6Ie0dtmVjAYBlrH1rK8YwwrJe\" 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": [
|
||||
{
|
||||
|
|
@ -258,13 +272,15 @@
|
|||
"bundle": "demo-map",
|
||||
"scriptUrl": "./demo-map/demo-map.js",
|
||||
"output": "dx-maps/demo-map/demo-map.js",
|
||||
"integrity": "sha384-5OLSI2MOHUjXFOjqlsdvUY53dISZbT0LKkqtQAmc5N2LEkijcPQ/m+G014KKl05D",
|
||||
"integrity": "sha384-LGarhUQZY8nDdv+kbXK7JQYA1UdId+Q+muZgWKegOEwEGRGrczWe5p0EqbbW9+d/",
|
||||
"elements": [
|
||||
"demo-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "demo-map",
|
||||
"stage": "experimental",
|
||||
"file": "demo-map.vue",
|
||||
"description": "Simple two-tab demo map. Tab 1 colors pins by religion (shared",
|
||||
"element": "demo-map",
|
||||
|
|
@ -274,7 +290,7 @@
|
|||
"scriptUrl": "./demo-map/demo-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./demo-map/demo-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-5OLSI2MOHUjXFOjqlsdvUY53dISZbT0LKkqtQAmc5N2LEkijcPQ/m+G014KKl05D\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></demo-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-LGarhUQZY8nDdv+kbXK7JQYA1UdId+Q+muZgWKegOEwEGRGrczWe5p0EqbbW9+d/\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></demo-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -301,7 +317,7 @@
|
|||
"bundle": "doxa-maps-spa",
|
||||
"scriptUrl": "./doxa-maps-spa/doxa-maps-spa.js",
|
||||
"output": "dx-maps/doxa-maps-spa/doxa-maps-spa.js",
|
||||
"integrity": "sha384-p3mrseluGiP7Uj0HWWEA5IeZcGisLZwSBMxvkcTKROt8Qdlkb4s4NFCZigNWP5dY",
|
||||
"integrity": "sha384-hljZG8f1TGBPN3VJu7CPMg2CSIGlfGVFjmZNydYCZw70GRXYtmqWcapc3zJBYriN",
|
||||
"elements": [
|
||||
"doxa-maps-spa"
|
||||
],
|
||||
|
|
@ -314,9 +330,11 @@
|
|||
"cities-internet/connectivity-map",
|
||||
"gospel-resources/resources-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "doxa-maps-spa",
|
||||
"stage": "experimental",
|
||||
"file": "doxa-maps-spa.vue",
|
||||
"description": "The DX-maps app itself: one element whose vertical-tab rail nests every other",
|
||||
"element": "doxa-maps-spa",
|
||||
|
|
@ -326,7 +344,7 @@
|
|||
"scriptUrl": "./doxa-maps-spa/doxa-maps-spa.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-maps-spa/doxa-maps-spa/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=\"./doxa-maps-spa/doxa-maps-spa.js\" integrity=\"sha384-p3mrseluGiP7Uj0HWWEA5IeZcGisLZwSBMxvkcTKROt8Qdlkb4s4NFCZigNWP5dY\" crossorigin=\"anonymous\"></script>\n<doxa-maps-spa profile-config='{\"profile\":\"doxa-maps-spa\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-maps-spa>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-maps-spa/doxa-maps-spa.js\" integrity=\"sha384-hljZG8f1TGBPN3VJu7CPMg2CSIGlfGVFjmZNydYCZw70GRXYtmqWcapc3zJBYriN\" crossorigin=\"anonymous\"></script>\n<doxa-maps-spa profile-config='{\"profile\":\"doxa-maps-spa\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-maps-spa>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -353,13 +371,15 @@
|
|||
"bundle": "doxa-research-map",
|
||||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
|
||||
"integrity": "sha384-fCobW4BrwyvEO6WLLTAFrV1Ohg5OygfMFhQ74BfNZKfrAeHWZtLPfADZn8MAh+yW",
|
||||
"integrity": "sha384-/5asCKYoeHrVbqSB41IDuMyBT4g/wxpSNNjX07jIZeupvvH9jhL9Bhx7vzjFort+",
|
||||
"elements": [
|
||||
"doxa-research-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "research-map",
|
||||
"stage": "experimental",
|
||||
"file": "research-map.vue",
|
||||
"description": "The researcher's workbench: every piece a missiologist, demographer or",
|
||||
"element": "doxa-research-map",
|
||||
|
|
@ -369,7 +389,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-fCobW4BrwyvEO6WLLTAFrV1Ohg5OygfMFhQ74BfNZKfrAeHWZtLPfADZn8MAh+yW\" 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-/5asCKYoeHrVbqSB41IDuMyBT4g/wxpSNNjX07jIZeupvvH9jhL9Bhx7vzjFort+\" 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,14 +415,16 @@
|
|||
"bundle": "doxa-simple-map",
|
||||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
|
||||
"integrity": "sha384-Kf975BxLFGhgM+2N07E8/R+Vt1m5eXBCKYw9P7DO2ZeXPv5sLjuumAHF222hUla8",
|
||||
"integrity": "sha384-QOW8iK3rEQ/kEvfEGkDHDh7yus55b/r2uPyTE9YABId+0Hdv1u5spYhGASzeMznt",
|
||||
"elements": [
|
||||
"doxa-map",
|
||||
"doxa-simple-map"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "doxa-simple-map",
|
||||
"stage": "production",
|
||||
"file": "doxa-simple-map.vue",
|
||||
"description": "The simple world map, shipped as three presets off ONE prop table —",
|
||||
"element": "doxa-map",
|
||||
|
|
@ -412,7 +434,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-Kf975BxLFGhgM+2N07E8/R+Vt1m5eXBCKYw9P7DO2ZeXPv5sLjuumAHF222hUla8\" 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-QOW8iK3rEQ/kEvfEGkDHDh7yus55b/r2uPyTE9YABId+0Hdv1u5spYhGASzeMznt\" 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": [
|
||||
{
|
||||
|
|
@ -496,9 +518,11 @@
|
|||
"elements": [
|
||||
"doxa-vision-card"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "doxa-vision-card",
|
||||
"stage": "experimental",
|
||||
"file": "doxa-vision-card.vue",
|
||||
"description": "A true funnel of the remaining task, every number computed from data: all people",
|
||||
"element": "doxa-vision-card",
|
||||
|
|
@ -557,9 +581,11 @@
|
|||
"elements": [
|
||||
"golden-path-check"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "golden-path-check",
|
||||
"stage": "experimental",
|
||||
"file": "golden-path-check.vue",
|
||||
"description": "A live self-test of the develop-a-plugin-and-see-it-live path: it reads the built",
|
||||
"element": "golden-path-check",
|
||||
|
|
@ -578,13 +604,15 @@
|
|||
"bundle": "gospel-internet",
|
||||
"scriptUrl": "./gospel-internet/gospel-internet.js",
|
||||
"output": "dx-maps/gospel-internet/gospel-internet.js",
|
||||
"integrity": "sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg",
|
||||
"integrity": "sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR",
|
||||
"elements": [
|
||||
"gospel-internet-board"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "board",
|
||||
"stage": "experimental",
|
||||
"file": "board.vue",
|
||||
"description": "For every remaining people group: what gospel resources exist in a language they use, and how much of their country (or Indian state) is online to receive them.",
|
||||
"element": "gospel-internet-board",
|
||||
|
|
@ -594,7 +622,7 @@
|
|||
"scriptUrl": "./gospel-internet/gospel-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-internet/board/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-internet/gospel-internet.js\" integrity=\"sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-internet/gospel-internet.js\" integrity=\"sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -694,7 +722,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "dx-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z",
|
||||
"integrity": "sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -702,9 +730,11 @@
|
|||
"resources-map",
|
||||
"data-tables"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "charts",
|
||||
"stage": "experimental",
|
||||
"file": "charts.vue",
|
||||
"description": "The gap measured by LANGUAGE (ISO 639-3) rather than by people group, because one translation serves every group that speaks it, so counting by group overstates how much work remains.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -714,11 +744,12 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/charts/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "data-tables",
|
||||
"stage": "experimental",
|
||||
"file": "data-tables.vue",
|
||||
"description": "Eleven tables covering both halves of one question: every gospel resource with its real URL and how much Scripture it is, and the 1,613 people groups where nothing was found with the pools searched recorded per row, plus translation priority, bridge languages, city bridges, the deaf gap and access against population growth.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -728,11 +759,12 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "gospel-dashboard",
|
||||
"stage": "production",
|
||||
"file": "gospel-dashboard.vue",
|
||||
"description": "The gospel map and its tables as one scrolling element: 12,379 people-group pins with the real Scripture, film and Bible-story links for each group's own language, above every resource with its URL and the 1,613 groups where nothing was found, exportable as CSV.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -742,11 +774,12 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/gospel-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "resources-list",
|
||||
"stage": "experimental",
|
||||
"file": "resources-list.vue",
|
||||
"description": "Which people groups have Scripture in their own language and which have none, zero-resource languages first, with every link the verification pass proved and Open Bible Stories labelled as stories rather than as Scripture.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -756,11 +789,12 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "resources-map",
|
||||
"stage": "experimental",
|
||||
"file": "resources-map.vue",
|
||||
"description": "12,379 people-group pins over a country choropleth: tap a pin for the Scripture, audio, film, Bible-story and training links that exist in that group's own language with real URLs, tap a country for every group in it, search by group, language or ISO 639-3 code, and filter to the groups where nothing was found.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -770,7 +804,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -779,7 +813,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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv",
|
||||
"integrity": "sha384-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR",
|
||||
"elements": [
|
||||
"my-upg-100-list-map"
|
||||
],
|
||||
|
|
@ -787,9 +821,11 @@
|
|||
"my-upg-100-list/upg-100-list",
|
||||
"my-upg-100-list/poster-wall"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "poster-wall",
|
||||
"stage": "experimental",
|
||||
"file": "poster-wall.vue",
|
||||
"description": "A wall of printable poster cards, one per 100-list entry, each with a \"Show on map\"",
|
||||
"element": "my-upg-100-list-map",
|
||||
|
|
@ -799,11 +835,12 @@
|
|||
"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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv\" 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-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "upg-100-list",
|
||||
"stage": "experimental",
|
||||
"file": "upg-100-list.vue",
|
||||
"description": "A personal unreached-people-groups list painted as true boundary polygons —",
|
||||
"element": "my-upg-100-list-map",
|
||||
|
|
@ -813,11 +850,12 @@
|
|||
"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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv\" 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-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "upg-100-mfe",
|
||||
"stage": "production",
|
||||
"file": "upg-100-mfe.vue",
|
||||
"description": "The standalone, shareable and embeddable composite of the my-upg-100-list family — it nests the map",
|
||||
"element": "my-upg-100-list-map",
|
||||
|
|
@ -827,7 +865,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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv\" 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-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -836,13 +874,15 @@
|
|||
"bundle": "people-groups-grid",
|
||||
"scriptUrl": "./people-groups-grid/people-groups-grid.js",
|
||||
"output": "dx-maps/people-groups-grid/people-groups-grid.js",
|
||||
"integrity": "sha384-Oop/RQS45fb0cRhvbJzVO1gOIG9esrS7jCXI4Fd6zb41hyZ3M/hHgl4P/mA0aiPh",
|
||||
"integrity": "sha384-MOXIP3z6CfUulsBpfJTVhvT/jkXcC6HbwmMM7JNf1NZ6/kH9KTM7tejKa0yzMYez",
|
||||
"elements": [
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "people-groups-grid",
|
||||
"stage": "experimental",
|
||||
"file": "people-groups-grid.vue",
|
||||
"description": "The people-groups grid as an owned custom element: card list, search and four",
|
||||
"element": "people-groups-grid",
|
||||
|
|
@ -852,7 +892,7 @@
|
|||
"scriptUrl": "./people-groups-grid/people-groups-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./people-groups-grid/people-groups-grid/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=\"./people-groups-grid/people-groups-grid.js\" integrity=\"sha384-Oop/RQS45fb0cRhvbJzVO1gOIG9esrS7jCXI4Fd6zb41hyZ3M/hHgl4P/mA0aiPh\" crossorigin=\"anonymous\"></script>\n<people-groups-grid profile-config='{\"profile\":\"people-groups-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></people-groups-grid>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./people-groups-grid/people-groups-grid.js\" integrity=\"sha384-MOXIP3z6CfUulsBpfJTVhvT/jkXcC6HbwmMM7JNf1NZ6/kH9KTM7tejKa0yzMYez\" crossorigin=\"anonymous\"></script>\n<people-groups-grid profile-config='{\"profile\":\"people-groups-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></people-groups-grid>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -897,7 +937,7 @@
|
|||
"bundle": "plugin-studio",
|
||||
"scriptUrl": "./plugin-studio/plugin-studio.js",
|
||||
"output": "dx-maps/plugin-studio/plugin-studio.js",
|
||||
"integrity": "sha384-Eoi+z+jQODT5YVxDesHF1lQ56Y48rSR0ZFVCcwdqjmI7Lt8WA2426gA4obUhTD9z",
|
||||
"integrity": "sha384-BwYvHZst2Uzb74cHYBGCUBjZ5XZQw7E/WRfRzAj9GNv8YK2bCCsITgPshG5o5Euc",
|
||||
"elements": [
|
||||
"plugin-studio"
|
||||
],
|
||||
|
|
@ -913,9 +953,11 @@
|
|||
"all-people-groups",
|
||||
"research-dashboard"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "plugin-studio",
|
||||
"stage": "experimental",
|
||||
"file": "plugin-studio.vue",
|
||||
"description": "The developer's viewing surface: a sidebar that is the composability ladder",
|
||||
"element": "plugin-studio",
|
||||
|
|
@ -925,7 +967,7 @@
|
|||
"scriptUrl": "./plugin-studio/plugin-studio.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./plugin-studio/plugin-studio/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./plugin-studio/plugin-studio.js\" integrity=\"sha384-Eoi+z+jQODT5YVxDesHF1lQ56Y48rSR0ZFVCcwdqjmI7Lt8WA2426gA4obUhTD9z\" crossorigin=\"anonymous\"></script>\n<plugin-studio profile-config='{\"profile\":\"plugin-studio\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></plugin-studio>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./plugin-studio/plugin-studio.js\" integrity=\"sha384-BwYvHZst2Uzb74cHYBGCUBjZ5XZQw7E/WRfRzAj9GNv8YK2bCCsITgPshG5o5Euc\" crossorigin=\"anonymous\"></script>\n<plugin-studio profile-config='{\"profile\":\"plugin-studio\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></plugin-studio>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -956,9 +998,11 @@
|
|||
"elements": [
|
||||
"pplr-data-maps"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "pplr-data-maps",
|
||||
"stage": "experimental",
|
||||
"file": "pplr-data-maps.vue",
|
||||
"description": "Ten views that let a researcher check the PPLR people-group data by eye",
|
||||
"element": "pplr-data-maps",
|
||||
|
|
@ -978,13 +1022,15 @@
|
|||
"bundle": "prayer-walk-planner",
|
||||
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
|
||||
"output": "dx-maps/prayer-walk-planner/prayer-walk-planner.js",
|
||||
"integrity": "sha384-BiFtHG4M5sViRcXxJJNuTExUk7AlH1w1NVEiq/Oj7utQGYOiPzvciN9benC3PvUv",
|
||||
"integrity": "sha384-zEGH2wLAtRReRGWJJcYWgfxVmjx/cmNBh1HWp9EoO77UdnIdaB+SGDQJ5P1cl7/N",
|
||||
"elements": [
|
||||
"prayer-walk-planner"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "prayer-walk-planner",
|
||||
"stage": "experimental",
|
||||
"file": "prayer-walk-planner.vue",
|
||||
"description": "A simple polygon-drawing tool for planning prayer-walking routes.",
|
||||
"element": "prayer-walk-planner",
|
||||
|
|
@ -994,7 +1040,7 @@
|
|||
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./prayer-walk-planner/prayer-walk-planner/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-BiFtHG4M5sViRcXxJJNuTExUk7AlH1w1NVEiq/Oj7utQGYOiPzvciN9benC3PvUv\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-zEGH2wLAtRReRGWJJcYWgfxVmjx/cmNBh1HWp9EoO77UdnIdaB+SGDQJ5P1cl7/N\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -1003,7 +1049,7 @@
|
|||
"bundle": "regions-dashboard",
|
||||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
|
||||
"integrity": "sha384-VJmkesryYLF+l85H+jKOfIVxU7JgCc1TydzSoSeL/HY5dHff9TgjdLUFmioTDNm4",
|
||||
"integrity": "sha384-1eDNR58rAaDsb6JrGZ0dVkbIyXkkJ8GW6r7DTofNsfEZ0wV4vUE3UX3YZKv8K/i9",
|
||||
"elements": [
|
||||
"regions-dashboard"
|
||||
],
|
||||
|
|
@ -1011,9 +1057,11 @@
|
|||
"regions-dashboard/regions-list",
|
||||
"regions-dashboard/region-dashboards"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "region-dashboards",
|
||||
"stage": "experimental",
|
||||
"file": "region-dashboards.vue",
|
||||
"description": "The dashboard half of the agent's 2-tab Regions element: given a region (or a",
|
||||
"element": "regions-dashboard",
|
||||
|
|
@ -1023,11 +1071,12 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-VJmkesryYLF+l85H+jKOfIVxU7JgCc1TydzSoSeL/HY5dHff9TgjdLUFmioTDNm4\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-1eDNR58rAaDsb6JrGZ0dVkbIyXkkJ8GW6r7DTofNsfEZ0wV4vUE3UX3YZKv8K/i9\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "regions-list",
|
||||
"stage": "experimental",
|
||||
"file": "regions-list.vue",
|
||||
"description": "A refactor of DX-life's /regions index page (app/pages/regions/index.vue) into",
|
||||
"element": "regions-dashboard",
|
||||
|
|
@ -1037,11 +1086,12 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-VJmkesryYLF+l85H+jKOfIVxU7JgCc1TydzSoSeL/HY5dHff9TgjdLUFmioTDNm4\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-1eDNR58rAaDsb6JrGZ0dVkbIyXkkJ8GW6r7DTofNsfEZ0wV4vUE3UX3YZKv8K/i9\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "regions-mfe",
|
||||
"stage": "production",
|
||||
"file": "regions-mfe.vue",
|
||||
"description": "The composite the agent asked for: ONE element carrying the SELECT VIEW switcher",
|
||||
"element": "regions-dashboard",
|
||||
|
|
@ -1051,7 +1101,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-VJmkesryYLF+l85H+jKOfIVxU7JgCc1TydzSoSeL/HY5dHff9TgjdLUFmioTDNm4\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-1eDNR58rAaDsb6JrGZ0dVkbIyXkkJ8GW6r7DTofNsfEZ0wV4vUE3UX3YZKv8K/i9\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -1060,13 +1110,15 @@
|
|||
"bundle": "research-dashboard",
|
||||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"output": "dx-maps/research-dashboard/research-dashboard.js",
|
||||
"integrity": "sha384-PakvTvEIhg2eXG7SISNAW5wI9Qi3Y69svd5hIdP653GrXCPJr32vfOCajdiD/iKe",
|
||||
"integrity": "sha384-JYghOGV51SeovZ7ORDz/EeezZuiDXGXZNCkuaakEzxCj1qjx/caxzVJ9BvbnDBm4",
|
||||
"elements": [
|
||||
"research-dashboard-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "research-dashboard",
|
||||
"stage": "experimental",
|
||||
"file": "research-dashboard.vue",
|
||||
"description": "Coordinated-Multiple-Views research dashboard for 10/40-window UPGs (live pray.doxa.life): docked facet rail + map-as-hero + linked table/charts, brushing-and-linking over one in-memory store.",
|
||||
"element": "research-dashboard-map",
|
||||
|
|
@ -1076,7 +1128,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-PakvTvEIhg2eXG7SISNAW5wI9Qi3Y69svd5hIdP653GrXCPJr32vfOCajdiD/iKe\" 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-JYghOGV51SeovZ7ORDz/EeezZuiDXGXZNCkuaakEzxCj1qjx/caxzVJ9BvbnDBm4\" 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"
|
||||
}
|
||||
|
|
@ -1094,9 +1146,11 @@
|
|||
"doxa-research-map",
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "research-map-plus-grid",
|
||||
"stage": "production",
|
||||
"file": "research-map-plus-grid.vue",
|
||||
"description": "The monolithic 7-tab research map (cap-3) on top, the People Groups grid beneath,",
|
||||
"element": "research-map-plus-grid",
|
||||
|
|
@ -1138,9 +1192,11 @@
|
|||
"research-dashboard-map",
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "stack-demo",
|
||||
"stage": "experimental",
|
||||
"file": "stack-demo.vue",
|
||||
"description": "Groups TWO independent elements TOP-TO-BOTTOM so you can embed the pair on a page and",
|
||||
"element": "stack-demo",
|
||||
|
|
@ -1178,9 +1234,11 @@
|
|||
"elements": [
|
||||
"upg-neighbor"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "upg-neighbor",
|
||||
"stage": "experimental",
|
||||
"file": "upg-neighbor.vue",
|
||||
"description": "Who goes to whom: reached neighbors matched to unreached people groups, five lenses",
|
||||
"element": "upg-neighbor",
|
||||
|
|
@ -1277,9 +1335,11 @@
|
|||
"elements": [
|
||||
"wall-of-people-groups"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "wall-of-people-groups",
|
||||
"stage": "experimental",
|
||||
"file": "wall-of-people-groups.vue",
|
||||
"description": "Every Doxa people group as a card on one zoomable prayer wall",
|
||||
"element": "wall-of-people-groups",
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -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-fCobW4BrwyvEO6WLLTAFrV1Ohg5OygfMFhQ74BfNZKfrAeHWZtLPfADZn8MAh+yW" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-research-map.js" integrity="sha384-/5asCKYoeHrVbqSB41IDuMyBT4g/wxpSNNjX07jIZeupvvH9jhL9Bhx7vzjFort+" 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-fCobW4BrwyvEO6WLLTAFrV1Ohg5OygfMFhQ74BfNZKfrAeHWZtLPfADZn8MAh+yW" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-research-map.js" integrity="sha384-/5asCKYoeHrVbqSB41IDuMyBT4g/wxpSNNjX07jIZeupvvH9jhL9Bhx7vzjFort+" 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-Kf975BxLFGhgM+2N07E8/R+Vt1m5eXBCKYw9P7DO2ZeXPv5sLjuumAHF222hUla8" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-QOW8iK3rEQ/kEvfEGkDHDh7yus55b/r2uPyTE9YABId+0Hdv1u5spYhGASzeMznt" 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-Kf975BxLFGhgM+2N07E8/R+Vt1m5eXBCKYw9P7DO2ZeXPv5sLjuumAHF222hUla8" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-QOW8iK3rEQ/kEvfEGkDHDh7yus55b/r2uPyTE9YABId+0Hdv1u5spYhGASzeMznt" 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-Kf975BxLFGhgM+2N07E8/R+Vt1m5eXBCKYw9P7DO2ZeXPv5sLjuumAHF222hUla8" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-simple-map.js" integrity="sha384-QOW8iK3rEQ/kEvfEGkDHDh7yus55b/r2uPyTE9YABId+0Hdv1u5spYhGASzeMznt" 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-Kf975BxLFGhgM+2N07E8/R+Vt1m5eXBCKYw9P7DO2ZeXPv5sLjuumAHF222hUla8" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-QOW8iK3rEQ/kEvfEGkDHDh7yus55b/r2uPyTE9YABId+0Hdv1u5spYhGASzeMznt" 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 <gospel-internet-board> custom element. -->
|
||||
<script src="../../gospel-internet.js" integrity="sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg" crossorigin="anonymous"></script>
|
||||
<script src="../../gospel-internet.js" integrity="sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR" 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 <gospel-internet-board> custom element. -->
|
||||
<script src="../gospel-internet.js" integrity="sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-internet.js" integrity="sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR" 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 <gospel-internet-board> custom element. -->
|
||||
<script src="../../gospel-internet.js" integrity="sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg" crossorigin="anonymous"></script>
|
||||
<script src="../../gospel-internet.js" integrity="sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR" 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 <gospel-internet-board> custom element. -->
|
||||
<script src="../../gospel-internet.js" integrity="sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg" crossorigin="anonymous"></script>
|
||||
<script src="../../gospel-internet.js" integrity="sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR" 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 <gospel-internet-board> custom element. -->
|
||||
<script src="../../gospel-internet.js" integrity="sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg" crossorigin="anonymous"></script>
|
||||
<script src="../../gospel-internet.js" integrity="sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR" 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 <gospel-internet-board> custom element. -->
|
||||
<script src="../../gospel-internet.js" integrity="sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg" crossorigin="anonymous"></script>
|
||||
<script src="../../gospel-internet.js" integrity="sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR" 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 <gospel-internet-board> custom element. -->
|
||||
<script src="../../gospel-internet.js" integrity="sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg" crossorigin="anonymous"></script>
|
||||
<script src="../../gospel-internet.js" integrity="sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
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 <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4" 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 <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4" 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 <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
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 <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4" 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 <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -19,6 +19,6 @@
|
|||
</head>
|
||||
<body>
|
||||
<plugin-studio tree-base="."></plugin-studio>
|
||||
<script src="./plugin-studio/plugin-studio.js" integrity="sha384-Eoi+z+jQODT5YVxDesHF1lQ56Y48rSR0ZFVCcwdqjmI7Lt8WA2426gA4obUhTD9z" crossorigin="anonymous"></script>
|
||||
<script src="./plugin-studio/plugin-studio.js" integrity="sha384-BwYvHZst2Uzb74cHYBGCUBjZ5XZQw7E/WRfRzAj9GNv8YK2bCCsITgPshG5o5Euc" crossorigin="anonymous"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -12,13 +12,15 @@
|
|||
"bundle": "all-people-groups",
|
||||
"scriptUrl": "./all-people-groups/all-people-groups.js",
|
||||
"output": "dx-maps/all-people-groups/all-people-groups.js",
|
||||
"integrity": "sha384-X36cKTimDAmKXAxlgtTSJ5O1eow2Bntw3x5oC2XPuwdgrSCgBGl8BbmZwPeQIuJ1",
|
||||
"integrity": "sha384-raSKQH2zs0KO9FeiQno95xDbTKdTbCO0wJDobbrrvNnaAaVNUfkeSU+L4kWADEm9",
|
||||
"elements": [
|
||||
"all-people-groups"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "all-people-groups",
|
||||
"stage": "experimental",
|
||||
"file": "all-people-groups.vue",
|
||||
"description": "All 12,379 people groups (peoplegroups.org) in four colors — reached,",
|
||||
"element": "all-people-groups",
|
||||
|
|
@ -28,7 +30,7 @@
|
|||
"scriptUrl": "./all-people-groups/all-people-groups.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./all-people-groups/all-people-groups/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-X36cKTimDAmKXAxlgtTSJ5O1eow2Bntw3x5oC2XPuwdgrSCgBGl8BbmZwPeQIuJ1\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-raSKQH2zs0KO9FeiQno95xDbTKdTbCO0wJDobbrrvNnaAaVNUfkeSU+L4kWADEm9\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
|
||||
},
|
||||
"bundle": "all-people-groups"
|
||||
}
|
||||
|
|
@ -38,7 +40,7 @@
|
|||
"bundle": "big-picture",
|
||||
"scriptUrl": "./big-picture/big-picture.js",
|
||||
"output": "dx-maps/big-picture/big-picture.js",
|
||||
"integrity": "sha384-0PLnZBlIJMdSAz9YdW4iQz2rVzuXLDHNV7DgzSqQAPj0eSFMs0sb8PT79RQDYHeY",
|
||||
"integrity": "sha384-VoI56FhJLieze4gUEG6DPjj8mnd8HLLPeGqbr9rw65+nxJ0S+cLZtH24dpTENg8n",
|
||||
"elements": [
|
||||
"bp-big-picture",
|
||||
"bp-research-header",
|
||||
|
|
@ -48,9 +50,11 @@
|
|||
"bp-research-header",
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "big-picture",
|
||||
"stage": "experimental",
|
||||
"file": "big-picture.vue",
|
||||
"description": "The Cat-4 composite that PAIRS the two real capability elements of the",
|
||||
"element": "bp-big-picture",
|
||||
|
|
@ -60,7 +64,7 @@
|
|||
"scriptUrl": "./big-picture/big-picture.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./big-picture/big-picture/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=\"./big-picture/big-picture.js\" integrity=\"sha384-0PLnZBlIJMdSAz9YdW4iQz2rVzuXLDHNV7DgzSqQAPj0eSFMs0sb8PT79RQDYHeY\" crossorigin=\"anonymous\"></script>\n<bp-big-picture profile-config='{\"profile\":\"big-picture\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></bp-big-picture>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./big-picture/big-picture.js\" integrity=\"sha384-VoI56FhJLieze4gUEG6DPjj8mnd8HLLPeGqbr9rw65+nxJ0S+cLZtH24dpTENg8n\" crossorigin=\"anonymous\"></script>\n<bp-big-picture profile-config='{\"profile\":\"big-picture\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></bp-big-picture>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -104,13 +108,15 @@
|
|||
"bundle": "cities-internet",
|
||||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"output": "dx-maps/cities-internet/cities-internet.js",
|
||||
"integrity": "sha384-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl",
|
||||
"integrity": "sha384-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT",
|
||||
"elements": [
|
||||
"cities-internet-map"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "connectivity-list",
|
||||
"stage": "experimental",
|
||||
"file": "connectivity-list.vue",
|
||||
"description": "Countries where DX people groups live, grouped by region, showing measured internet penetration",
|
||||
"element": "cities-internet-map",
|
||||
|
|
@ -120,11 +126,12 @@
|
|||
"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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl\" 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-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "connectivity-map",
|
||||
"stage": "production",
|
||||
"file": "connectivity-map.vue",
|
||||
"description": "Every country shaded by measured internet penetration, with its named carriers and dominant",
|
||||
"element": "cities-internet-map",
|
||||
|
|
@ -134,11 +141,12 @@
|
|||
"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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl\" 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-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "data-tables",
|
||||
"stage": "experimental",
|
||||
"file": "data-tables.vue",
|
||||
"description": "Four validated research tables, one tab each, with sortable and filterable columns, CSV and JSON",
|
||||
"element": "cities-internet-map",
|
||||
|
|
@ -148,7 +156,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-+nq6GCAyhJFlTGD+AenO5/OhtPfbNxIexYundFjlZUJECI7Fa3NdVyAnl6ijmBbl\" 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-G+WoMypI6KKiZD0Xl2/kgo/QesHYnPHca6hLJPsDLXINkcb8DGJ7kWnvKEC3+gdT\" 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 +165,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "dx-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN",
|
||||
"integrity": "sha384-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -165,9 +173,11 @@
|
|||
"country-posters/country-poster-wall",
|
||||
"country-posters/countries-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "countries-map",
|
||||
"stage": "experimental",
|
||||
"file": "countries-map.vue",
|
||||
"description": "The researcher's workbench retargeted from people groups to COUNTRIES — region",
|
||||
"element": "country-posters-map",
|
||||
|
|
@ -177,11 +187,12 @@
|
|||
"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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN\" 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-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "country-poster-wall",
|
||||
"stage": "experimental",
|
||||
"file": "country-poster-wall.vue",
|
||||
"description": "One printable card per country, grouped into COLLAPSIBLE regional sections so the",
|
||||
"element": "country-posters-map",
|
||||
|
|
@ -191,11 +202,12 @@
|
|||
"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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN\" 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-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "country-posters-mfe",
|
||||
"stage": "experimental",
|
||||
"file": "country-posters-mfe.vue",
|
||||
"description": "Country Posters as ONE two-tab element — the countries map and the printable",
|
||||
"element": "country-posters-mfe",
|
||||
|
|
@ -205,7 +217,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-qd1dgYkpExev37T81TzsSOLiXz4Ts0FH+efwHF8QBcSWxFQQvbglHa2FiM0yN9uN\" 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-3gJLcsIJuP0fr9lSTVq55NCLgIwdgqVgRs/T1HdgbsW95I/MAaMgIlH3NxcpLxNj\" 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 +226,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-/kZKKn306T0Fd6nAEn8Pq/5DSA9T2iF7aozfGxsych2hDNkIK1wKKLI6LQY+BuwO",
|
||||
"integrity": "sha384-n0wwrzPqkvguUWfD6L7oFkEFpjpT49CadmrtAZC6Ie0dtmVjAYBlrH1rK8YwwrJe",
|
||||
"elements": [
|
||||
"dashboard-plus-grid"
|
||||
],
|
||||
|
|
@ -222,9 +234,11 @@
|
|||
"research-dashboard",
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "dashboard-plus-grid",
|
||||
"stage": "production",
|
||||
"file": "dashboard-plus-grid.vue",
|
||||
"description": "Both children are IMPORTED DIRECTLY (compiled into this ONE bundle — no runtime bundle",
|
||||
"element": "dashboard-plus-grid",
|
||||
|
|
@ -234,7 +248,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-/kZKKn306T0Fd6nAEn8Pq/5DSA9T2iF7aozfGxsych2hDNkIK1wKKLI6LQY+BuwO\" 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-n0wwrzPqkvguUWfD6L7oFkEFpjpT49CadmrtAZC6Ie0dtmVjAYBlrH1rK8YwwrJe\" 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": [
|
||||
{
|
||||
|
|
@ -258,13 +272,15 @@
|
|||
"bundle": "demo-map",
|
||||
"scriptUrl": "./demo-map/demo-map.js",
|
||||
"output": "dx-maps/demo-map/demo-map.js",
|
||||
"integrity": "sha384-5OLSI2MOHUjXFOjqlsdvUY53dISZbT0LKkqtQAmc5N2LEkijcPQ/m+G014KKl05D",
|
||||
"integrity": "sha384-LGarhUQZY8nDdv+kbXK7JQYA1UdId+Q+muZgWKegOEwEGRGrczWe5p0EqbbW9+d/",
|
||||
"elements": [
|
||||
"demo-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "demo-map",
|
||||
"stage": "experimental",
|
||||
"file": "demo-map.vue",
|
||||
"description": "Simple two-tab demo map. Tab 1 colors pins by religion (shared",
|
||||
"element": "demo-map",
|
||||
|
|
@ -274,7 +290,7 @@
|
|||
"scriptUrl": "./demo-map/demo-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./demo-map/demo-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-5OLSI2MOHUjXFOjqlsdvUY53dISZbT0LKkqtQAmc5N2LEkijcPQ/m+G014KKl05D\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></demo-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-LGarhUQZY8nDdv+kbXK7JQYA1UdId+Q+muZgWKegOEwEGRGrczWe5p0EqbbW9+d/\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></demo-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -301,7 +317,7 @@
|
|||
"bundle": "doxa-maps-spa",
|
||||
"scriptUrl": "./doxa-maps-spa/doxa-maps-spa.js",
|
||||
"output": "dx-maps/doxa-maps-spa/doxa-maps-spa.js",
|
||||
"integrity": "sha384-p3mrseluGiP7Uj0HWWEA5IeZcGisLZwSBMxvkcTKROt8Qdlkb4s4NFCZigNWP5dY",
|
||||
"integrity": "sha384-hljZG8f1TGBPN3VJu7CPMg2CSIGlfGVFjmZNydYCZw70GRXYtmqWcapc3zJBYriN",
|
||||
"elements": [
|
||||
"doxa-maps-spa"
|
||||
],
|
||||
|
|
@ -314,9 +330,11 @@
|
|||
"cities-internet/connectivity-map",
|
||||
"gospel-resources/resources-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "doxa-maps-spa",
|
||||
"stage": "experimental",
|
||||
"file": "doxa-maps-spa.vue",
|
||||
"description": "The DX-maps app itself: one element whose vertical-tab rail nests every other",
|
||||
"element": "doxa-maps-spa",
|
||||
|
|
@ -326,7 +344,7 @@
|
|||
"scriptUrl": "./doxa-maps-spa/doxa-maps-spa.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-maps-spa/doxa-maps-spa/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=\"./doxa-maps-spa/doxa-maps-spa.js\" integrity=\"sha384-p3mrseluGiP7Uj0HWWEA5IeZcGisLZwSBMxvkcTKROt8Qdlkb4s4NFCZigNWP5dY\" crossorigin=\"anonymous\"></script>\n<doxa-maps-spa profile-config='{\"profile\":\"doxa-maps-spa\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-maps-spa>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-maps-spa/doxa-maps-spa.js\" integrity=\"sha384-hljZG8f1TGBPN3VJu7CPMg2CSIGlfGVFjmZNydYCZw70GRXYtmqWcapc3zJBYriN\" crossorigin=\"anonymous\"></script>\n<doxa-maps-spa profile-config='{\"profile\":\"doxa-maps-spa\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-maps-spa>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -353,13 +371,15 @@
|
|||
"bundle": "doxa-research-map",
|
||||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
|
||||
"integrity": "sha384-fCobW4BrwyvEO6WLLTAFrV1Ohg5OygfMFhQ74BfNZKfrAeHWZtLPfADZn8MAh+yW",
|
||||
"integrity": "sha384-/5asCKYoeHrVbqSB41IDuMyBT4g/wxpSNNjX07jIZeupvvH9jhL9Bhx7vzjFort+",
|
||||
"elements": [
|
||||
"doxa-research-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "research-map",
|
||||
"stage": "experimental",
|
||||
"file": "research-map.vue",
|
||||
"description": "The researcher's workbench: every piece a missiologist, demographer or",
|
||||
"element": "doxa-research-map",
|
||||
|
|
@ -369,7 +389,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-fCobW4BrwyvEO6WLLTAFrV1Ohg5OygfMFhQ74BfNZKfrAeHWZtLPfADZn8MAh+yW\" 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-/5asCKYoeHrVbqSB41IDuMyBT4g/wxpSNNjX07jIZeupvvH9jhL9Bhx7vzjFort+\" 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,14 +415,16 @@
|
|||
"bundle": "doxa-simple-map",
|
||||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
|
||||
"integrity": "sha384-Kf975BxLFGhgM+2N07E8/R+Vt1m5eXBCKYw9P7DO2ZeXPv5sLjuumAHF222hUla8",
|
||||
"integrity": "sha384-QOW8iK3rEQ/kEvfEGkDHDh7yus55b/r2uPyTE9YABId+0Hdv1u5spYhGASzeMznt",
|
||||
"elements": [
|
||||
"doxa-map",
|
||||
"doxa-simple-map"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "doxa-simple-map",
|
||||
"stage": "production",
|
||||
"file": "doxa-simple-map.vue",
|
||||
"description": "The simple world map, shipped as three presets off ONE prop table —",
|
||||
"element": "doxa-map",
|
||||
|
|
@ -412,7 +434,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-Kf975BxLFGhgM+2N07E8/R+Vt1m5eXBCKYw9P7DO2ZeXPv5sLjuumAHF222hUla8\" 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-QOW8iK3rEQ/kEvfEGkDHDh7yus55b/r2uPyTE9YABId+0Hdv1u5spYhGASzeMznt\" 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": [
|
||||
{
|
||||
|
|
@ -496,9 +518,11 @@
|
|||
"elements": [
|
||||
"doxa-vision-card"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "doxa-vision-card",
|
||||
"stage": "experimental",
|
||||
"file": "doxa-vision-card.vue",
|
||||
"description": "A true funnel of the remaining task, every number computed from data: all people",
|
||||
"element": "doxa-vision-card",
|
||||
|
|
@ -557,9 +581,11 @@
|
|||
"elements": [
|
||||
"golden-path-check"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "golden-path-check",
|
||||
"stage": "experimental",
|
||||
"file": "golden-path-check.vue",
|
||||
"description": "A live self-test of the develop-a-plugin-and-see-it-live path: it reads the built",
|
||||
"element": "golden-path-check",
|
||||
|
|
@ -578,13 +604,15 @@
|
|||
"bundle": "gospel-internet",
|
||||
"scriptUrl": "./gospel-internet/gospel-internet.js",
|
||||
"output": "dx-maps/gospel-internet/gospel-internet.js",
|
||||
"integrity": "sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg",
|
||||
"integrity": "sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR",
|
||||
"elements": [
|
||||
"gospel-internet-board"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "board",
|
||||
"stage": "experimental",
|
||||
"file": "board.vue",
|
||||
"description": "For every remaining people group: what gospel resources exist in a language they use, and how much of their country (or Indian state) is online to receive them.",
|
||||
"element": "gospel-internet-board",
|
||||
|
|
@ -594,7 +622,7 @@
|
|||
"scriptUrl": "./gospel-internet/gospel-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-internet/board/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-internet/gospel-internet.js\" integrity=\"sha384-sxAzwBWTEP+ZkJ9p+KniylXumjhKTApk4vesSX/VVILejGxjwZJZWMLP2ZD1UPXg\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-internet/gospel-internet.js\" integrity=\"sha384-Jk2ATsoGjM7OAtxOiSaSg05qu/CSkltuKvorfuCGuVTi6Clupx266rxSpCJITJaR\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -694,7 +722,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "dx-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z",
|
||||
"integrity": "sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -702,9 +730,11 @@
|
|||
"resources-map",
|
||||
"data-tables"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "charts",
|
||||
"stage": "experimental",
|
||||
"file": "charts.vue",
|
||||
"description": "The gap measured by LANGUAGE (ISO 639-3) rather than by people group, because one translation serves every group that speaks it, so counting by group overstates how much work remains.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -714,11 +744,12 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/charts/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "data-tables",
|
||||
"stage": "experimental",
|
||||
"file": "data-tables.vue",
|
||||
"description": "Eleven tables covering both halves of one question: every gospel resource with its real URL and how much Scripture it is, and the 1,613 people groups where nothing was found with the pools searched recorded per row, plus translation priority, bridge languages, city bridges, the deaf gap and access against population growth.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -728,11 +759,12 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "gospel-dashboard",
|
||||
"stage": "production",
|
||||
"file": "gospel-dashboard.vue",
|
||||
"description": "The gospel map and its tables as one scrolling element: 12,379 people-group pins with the real Scripture, film and Bible-story links for each group's own language, above every resource with its URL and the 1,613 groups where nothing was found, exportable as CSV.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -742,11 +774,12 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/gospel-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "resources-list",
|
||||
"stage": "experimental",
|
||||
"file": "resources-list.vue",
|
||||
"description": "Which people groups have Scripture in their own language and which have none, zero-resource languages first, with every link the verification pass proved and Open Bible Stories labelled as stories rather than as Scripture.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -756,11 +789,12 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "resources-map",
|
||||
"stage": "experimental",
|
||||
"file": "resources-map.vue",
|
||||
"description": "12,379 people-group pins over a country choropleth: tap a pin for the Scripture, audio, film, Bible-story and training links that exist in that group's own language with real URLs, tap a country for every group in it, search by group, language or ISO 639-3 code, and filter to the groups where nothing was found.",
|
||||
"element": "gospel-resources-map",
|
||||
|
|
@ -770,7 +804,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uSo1E3V5lkkvcJe2r23ApD96Z8qgC5UhgOsQw5M8aPyuUqjvcFu0gtJgrXbb3xw4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -779,7 +813,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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv",
|
||||
"integrity": "sha384-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR",
|
||||
"elements": [
|
||||
"my-upg-100-list-map"
|
||||
],
|
||||
|
|
@ -787,9 +821,11 @@
|
|||
"my-upg-100-list/upg-100-list",
|
||||
"my-upg-100-list/poster-wall"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "poster-wall",
|
||||
"stage": "experimental",
|
||||
"file": "poster-wall.vue",
|
||||
"description": "A wall of printable poster cards, one per 100-list entry, each with a \"Show on map\"",
|
||||
"element": "my-upg-100-list-map",
|
||||
|
|
@ -799,11 +835,12 @@
|
|||
"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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv\" 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-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "upg-100-list",
|
||||
"stage": "experimental",
|
||||
"file": "upg-100-list.vue",
|
||||
"description": "A personal unreached-people-groups list painted as true boundary polygons —",
|
||||
"element": "my-upg-100-list-map",
|
||||
|
|
@ -813,11 +850,12 @@
|
|||
"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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv\" 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-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "upg-100-mfe",
|
||||
"stage": "production",
|
||||
"file": "upg-100-mfe.vue",
|
||||
"description": "The standalone, shareable and embeddable composite of the my-upg-100-list family — it nests the map",
|
||||
"element": "my-upg-100-list-map",
|
||||
|
|
@ -827,7 +865,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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv\" 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-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -836,13 +874,15 @@
|
|||
"bundle": "people-groups-grid",
|
||||
"scriptUrl": "./people-groups-grid/people-groups-grid.js",
|
||||
"output": "dx-maps/people-groups-grid/people-groups-grid.js",
|
||||
"integrity": "sha384-Oop/RQS45fb0cRhvbJzVO1gOIG9esrS7jCXI4Fd6zb41hyZ3M/hHgl4P/mA0aiPh",
|
||||
"integrity": "sha384-MOXIP3z6CfUulsBpfJTVhvT/jkXcC6HbwmMM7JNf1NZ6/kH9KTM7tejKa0yzMYez",
|
||||
"elements": [
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "people-groups-grid",
|
||||
"stage": "experimental",
|
||||
"file": "people-groups-grid.vue",
|
||||
"description": "The people-groups grid as an owned custom element: card list, search and four",
|
||||
"element": "people-groups-grid",
|
||||
|
|
@ -852,7 +892,7 @@
|
|||
"scriptUrl": "./people-groups-grid/people-groups-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./people-groups-grid/people-groups-grid/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=\"./people-groups-grid/people-groups-grid.js\" integrity=\"sha384-Oop/RQS45fb0cRhvbJzVO1gOIG9esrS7jCXI4Fd6zb41hyZ3M/hHgl4P/mA0aiPh\" crossorigin=\"anonymous\"></script>\n<people-groups-grid profile-config='{\"profile\":\"people-groups-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></people-groups-grid>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./people-groups-grid/people-groups-grid.js\" integrity=\"sha384-MOXIP3z6CfUulsBpfJTVhvT/jkXcC6HbwmMM7JNf1NZ6/kH9KTM7tejKa0yzMYez\" crossorigin=\"anonymous\"></script>\n<people-groups-grid profile-config='{\"profile\":\"people-groups-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></people-groups-grid>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -897,7 +937,7 @@
|
|||
"bundle": "plugin-studio",
|
||||
"scriptUrl": "./plugin-studio/plugin-studio.js",
|
||||
"output": "dx-maps/plugin-studio/plugin-studio.js",
|
||||
"integrity": "sha384-Eoi+z+jQODT5YVxDesHF1lQ56Y48rSR0ZFVCcwdqjmI7Lt8WA2426gA4obUhTD9z",
|
||||
"integrity": "sha384-BwYvHZst2Uzb74cHYBGCUBjZ5XZQw7E/WRfRzAj9GNv8YK2bCCsITgPshG5o5Euc",
|
||||
"elements": [
|
||||
"plugin-studio"
|
||||
],
|
||||
|
|
@ -913,9 +953,11 @@
|
|||
"all-people-groups",
|
||||
"research-dashboard"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "plugin-studio",
|
||||
"stage": "experimental",
|
||||
"file": "plugin-studio.vue",
|
||||
"description": "The developer's viewing surface: a sidebar that is the composability ladder",
|
||||
"element": "plugin-studio",
|
||||
|
|
@ -925,7 +967,7 @@
|
|||
"scriptUrl": "./plugin-studio/plugin-studio.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./plugin-studio/plugin-studio/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./plugin-studio/plugin-studio.js\" integrity=\"sha384-Eoi+z+jQODT5YVxDesHF1lQ56Y48rSR0ZFVCcwdqjmI7Lt8WA2426gA4obUhTD9z\" crossorigin=\"anonymous\"></script>\n<plugin-studio profile-config='{\"profile\":\"plugin-studio\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></plugin-studio>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./plugin-studio/plugin-studio.js\" integrity=\"sha384-BwYvHZst2Uzb74cHYBGCUBjZ5XZQw7E/WRfRzAj9GNv8YK2bCCsITgPshG5o5Euc\" crossorigin=\"anonymous\"></script>\n<plugin-studio profile-config='{\"profile\":\"plugin-studio\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></plugin-studio>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -956,9 +998,11 @@
|
|||
"elements": [
|
||||
"pplr-data-maps"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "pplr-data-maps",
|
||||
"stage": "experimental",
|
||||
"file": "pplr-data-maps.vue",
|
||||
"description": "Ten views that let a researcher check the PPLR people-group data by eye",
|
||||
"element": "pplr-data-maps",
|
||||
|
|
@ -978,13 +1022,15 @@
|
|||
"bundle": "prayer-walk-planner",
|
||||
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
|
||||
"output": "dx-maps/prayer-walk-planner/prayer-walk-planner.js",
|
||||
"integrity": "sha384-BiFtHG4M5sViRcXxJJNuTExUk7AlH1w1NVEiq/Oj7utQGYOiPzvciN9benC3PvUv",
|
||||
"integrity": "sha384-zEGH2wLAtRReRGWJJcYWgfxVmjx/cmNBh1HWp9EoO77UdnIdaB+SGDQJ5P1cl7/N",
|
||||
"elements": [
|
||||
"prayer-walk-planner"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "prayer-walk-planner",
|
||||
"stage": "experimental",
|
||||
"file": "prayer-walk-planner.vue",
|
||||
"description": "A simple polygon-drawing tool for planning prayer-walking routes.",
|
||||
"element": "prayer-walk-planner",
|
||||
|
|
@ -994,7 +1040,7 @@
|
|||
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./prayer-walk-planner/prayer-walk-planner/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-BiFtHG4M5sViRcXxJJNuTExUk7AlH1w1NVEiq/Oj7utQGYOiPzvciN9benC3PvUv\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-zEGH2wLAtRReRGWJJcYWgfxVmjx/cmNBh1HWp9EoO77UdnIdaB+SGDQJ5P1cl7/N\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -1003,7 +1049,7 @@
|
|||
"bundle": "regions-dashboard",
|
||||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
|
||||
"integrity": "sha384-VJmkesryYLF+l85H+jKOfIVxU7JgCc1TydzSoSeL/HY5dHff9TgjdLUFmioTDNm4",
|
||||
"integrity": "sha384-1eDNR58rAaDsb6JrGZ0dVkbIyXkkJ8GW6r7DTofNsfEZ0wV4vUE3UX3YZKv8K/i9",
|
||||
"elements": [
|
||||
"regions-dashboard"
|
||||
],
|
||||
|
|
@ -1011,9 +1057,11 @@
|
|||
"regions-dashboard/regions-list",
|
||||
"regions-dashboard/region-dashboards"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "region-dashboards",
|
||||
"stage": "experimental",
|
||||
"file": "region-dashboards.vue",
|
||||
"description": "The dashboard half of the agent's 2-tab Regions element: given a region (or a",
|
||||
"element": "regions-dashboard",
|
||||
|
|
@ -1023,11 +1071,12 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-VJmkesryYLF+l85H+jKOfIVxU7JgCc1TydzSoSeL/HY5dHff9TgjdLUFmioTDNm4\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-1eDNR58rAaDsb6JrGZ0dVkbIyXkkJ8GW6r7DTofNsfEZ0wV4vUE3UX3YZKv8K/i9\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "regions-list",
|
||||
"stage": "experimental",
|
||||
"file": "regions-list.vue",
|
||||
"description": "A refactor of DX-life's /regions index page (app/pages/regions/index.vue) into",
|
||||
"element": "regions-dashboard",
|
||||
|
|
@ -1037,11 +1086,12 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-VJmkesryYLF+l85H+jKOfIVxU7JgCc1TydzSoSeL/HY5dHff9TgjdLUFmioTDNm4\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-1eDNR58rAaDsb6JrGZ0dVkbIyXkkJ8GW6r7DTofNsfEZ0wV4vUE3UX3YZKv8K/i9\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "regions-mfe",
|
||||
"stage": "production",
|
||||
"file": "regions-mfe.vue",
|
||||
"description": "The composite the agent asked for: ONE element carrying the SELECT VIEW switcher",
|
||||
"element": "regions-dashboard",
|
||||
|
|
@ -1051,7 +1101,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-VJmkesryYLF+l85H+jKOfIVxU7JgCc1TydzSoSeL/HY5dHff9TgjdLUFmioTDNm4\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-1eDNR58rAaDsb6JrGZ0dVkbIyXkkJ8GW6r7DTofNsfEZ0wV4vUE3UX3YZKv8K/i9\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -1060,13 +1110,15 @@
|
|||
"bundle": "research-dashboard",
|
||||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"output": "dx-maps/research-dashboard/research-dashboard.js",
|
||||
"integrity": "sha384-PakvTvEIhg2eXG7SISNAW5wI9Qi3Y69svd5hIdP653GrXCPJr32vfOCajdiD/iKe",
|
||||
"integrity": "sha384-JYghOGV51SeovZ7ORDz/EeezZuiDXGXZNCkuaakEzxCj1qjx/caxzVJ9BvbnDBm4",
|
||||
"elements": [
|
||||
"research-dashboard-map"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "research-dashboard",
|
||||
"stage": "experimental",
|
||||
"file": "research-dashboard.vue",
|
||||
"description": "Coordinated-Multiple-Views research dashboard for 10/40-window UPGs (live pray.doxa.life): docked facet rail + map-as-hero + linked table/charts, brushing-and-linking over one in-memory store.",
|
||||
"element": "research-dashboard-map",
|
||||
|
|
@ -1076,7 +1128,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-PakvTvEIhg2eXG7SISNAW5wI9Qi3Y69svd5hIdP653GrXCPJr32vfOCajdiD/iKe\" 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-JYghOGV51SeovZ7ORDz/EeezZuiDXGXZNCkuaakEzxCj1qjx/caxzVJ9BvbnDBm4\" 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"
|
||||
}
|
||||
|
|
@ -1094,9 +1146,11 @@
|
|||
"doxa-research-map",
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "production",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "research-map-plus-grid",
|
||||
"stage": "production",
|
||||
"file": "research-map-plus-grid.vue",
|
||||
"description": "The monolithic 7-tab research map (cap-3) on top, the People Groups grid beneath,",
|
||||
"element": "research-map-plus-grid",
|
||||
|
|
@ -1138,9 +1192,11 @@
|
|||
"research-dashboard-map",
|
||||
"people-groups-grid"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "stack-demo",
|
||||
"stage": "experimental",
|
||||
"file": "stack-demo.vue",
|
||||
"description": "Groups TWO independent elements TOP-TO-BOTTOM so you can embed the pair on a page and",
|
||||
"element": "stack-demo",
|
||||
|
|
@ -1178,9 +1234,11 @@
|
|||
"elements": [
|
||||
"upg-neighbor"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "upg-neighbor",
|
||||
"stage": "experimental",
|
||||
"file": "upg-neighbor.vue",
|
||||
"description": "Who goes to whom: reached neighbors matched to unreached people groups, five lenses",
|
||||
"element": "upg-neighbor",
|
||||
|
|
@ -1277,9 +1335,11 @@
|
|||
"elements": [
|
||||
"wall-of-people-groups"
|
||||
],
|
||||
"stage": "experimental",
|
||||
"profiles": [
|
||||
{
|
||||
"profile": "wall-of-people-groups",
|
||||
"stage": "experimental",
|
||||
"file": "wall-of-people-groups.vue",
|
||||
"description": "Every Doxa people group as a card on one zoomable prayer wall",
|
||||
"element": "wall-of-people-groups",
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -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-ftT1h7Nfu838vdPavLGsuWr2gLP02j65Yc38tFvoF1RKWgmntfg+khZhBo5E1bNv" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-/04bUF8Q7JoLXFnmzSxApIdsbAfgEsbR3hc++SeA55O/+eKXIWmI4krHxgAv1omR" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue