Update from source 0d2135425
This commit is contained in:
parent
529bd65af5
commit
8d4866e4d0
24 changed files with 724 additions and 613 deletions
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
// Import Vue functions from NPM package
|
||||
import { ref, computed } from 'vue';
|
||||
import { readSourceFeatures, matchesExpression, resolveExpr } from '../maps/pin-selection.js';
|
||||
|
||||
// Import zoom configuration (region zoom settings are in zoom.js)
|
||||
import { getRegionZoomConfig, REGION_ZOOM_CONFIG } from '../constants/zoom.js';
|
||||
|
|
@ -470,118 +471,6 @@ export function useMapFly(options = {}) {
|
|||
} catch (_) { return false; }
|
||||
}
|
||||
|
||||
// Why: map.querySourceFeatures(sourceId, {filter}) is viewport-clipped —
|
||||
// pins outside the rendered camera are dropped, so legend rows for off-screen
|
||||
// regions silently no-op when the user is zoomed in. We evaluate the Mapbox
|
||||
// filter expression against the full source data instead, so fitBounds can
|
||||
// zoom OUT to a different region or IN to a tight cluster uniformly.
|
||||
function _resolveExpr(expr, props) {
|
||||
if (!Array.isArray(expr)) return expr;
|
||||
const op = expr[0];
|
||||
switch (op) {
|
||||
case 'get': return props?.[expr[1]];
|
||||
case 'literal': return expr[1];
|
||||
case 'has': return props != null && expr[1] in props;
|
||||
case '!has': return props == null || !(expr[1] in props);
|
||||
case '!': return !_resolveExpr(expr[1], props);
|
||||
case 'coalesce': {
|
||||
for (let i = 1; i < expr.length; i++) {
|
||||
const v = _resolveExpr(expr[i], props);
|
||||
if (v != null) return v;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
case 'to-number': {
|
||||
const v = _resolveExpr(expr[1], props);
|
||||
const n = Number(v);
|
||||
if (Number.isFinite(n)) return n;
|
||||
if (expr.length > 2) {
|
||||
const fb = Number(_resolveExpr(expr[2], props));
|
||||
return Number.isFinite(fb) ? fb : 0;
|
||||
}
|
||||
return NaN;
|
||||
}
|
||||
case 'to-string': {
|
||||
const v = _resolveExpr(expr[1], props);
|
||||
return v == null ? '' : String(v);
|
||||
}
|
||||
case 'to-boolean': return Boolean(_resolveExpr(expr[1], props));
|
||||
case 'slice': {
|
||||
const s = _resolveExpr(expr[1], props);
|
||||
const i = _resolveExpr(expr[2], props);
|
||||
const j = expr.length > 3 ? _resolveExpr(expr[3], props) : undefined;
|
||||
if (typeof s !== 'string') return '';
|
||||
return j != null ? s.slice(i, j) : s.slice(i);
|
||||
}
|
||||
default: return expr;
|
||||
}
|
||||
}
|
||||
function _matchesFilter(filter, props) {
|
||||
if (filter === true) return true;
|
||||
if (filter === false) return false;
|
||||
if (!Array.isArray(filter)) return Boolean(filter);
|
||||
const op = filter[0];
|
||||
if (op === 'all') {
|
||||
for (let i = 1; i < filter.length; i++) {
|
||||
if (!_matchesFilter(filter[i], props)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (op === 'any') {
|
||||
for (let i = 1; i < filter.length; i++) {
|
||||
if (_matchesFilter(filter[i], props)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (op === '!') return !_matchesFilter(filter[1], props);
|
||||
if (op === 'has') return props != null && filter[1] in props;
|
||||
if (op === '!has') return props == null || !(filter[1] in props);
|
||||
|
||||
if (op === '==' || op === '!=' || op === '>' || op === '>=' ||
|
||||
op === '<' || op === '<=') {
|
||||
// Legacy form: ['==', 'propName', value] (no ['get', ...])
|
||||
const left = (typeof filter[1] === 'string')
|
||||
? props?.[filter[1]]
|
||||
: _resolveExpr(filter[1], props);
|
||||
const right = _resolveExpr(filter[2], props);
|
||||
switch (op) {
|
||||
case '==': return left === right || (left == null && right == null);
|
||||
case '!=': return !(left === right || (left == null && right == null));
|
||||
case '>': return left > right;
|
||||
case '>=': return left >= right;
|
||||
case '<': return left < right;
|
||||
case '<=': return left <= right;
|
||||
}
|
||||
}
|
||||
if (op === 'in') {
|
||||
const v = _resolveExpr(filter[1], props);
|
||||
const haystack = _resolveExpr(filter[2], props);
|
||||
if (Array.isArray(haystack)) return haystack.includes(v);
|
||||
if (typeof haystack === 'string') return haystack.includes(v);
|
||||
return false;
|
||||
}
|
||||
if (op === 'match') {
|
||||
const input = _resolveExpr(filter[1], props);
|
||||
const lastIdx = filter.length - 1;
|
||||
for (let i = 2; i < lastIdx; i += 2) {
|
||||
const labelRaw = filter[i];
|
||||
const labels = Array.isArray(labelRaw) ? labelRaw : [labelRaw];
|
||||
if (labels.includes(input)) return Boolean(_resolveExpr(filter[i + 1], props));
|
||||
}
|
||||
return Boolean(_resolveExpr(filter[lastIdx], props));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function _readSourceFeatures(map, sourceId) {
|
||||
const src = map.getSource(sourceId);
|
||||
if (!src) return [];
|
||||
const data = src._data ?? src.serialize?.()?.data;
|
||||
if (!data) return [];
|
||||
if (Array.isArray(data?.features)) return data.features;
|
||||
if (data?.type === 'Feature') return [data];
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* zoomToLegendRow — uniform "click a legend row, fit the scope it represents."
|
||||
*
|
||||
|
|
@ -613,7 +502,7 @@ export function useMapFly(options = {}) {
|
|||
// OUT to fit a few scattered pins. Fit the polygon directly instead, so
|
||||
// "click Oceania" zooms TO Oceania.
|
||||
if (opts.regionPolygonSource && map.getSource(opts.regionPolygonSource)) {
|
||||
const polyFeatures = _readSourceFeatures(map, opts.regionPolygonSource);
|
||||
const polyFeatures = readSourceFeatures(map, opts.regionPolygonSource);
|
||||
const regionKey = row.id ?? row.label;
|
||||
const match = polyFeatures.find(f => {
|
||||
const p = f?.properties || {};
|
||||
|
|
@ -665,7 +554,7 @@ export function useMapFly(options = {}) {
|
|||
const filter = opts.matchExpr ?? row.filter;
|
||||
if (!filter) return;
|
||||
|
||||
const allFeatures = _readSourceFeatures(map, sourceId);
|
||||
const allFeatures = readSourceFeatures(map, sourceId);
|
||||
if (!allFeatures.length) return;
|
||||
|
||||
const lngs = [];
|
||||
|
|
@ -675,7 +564,7 @@ export function useMapFly(options = {}) {
|
|||
const seen = new Set();
|
||||
for (const f of allFeatures) {
|
||||
const props = f?.properties;
|
||||
if (!_matchesFilter(filter, props)) continue;
|
||||
if (!matchesExpression(filter, props)) continue;
|
||||
const id = props?.uniqueId;
|
||||
if (id != null) {
|
||||
if (seen.has(id)) continue;
|
||||
|
|
|
|||
159
library/maps/pin-selection.js
Normal file
159
library/maps/pin-selection.js
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
/**
|
||||
* pin-selection.js — which pins does a Mapbox/MapLibre filter expression actually select?
|
||||
*
|
||||
* ★ MOVED, NOT WRITTEN (from useMapFly.js, where it was private). zoomToLegendRow has always had to
|
||||
* answer this question to fit the camera to a legend row, and it answers it the only way that is
|
||||
* correct: map.querySourceFeatures(id, {filter}) is VIEWPORT-CLIPPED, so pins outside the camera are
|
||||
* dropped and an off-screen region silently selects nothing. These read the full source data and
|
||||
* evaluate the expression in JS instead.
|
||||
*
|
||||
* ★ WHY IT HAD TO BE SHARED (PACKETSEL). The research map's prayer packet printed the first 50 of
|
||||
* every people group whatever the reader had selected. Choosing the right rows means asking exactly
|
||||
* this question — and the naive alternative, evaluating the filter against the raw data rows, is
|
||||
* WRONG in a way that would not throw: pin properties are DERIVED from rows (useMapLayers derives
|
||||
* languageFamily when the API returns null, canonicalizes doxaRegion onto the palette's key forms),
|
||||
* so a filter written against pin properties does not mean the same thing applied to a row. The
|
||||
* features the map holds are the only place those two vocabularies agree.
|
||||
*
|
||||
* country-posters prints the same kind of packet from the same kind of selection, which is why this
|
||||
* is in library/ rather than in one plugin.
|
||||
*
|
||||
* The evaluator covers the expression subset this product's filters use — all/any/!/has/comparisons/
|
||||
* in/match, plus get/literal/coalesce/to-number. Anything else evaluates false rather than throwing:
|
||||
* a packet that prints fewer rows is recoverable, a map that throws mid-print is not.
|
||||
*/
|
||||
|
||||
// Why: map.querySourceFeatures(sourceId, {filter}) is viewport-clipped —
|
||||
// pins outside the rendered camera are dropped, so legend rows for off-screen
|
||||
// regions silently no-op when the user is zoomed in. We evaluate the Mapbox
|
||||
// filter expression against the full source data instead, so fitBounds can
|
||||
// zoom OUT to a different region or IN to a tight cluster uniformly.
|
||||
export function resolveExpr(expr, props) {
|
||||
if (!Array.isArray(expr)) return expr;
|
||||
const op = expr[0];
|
||||
switch (op) {
|
||||
case 'get': return props?.[expr[1]];
|
||||
case 'literal': return expr[1];
|
||||
case 'has': return props != null && expr[1] in props;
|
||||
case '!has': return props == null || !(expr[1] in props);
|
||||
case '!': return !resolveExpr(expr[1], props);
|
||||
case 'coalesce': {
|
||||
for (let i = 1; i < expr.length; i++) {
|
||||
const v = resolveExpr(expr[i], props);
|
||||
if (v != null) return v;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
case 'to-number': {
|
||||
const v = resolveExpr(expr[1], props);
|
||||
const n = Number(v);
|
||||
if (Number.isFinite(n)) return n;
|
||||
if (expr.length > 2) {
|
||||
const fb = Number(resolveExpr(expr[2], props));
|
||||
return Number.isFinite(fb) ? fb : 0;
|
||||
}
|
||||
return NaN;
|
||||
}
|
||||
case 'to-string': {
|
||||
const v = resolveExpr(expr[1], props);
|
||||
return v == null ? '' : String(v);
|
||||
}
|
||||
case 'to-boolean': return Boolean(resolveExpr(expr[1], props));
|
||||
case 'slice': {
|
||||
const s = resolveExpr(expr[1], props);
|
||||
const i = resolveExpr(expr[2], props);
|
||||
const j = expr.length > 3 ? resolveExpr(expr[3], props) : undefined;
|
||||
if (typeof s !== 'string') return '';
|
||||
return j != null ? s.slice(i, j) : s.slice(i);
|
||||
}
|
||||
default: return expr;
|
||||
}
|
||||
}
|
||||
export function matchesExpression(filter, props) {
|
||||
if (filter === true) return true;
|
||||
if (filter === false) return false;
|
||||
if (!Array.isArray(filter)) return Boolean(filter);
|
||||
const op = filter[0];
|
||||
if (op === 'all') {
|
||||
for (let i = 1; i < filter.length; i++) {
|
||||
if (!matchesExpression(filter[i], props)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (op === 'any') {
|
||||
for (let i = 1; i < filter.length; i++) {
|
||||
if (matchesExpression(filter[i], props)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (op === '!') return !matchesExpression(filter[1], props);
|
||||
if (op === 'has') return props != null && filter[1] in props;
|
||||
if (op === '!has') return props == null || !(filter[1] in props);
|
||||
|
||||
if (op === '==' || op === '!=' || op === '>' || op === '>=' ||
|
||||
op === '<' || op === '<=') {
|
||||
// Legacy form: ['==', 'propName', value] (no ['get', ...])
|
||||
const left = (typeof filter[1] === 'string')
|
||||
? props?.[filter[1]]
|
||||
: resolveExpr(filter[1], props);
|
||||
const right = resolveExpr(filter[2], props);
|
||||
switch (op) {
|
||||
case '==': return left === right || (left == null && right == null);
|
||||
case '!=': return !(left === right || (left == null && right == null));
|
||||
case '>': return left > right;
|
||||
case '>=': return left >= right;
|
||||
case '<': return left < right;
|
||||
case '<=': return left <= right;
|
||||
}
|
||||
}
|
||||
if (op === 'in') {
|
||||
const v = resolveExpr(filter[1], props);
|
||||
const haystack = resolveExpr(filter[2], props);
|
||||
if (Array.isArray(haystack)) return haystack.includes(v);
|
||||
if (typeof haystack === 'string') return haystack.includes(v);
|
||||
return false;
|
||||
}
|
||||
if (op === 'match') {
|
||||
const input = resolveExpr(filter[1], props);
|
||||
const lastIdx = filter.length - 1;
|
||||
for (let i = 2; i < lastIdx; i += 2) {
|
||||
const labelRaw = filter[i];
|
||||
const labels = Array.isArray(labelRaw) ? labelRaw : [labelRaw];
|
||||
if (labels.includes(input)) return Boolean(resolveExpr(filter[i + 1], props));
|
||||
}
|
||||
return Boolean(resolveExpr(filter[lastIdx], props));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
export function readSourceFeatures(map, sourceId) {
|
||||
const src = map.getSource(sourceId);
|
||||
if (!src) return [];
|
||||
const data = src._data ?? src.serialize?.()?.data;
|
||||
if (!data) return [];
|
||||
if (Array.isArray(data?.features)) return data.features;
|
||||
if (data?.type === 'Feature') return [data];
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* The ids of the pins a set of expressions currently selects, as a Set of strings.
|
||||
*
|
||||
* Every expression must match (they are ANDed) because they describe different halves of the same
|
||||
* question: the layer's own filter says which pins RENDER, and a dim expression says which of those
|
||||
* are lit. A pin at opacity 0 is not what the reader is looking at.
|
||||
*
|
||||
* With NO active expressions this returns every pin's id rather than an empty set — "nothing is
|
||||
* selected" means everything is on screen, not nothing is.
|
||||
*/
|
||||
export function selectedPinIds(map, { sourceId = 'language-families', expressions = [], idKey = 'uniqueId' } = {}) {
|
||||
const ids = new Set()
|
||||
const exprs = (expressions || []).filter((e) => e != null && e !== true)
|
||||
for (const f of readSourceFeatures(map, sourceId)) {
|
||||
const props = f && f.properties
|
||||
if (!props) continue
|
||||
if (exprs.length && !exprs.every((e) => matchesExpression(e, props))) continue
|
||||
const id = props[idKey]
|
||||
if (id != null) ids.add(String(id))
|
||||
}
|
||||
return ids
|
||||
}
|
||||
|
|
@ -81,11 +81,6 @@ import { useGeocoderSearch } from '@map/composables/useGeocoderSearch.js'
|
|||
// the import until that happens — see `openPoster()` below.
|
||||
let _posterPromise = null
|
||||
|
||||
// PERF: useMapPacket builds a multi-page PDF (map page + one detail card per
|
||||
// people group). It reuses useMapPoster's pipeline, so it's at least as heavy.
|
||||
// EXPERIMENTAL: dormant behind the shared kill-switch — only fires from the
|
||||
// SemanticTreeLegend Export → Packet menu item. Lazy-loaded once via openPacket().
|
||||
let _packetPromise = null
|
||||
|
||||
// ── Geocoder search logic moved to @map/composables/useGeocoderSearch.js ──────
|
||||
// The geocoder-clear guard (_geoBeingCleared + clearGeocoderProgrammatic) and the
|
||||
|
|
@ -1240,52 +1235,95 @@ function onExport(kind) {
|
|||
if (kind === 'packet') return openPacket()
|
||||
}
|
||||
|
||||
// ─── Packet export (multi-page PDF: map + one card per people group) ─────────
|
||||
// PERF: useMapPacket reuses useMapPoster's render pipeline — heavy. Lazy-load
|
||||
// once, mirroring loadPoster()/_posterPromise. Defensive throughout: never
|
||||
// throw uncaught into the UI; guard against double-run.
|
||||
// ─── Packet (printed through the shared renderer, like Simple Research's) ─────
|
||||
// Defensive throughout: never throw uncaught into the UI; guard against double-run.
|
||||
let _packetBusy = false
|
||||
function _downloadBlob(blob, filename) {
|
||||
const url = URL.createObjectURL(blob)
|
||||
const a = document.createElement('a')
|
||||
a.href = url
|
||||
a.download = filename
|
||||
document.body.appendChild(a)
|
||||
a.click()
|
||||
a.remove()
|
||||
setTimeout(() => URL.revokeObjectURL(url), 1000)
|
||||
}
|
||||
async function openPacket() {
|
||||
if (_packetBusy) return
|
||||
_packetBusy = true
|
||||
try {
|
||||
if (!_packetPromise) {
|
||||
_packetPromise = import('@map/composables/useMapPacket.js')
|
||||
.then(m => m.useMapPacket(() => map.value))
|
||||
}
|
||||
const packet = await _packetPromise
|
||||
// ★ THE PACKET PRINTS, AND IT PRINTS THROUGH THE SHARED RENDERER (the agent-lens audit card 2, and
|
||||
// the agent's own rule: an export button opens the print dialog, never hands over a file). This
|
||||
// built a jsPDF document and downloaded packet.pdf while its poster sibling, two functions up,
|
||||
// already printed. The fix is NOT to wrap that PDF in a dialog — a PDF blob cannot go in the
|
||||
// <img> the in-place print frame uses, and every workaround (embed, object, the browser's own
|
||||
// viewer) prints on some engines and silently does nothing on others, which is the dead-button
|
||||
// class this file has already paid for twice.
|
||||
//
|
||||
// library/composables/usePosterPrints.js ALREADY has printPacket: the same pages, authored as HTML
|
||||
// with @page rules, printed in place. This map was running a private second implementation of a
|
||||
// shared product feature. Routing to it deletes the duplicate, drops jspdf from this bundle, and
|
||||
// the packet gains the pages the shared renderer has that the local one never did (the life
|
||||
// calendar, the funnel, the prayer wheel — see packet-render.buildPacket's page order).
|
||||
const [{ usePosterPrints }, { defaultPosterSpec }, { useMapPoster }] = await Promise.all([
|
||||
import('@map/composables/usePosterPrints.js'),
|
||||
import('@map/constants/posterDefaults.js'),
|
||||
import('@map/composables/poster/useMapPoster.js'),
|
||||
])
|
||||
|
||||
// Gather the people groups for the current selection. No reliable
|
||||
// descendant filter exists across all tabs, so use the currently
|
||||
// normalized groups. CAP at 50 for overnight safety.
|
||||
// Same 50-group cap as before: an overnight safety limit, not a design choice.
|
||||
let groups = mapData.normalizedPeopleGroups.value || []
|
||||
if (groups.length > 50) {
|
||||
console.warn(`[research-map] packet export truncated ${groups.length} → 50 people groups`)
|
||||
console.warn(`[country-posters] packet export truncated ${groups.length} → 50 people groups`)
|
||||
groups = groups.slice(0, 50)
|
||||
}
|
||||
|
||||
const { defaultPosterSpec } = await import('@map/constants/posterDefaults.js')
|
||||
// ★ AN EXPLICIT ADAPTER, because the two halves name the same fields differently and a mismatch
|
||||
// here is SILENT — the packet would print with blank names and empty photos rather than failing.
|
||||
// The renderer reads slug / name / population / religion / country_code, and usePosterPrints reads
|
||||
// image_url; this map's normalized rows carry country and imageUrl in camelCase. Mapped once, here,
|
||||
// where the difference is visible, rather than renaming either side's vocabulary.
|
||||
const records = groups.map((g) => ({
|
||||
slug: String(g.slug || g.uniqueId || g.id || ''),
|
||||
name: g.name,
|
||||
population: g.population,
|
||||
// ★ THE DISPLAY NAME, NOT THE CODE, and the order is the whole point. The card prints these two
|
||||
// straight into the page — flat(g.religion) and flat(g.country_code) — so they are read by a
|
||||
// person, not matched by a machine. DataSourceManager normalizes `religion` to the CODE and puts
|
||||
// the readable form in `religionName` (it does the same for country: countryIso is the code,
|
||||
// countryName the label). Reading religion first would have printed MSN under a people group's
|
||||
// name, and the field name country_code invites exactly that mistake on the country line.
|
||||
// Checked against the normalizer rather than guessed: library/api/DataSourceManager.js:357-358.
|
||||
religion: g.religionName || g.religionLabel || g.religion || '',
|
||||
country_code: g.countryName || g.countryIsoLabel || g.country || g.countryIso || '',
|
||||
image_url: g.imageUrl || g.image_url || '',
|
||||
}))
|
||||
|
||||
// Page 1 keeps the LIVE map rather than a fetched poster: this half is the one that knows what is
|
||||
// currently on screen. The shared renderer interpolates `mapSvg` as raw markup, so the PNG this map
|
||||
// already knows how to produce rides in as an <img> — a data URL, because the print frame is a
|
||||
// separate document and an object URL created here would be revoked out from under it.
|
||||
const spec = defaultPosterSpec({ widthIn: 8.27, heightIn: 11.69, dpi: 150, orientation: 'portrait' })
|
||||
spec.slots.title = { ...spec.slots.title, text: legendTitle.value || 'Doxa Map' }
|
||||
spec.slots.legend = { ...spec.slots.legend, rows: legend?.rows?.value || [] }
|
||||
let mapSvg = ''
|
||||
try {
|
||||
const mapBlob = await useMapPoster(() => map.value).render(spec, 'png')
|
||||
const dataUrl = await new Promise((resolve, reject) => {
|
||||
const r = new FileReader()
|
||||
r.onload = () => resolve(String(r.result))
|
||||
r.onerror = reject
|
||||
r.readAsDataURL(mapBlob)
|
||||
})
|
||||
mapSvg = `<img src="${dataUrl}" alt="" style="width:100%;height:100%;object-fit:contain">`
|
||||
} catch (e) {
|
||||
// A cover without the map beats no packet — the same call the shared composable documents.
|
||||
console.warn('[country-posters] packet map page skipped:', e?.message || e)
|
||||
}
|
||||
|
||||
const blob = await packet.renderPacket(spec, groups, {
|
||||
source: 'pray.doxa.life',
|
||||
date: new Date().toISOString().slice(0, 10),
|
||||
const zone = {
|
||||
id: String(activeTab.value?.id || 'research-map'),
|
||||
label: legendTitle.value || tabLabel(activeTab.value) || 'Doxa Map',
|
||||
zoneKey: String(activeTab.value?.id || 'research-map'),
|
||||
}
|
||||
const prints = usePosterPrints({
|
||||
records: () => records,
|
||||
lang: () => String(uiLocale.value || 'en').split('-')[0],
|
||||
label: () => zone.label,
|
||||
})
|
||||
_downloadBlob(blob, 'packet.pdf')
|
||||
await prints.printPacket(zone, { mapSvg })
|
||||
} catch (err) {
|
||||
console.error('[research-map] packet export failed:', err)
|
||||
console.error('[country-posters] packet export failed:', err)
|
||||
} finally {
|
||||
_packetBusy = false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* country-posters-mfe.vue — Country Posters as a TWO-TAB element.
|
||||
*
|
||||
* @element country-posters-mfe
|
||||
* @element country-posters-map
|
||||
* @description Country Posters as ONE two-tab element — the countries map and the printable
|
||||
* poster wall behind a single view switcher, structured like the UPG-100 list. The switcher is
|
||||
* the library's shared ViewSelect, not a third hand-rolled copy.
|
||||
|
|
|
|||
|
|
@ -1405,16 +1405,40 @@ async function openPacket() {
|
|||
// shared product feature. Routing to it deletes the duplicate, drops jspdf from this bundle, and
|
||||
// the packet gains the pages the shared renderer has that the local one never did (the life
|
||||
// calendar, the funnel, the prayer wheel — see packet-render.buildPacket's page order).
|
||||
const [{ usePosterPrints }, { defaultPosterSpec }, { useMapPoster }] = await Promise.all([
|
||||
const [{ usePosterPrints }, { defaultPosterSpec }, { useMapPoster }, { selectedPinIds }] = await Promise.all([
|
||||
import('@map/composables/usePosterPrints.js'),
|
||||
import('@map/constants/posterDefaults.js'),
|
||||
import('@map/composables/poster/useMapPoster.js'),
|
||||
import('@map/maps/pin-selection.js'),
|
||||
])
|
||||
|
||||
// Same 50-group cap as before: an overnight safety limit, not a design choice.
|
||||
let groups = mapData.normalizedPeopleGroups.value || []
|
||||
// ★ THE PACKET PRINTS WHAT THE READER IS LOOKING AT (PACKETSEL). It printed the first 50 of every
|
||||
// people group whatever was selected — a reader who had narrowed the map to one language family
|
||||
// got a packet about somebody else. The rows now come from the pins currently SELECTED: the
|
||||
// layer's own filter says which pins render, `_pinMatchExpr` says which of those are lit (the
|
||||
// affinity tab dims rather than filters), and a pin at opacity 0 is not what the reader sees.
|
||||
//
|
||||
// Asked of the MAP's features, not of the rows, and that distinction is the whole reason this
|
||||
// lives in library/maps/pin-selection.js: pin properties are DERIVED from rows — useMapLayers
|
||||
// fills languageFamily in when the API returns null and canonicalizes doxaRegion onto the
|
||||
// palette's key forms — so evaluating a pin filter against a raw row is wrong in a way that never
|
||||
// throws. The features the map holds are where the two vocabularies agree.
|
||||
const all = mapData.normalizedPeopleGroups.value || []
|
||||
const active = [map.value?.getFilter?.('language-family-pins') || null, _pinMatchExpr].filter(Boolean)
|
||||
let groups = all
|
||||
if (active.length) {
|
||||
const ids = selectedPinIds(map.value, { expressions: active })
|
||||
const picked = all.filter((g) => ids.has(String(g.uniqueId ?? g.id ?? '')))
|
||||
// A selection that matches no ROW is an id mismatch, not an empty selection — print the whole
|
||||
// list rather than silently shipping a packet about nothing, and say so.
|
||||
if (picked.length) groups = picked
|
||||
else console.warn(`[research-map] packet: ${ids.size} pin(s) selected but no rows matched; printing the full list`)
|
||||
}
|
||||
// The cap is an overnight safety limit, not a design choice — so when it bites, the packet says so
|
||||
// on its cover rather than quietly being a different packet than the reader asked for.
|
||||
const selectedTotal = groups.length
|
||||
if (groups.length > 50) {
|
||||
console.warn(`[research-map] packet export truncated ${groups.length} → 50 people groups`)
|
||||
console.warn(`[research-map] packet truncated ${groups.length} → 50 people groups`)
|
||||
groups = groups.slice(0, 50)
|
||||
}
|
||||
|
||||
|
|
@ -1461,9 +1485,10 @@ async function openPacket() {
|
|||
console.warn('[research-map] packet map page skipped:', e?.message || e)
|
||||
}
|
||||
|
||||
const baseLabel = legendTitle.value || tabLabel(activeTab.value) || 'Doxa Map'
|
||||
const zone = {
|
||||
id: String(activeTab.value?.id || 'research-map'),
|
||||
label: legendTitle.value || tabLabel(activeTab.value) || 'Doxa Map',
|
||||
label: selectedTotal > groups.length ? `${baseLabel} — ${groups.length} of ${selectedTotal}` : baseLabel,
|
||||
zoneKey: String(activeTab.value?.id || 'research-map'),
|
||||
}
|
||||
const prints = usePosterPrints({
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
|
||||
<script src="../country-posters.js" integrity="sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
|
||||
<script src="../country-posters.js" integrity="sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
|
||||
<script src="../country-posters.js" integrity="sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <dashboard-plus-grid> custom element. -->
|
||||
<script src="../../dashboard-plus-grid.js" integrity="sha384-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL" crossorigin="anonymous"></script>
|
||||
<script src="../../dashboard-plus-grid.js" integrity="sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <dashboard-plus-grid> custom element. -->
|
||||
<script src="../dashboard-plus-grid.js" integrity="sha384-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL" crossorigin="anonymous"></script>
|
||||
<script src="../dashboard-plus-grid.js" integrity="sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "dx-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp",
|
||||
"integrity": "sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -189,7 +189,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -204,7 +204,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -213,14 +213,14 @@
|
|||
"label": "Country Posters — Wall + Map",
|
||||
"file": "country-posters-mfe.vue",
|
||||
"description": "Country Posters as ONE two-tab element — the countries map and the printable",
|
||||
"element": "country-posters-mfe",
|
||||
"element": "country-posters-map",
|
||||
"type": "nested-elements-mfe",
|
||||
"isMap": true,
|
||||
"iframeUrl": "./country-posters/country-posters-mfe/index.html",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -229,7 +229,7 @@
|
|||
"bundle": "dashboard-plus-grid",
|
||||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"integrity": "sha384-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL",
|
||||
"integrity": "sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee",
|
||||
"elements": [
|
||||
"dashboard-plus-grid"
|
||||
],
|
||||
|
|
@ -252,7 +252,7 @@
|
|||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -376,7 +376,7 @@
|
|||
"bundle": "doxa-research-map",
|
||||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
|
||||
"integrity": "sha384-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9",
|
||||
"integrity": "sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs",
|
||||
"elements": [
|
||||
"doxa-research-map"
|
||||
],
|
||||
|
|
@ -395,7 +395,7 @@
|
|||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -421,7 +421,7 @@
|
|||
"bundle": "doxa-simple-map",
|
||||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
|
||||
"integrity": "sha384-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ",
|
||||
"integrity": "sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6",
|
||||
"elements": [
|
||||
"doxa-map",
|
||||
"doxa-simple-map"
|
||||
|
|
@ -440,7 +440,7 @@
|
|||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -1134,7 +1134,7 @@
|
|||
"bundle": "research-dashboard",
|
||||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"output": "dx-maps/research-dashboard/research-dashboard.js",
|
||||
"integrity": "sha384-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb",
|
||||
"integrity": "sha384-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP",
|
||||
"elements": [
|
||||
"research-dashboard-map"
|
||||
],
|
||||
|
|
@ -1153,7 +1153,7 @@
|
|||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
|
||||
},
|
||||
"bundle": "research-dashboard"
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <doxa-research-map> custom element. -->
|
||||
<script src="../doxa-research-map.js" integrity="sha384-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-research-map.js" integrity="sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <doxa-research-map> custom element. -->
|
||||
<script src="../../doxa-research-map.js" integrity="sha384-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-research-map.js" integrity="sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
|
||||
<script src="../doxa-simple-map.js" integrity="sha384-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-simple-map.js" integrity="sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "dx-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp",
|
||||
"integrity": "sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -189,7 +189,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -204,7 +204,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -213,14 +213,14 @@
|
|||
"label": "Country Posters — Wall + Map",
|
||||
"file": "country-posters-mfe.vue",
|
||||
"description": "Country Posters as ONE two-tab element — the countries map and the printable",
|
||||
"element": "country-posters-mfe",
|
||||
"element": "country-posters-map",
|
||||
"type": "nested-elements-mfe",
|
||||
"isMap": true,
|
||||
"iframeUrl": "./country-posters/country-posters-mfe/index.html",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-7yTyYcNeni5SYjkH8OrXwPNhdAakKvjCZBLrUAIyFFAiC6S/ytBhxdoGMrD/PQWp\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-toNru0aS5EWD+nQu5sHLNTA4yymbYAGM0bok5vTAqb1wDamtqeFg+qTS0C0ExrTY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -229,7 +229,7 @@
|
|||
"bundle": "dashboard-plus-grid",
|
||||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"integrity": "sha384-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL",
|
||||
"integrity": "sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee",
|
||||
"elements": [
|
||||
"dashboard-plus-grid"
|
||||
],
|
||||
|
|
@ -252,7 +252,7 @@
|
|||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-FQzhqfNjZlviD1WuYSFA3CA59qSufkqg+83V/SQEDM5YHE60UBEWqNfS70HizgrL\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-P15DN0neJhlrI9+vzXDozhY8RZHDsJkVnV3Yxun8ewNUNYFEyCdSETY1vBVu+6ee\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -376,7 +376,7 @@
|
|||
"bundle": "doxa-research-map",
|
||||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
|
||||
"integrity": "sha384-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9",
|
||||
"integrity": "sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs",
|
||||
"elements": [
|
||||
"doxa-research-map"
|
||||
],
|
||||
|
|
@ -395,7 +395,7 @@
|
|||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-484w9lFNnAVr+yPbXIGMSP9DZ25gQ9lwdXC5mVig1WKxSTUnVsX0ARlgGZXQuoG9\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-11TPej/kB1nQL0lXCw/gOjTmj/VznycM5fmIfsMNah74SMwH8i+NwFSgbr5zoDZs\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -421,7 +421,7 @@
|
|||
"bundle": "doxa-simple-map",
|
||||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
|
||||
"integrity": "sha384-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ",
|
||||
"integrity": "sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6",
|
||||
"elements": [
|
||||
"doxa-map",
|
||||
"doxa-simple-map"
|
||||
|
|
@ -440,7 +440,7 @@
|
|||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-CyuQnQEO9uPI4s4MMVnl6QoYCVFYgwGiieGnMd/D32fpJ5BE6pehFEaaVwO2j8SQ\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-xEmkBVjwtaQF27UhcRUlECpBkMnINUAlUr18Cm5pxUoY0brWXf6dGloZkHAkFzV6\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -1134,7 +1134,7 @@
|
|||
"bundle": "research-dashboard",
|
||||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"output": "dx-maps/research-dashboard/research-dashboard.js",
|
||||
"integrity": "sha384-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb",
|
||||
"integrity": "sha384-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP",
|
||||
"elements": [
|
||||
"research-dashboard-map"
|
||||
],
|
||||
|
|
@ -1153,7 +1153,7 @@
|
|||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
|
||||
},
|
||||
"bundle": "research-dashboard"
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <research-dashboard-map> custom element. -->
|
||||
<script src="../research-dashboard.js" integrity="sha384-EhyF/2PlMqGj8krWvWTjOw+w1qr9PWlfNOPeQv83s+lbZNs9BE6N1fFo7NenOHCb" crossorigin="anonymous"></script>
|
||||
<script src="../research-dashboard.js" integrity="sha384-pKzBp0mvNR+4Iemm94JhjMNfBbhr9JKDoCtwAgKbjXVl2kLaLhUrqyqZD62FHcVP" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
Loading…
Reference in a new issue