Update from source 1a761741
This commit is contained in:
parent
802d5ed412
commit
225c3b2c2a
120 changed files with 2034 additions and 954 deletions
|
|
@ -28,7 +28,7 @@ and a change here can break other maps.
|
|||
`import … from '@map/components/charts/BarChart.vue'`
|
||||
- **PinHint** — PinHint.vue — the conversion coach-mark (bottom-center of any map).
|
||||
`import … from '@map/components/hints/PinHint.vue'`
|
||||
- **LegendDesktop** — Async-import the heavier branches so the boot bundle stays lean.
|
||||
- **LegendDesktop** — This component's chrome, read out of the catalogue. tStatic and not useI18n: these mount inside
|
||||
`import … from '@map/components/legends/LegendDesktop.vue'`
|
||||
- **LegendMobile** — useShadowStyles(
|
||||
`import … from '@map/components/legends/LegendMobile.vue'`
|
||||
|
|
|
|||
|
|
@ -42,7 +42,8 @@
|
|||
* naming the composite and the knob; both restored, both pass. Removing the zero-request assertion
|
||||
* from the provider case makes it pass on a build that ignores the prop, which is what it is for.
|
||||
*
|
||||
* Exit: 0 pass or SKIP (no built tree, no browser, no baked token to test with) · 1 fail.
|
||||
* Exit: 0 pass (or SKIP: no built tree / no browser) · 1 fail · 75 NOT MEASURED (every case skipped, e.g. no
|
||||
* token: set TEST_MAPBOX_TOKEN).
|
||||
*/
|
||||
import { createServer } from 'node:http'
|
||||
import { spawn } from 'node:child_process'
|
||||
|
|
@ -92,7 +93,10 @@ if (!targets.length) {
|
|||
|
||||
// The token to hand the partner page is the one the tree already bakes into its own leaves: this
|
||||
// gate must not invent a key, and a token that is not this tree's would 401 and look like our bug.
|
||||
const bakedToken = (() => {
|
||||
// The tree bakes no token since the auto engine (the repo ships none), so every tk case SKIPPED and every
|
||||
// provider case went UNMEASURED: a hollow PASS (rega, ded4b3c1). A seat that has a real public token passes
|
||||
// it as TEST_MAPBOX_TOKEN (as rega's checks do); otherwise a baked one is still used if a tree has it.
|
||||
const bakedToken = process.env.TEST_MAPBOX_TOKEN || (() => {
|
||||
for (const b of manifest.bundles || []) {
|
||||
for (const p of b.profiles || []) {
|
||||
if (!p.isMap || !p.iframeUrl) continue
|
||||
|
|
@ -227,4 +231,9 @@ if (fails.length) {
|
|||
console.error(' on a partner page — the case the published embed snippet is written for.')
|
||||
process.exit(1)
|
||||
}
|
||||
// A run in which no case measured anything is NOT MEASURED (exit 75), never a PASS.
|
||||
if (!lines.some((l) => /^\s*ok\b/.test(l))) {
|
||||
console.log(`\nCOMPOSITE-EMBED-KNOBS: NOT MEASURED — every case skipped or went unmeasured${bakedToken ? '' : ' (no token: set TEST_MAPBOX_TOKEN to a public pk. token)'}.`)
|
||||
process.exit(75)
|
||||
}
|
||||
console.log(`\nCOMPOSITE-EMBED-KNOBS: PASS — the host's token and provider reach every nested map.`)
|
||||
|
|
|
|||
|
|
@ -141,6 +141,8 @@ useShadowStyles(`
|
|||
.rm-pill { background:rgba(124,140,248,0.12);color:#a8b8ff;padding:2px 8px;border-radius:11px;font-size:11px;font-weight:600; }
|
||||
.rm-link-btn { background:none;border:none;color:#7c8cf8;cursor:pointer;font-size:11px;padding:0; }
|
||||
.rm-link-btn:hover { text-decoration:underline; }
|
||||
/* WCAG 2.5.8 at EVERY pointer, not only coarse: a 24x24 hit area that adds no box (the f29b8151 pattern). */
|
||||
.rm-link-btn{position:relative;}.rm-link-btn::after{content:'';position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%);}
|
||||
/* WCAG 2.5.8 Target Size (Minimum), AA = 24x24 CSS px. Scoped to (pointer:coarse):
|
||||
2.5.8 governs touch ergonomics, and these are SHARED components sitting on maps this
|
||||
change does not own -- a finger gets the bigger target, the mouse keeps the density
|
||||
|
|
|
|||
|
|
@ -357,6 +357,8 @@ useShadowStyles(`
|
|||
.pin-hint-x { pointer-events: auto; border: none; background: none; color: #aeb7c2;
|
||||
font-size: 16px; line-height: 1; cursor: pointer; padding: 0 0 0 2px; }
|
||||
.pin-hint-x:hover { color: #fff; }
|
||||
/* WCAG 2.5.8 at EVERY pointer, not only coarse: a 24x24 hit area that adds no box (the f29b8151 pattern). */
|
||||
.pin-hint-x{position:relative;}.pin-hint-x::after{content:'';position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%);}
|
||||
/* WCAG 2.5.8 Target Size (Minimum), AA = 24x24 CSS px. Scoped to (pointer:coarse):
|
||||
2.5.8 governs touch ergonomics, and these are SHARED components sitting on maps this
|
||||
change does not own -- a finger gets the bigger target, the mouse keeps the density
|
||||
|
|
|
|||
|
|
@ -93,6 +93,8 @@ useShadowStyles(`
|
|||
those owners designed. min-height states the 24 rather than deriving it from a font. */
|
||||
@media (pointer:coarse){.mobile-collapse-caret{width:24px;height:24px;}}
|
||||
.mobile-collapse-caret:hover{color:#3b463d;background:rgba(59,70,61,0.12);border-color:#3b463d;}
|
||||
/* WCAG 2.5.8 at EVERY pointer, not only coarse: a 24x24 hit area that adds no box (the f29b8151 pattern). */
|
||||
.mobile-collapse-caret{position:relative;}.mobile-collapse-caret::after{content:'';position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%);}
|
||||
.legend-mobile-sheet.sheet-dark .mobile-collapse-caret{background:rgba(110,118,129,0.15);border-color:#30363d;color:#8b949e;box-shadow:none;}
|
||||
.legend-mobile-sheet.sheet-dark .mobile-collapse-caret:hover{color:#c9d1d9;background:rgba(59,70,61,0.18);border-color:#73A17F;}
|
||||
|
||||
|
|
|
|||
|
|
@ -757,6 +757,8 @@ useShadowStyles(`
|
|||
display: inline-flex; align-items: center; justify-content: center; gap: 3px;
|
||||
}
|
||||
.stl-hdr-num:hover { color: #c9d1d9; }
|
||||
/* WCAG 2.5.8 at EVERY pointer, not only coarse: a 24x24 hit area that adds no box (the f29b8151 pattern). */
|
||||
.stl-hdr-num{position:relative;}.stl-hdr-num::after{content:'';position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%);}
|
||||
/* WCAG 2.5.8 Target Size (Minimum), AA = 24x24 CSS px. Scoped to (pointer:coarse):
|
||||
2.5.8 governs touch ergonomics, and these are SHARED components sitting on maps this
|
||||
change does not own -- a finger gets the bigger target, the mouse keeps the density
|
||||
|
|
|
|||
|
|
@ -464,8 +464,30 @@ function onClearAll() { emit('clear-all') }
|
|||
padding: 0 8px; font-size: 0.75rem; line-height: 1; white-space: nowrap;
|
||||
height: var(--dx-sel-row-h, 16px); box-sizing: border-box;
|
||||
}
|
||||
.sfh__chip-x { background: none; border: none; cursor: pointer; font-size: 1.05em; line-height: 1; color: inherit; padding: 0; display: inline-flex; align-items: center; }
|
||||
.sfh__chip-x { background: none; border: none; cursor: pointer; font-size: 1.05em; line-height: 1; color: inherit; padding: 0; display: inline-flex; align-items: center;
|
||||
/* ★ A 24px TARGET THAT COSTS ZERO LAYOUT (WCAG 2.5.8).
|
||||
MEASURED: the chip's box is pinned to --dx-sel-row-h (16px) and this button carries padding:0,
|
||||
so the only way to remove a filter was a roughly 13x16px glyph. That is the smallest control in
|
||||
the product, and it is the ONLY way out of a narrowed board — the one place where a miss costs
|
||||
the user the whole view.
|
||||
THE ROW HEIGHT IS NOT NEGOTIABLE and must not be touched here: the three comment blocks above
|
||||
record a measured layout-shift bug (18px vs a 24.25px chipped row walking the map 180 -> 182.25px)
|
||||
and the agent's "a lot more subtle" instruction that set 16px. Growing the button would reopen
|
||||
both.
|
||||
So the HIT AREA grows and the BOX does not. An absolutely-positioned ::after centred on the
|
||||
button claims 24x24 of pointer/touch surface while contributing nothing to the flex row's
|
||||
intrinsic size — the chip stays 16px tall, the strip's fixed-height invariant holds, and
|
||||
nothing moves by a pixel. position:relative scopes the overlay to this button.
|
||||
2.5.8 is a TARGET SIZE criterion, not a touch criterion, so this is unconditional — never
|
||||
behind @media (pointer: coarse). The overlay is transparent and inert to the eye. */
|
||||
position: relative; }
|
||||
.sfh__chip-x::after { content: ''; position: absolute; left: 50%; top: 50%;
|
||||
width: 24px; height: 24px; transform: translate(-50%, -50%); }
|
||||
.sfh__chip-x:hover { opacity: 0.7; }
|
||||
/* The chips sit inside an overflow-x strip, so a focused ✕ must be visibly ringed rather than
|
||||
merely scrolled into view. :focus-visible, not :focus — a mouse click focuses the button too, and
|
||||
a ring that outlives every click reads as a state the chip does not have. */
|
||||
.sfh__chip-x:focus-visible { outline: 2px solid var(--brand, #1a237e); outline-offset: 1px; border-radius: 2px; }
|
||||
/* ★ THE LAST CHIP'S NEIGHBOUR, NOT A PINNED CONTROL
|
||||
(card BUILD-CLEAR-ALL-SITS-BESIDE-THE-SELECTIONS-NOT-FAR-RIGHT — "right next to the selected
|
||||
stuff", and "fancy Nancy", i.e. it should look like a light touch, not a button).
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "تحديد كل الصفوف",
|
||||
"deselectAllRows": "إلغاء تحديد كل الصفوف",
|
||||
"rowDetail": "تفاصيل الصف",
|
||||
"dismissHint": "إخفاء التلميح"
|
||||
"dismissHint": "إخفاء التلميح",
|
||||
"resizeFiltersRail": "تغيير حجم شريط عوامل التصفية",
|
||||
"resizeFiltersRailHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير حجم شريط عوامل التصفية",
|
||||
"resizeChartsRail": "تغيير حجم شريط الرسوم البيانية",
|
||||
"resizeChartsRailHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير حجم شريط الرسوم البيانية",
|
||||
"resizeMapTableSplit": "تغيير نسبة التقسيم بين الخريطة والجدول",
|
||||
"resizeMapTableSplitHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير نسبة التقسيم بين الخريطة والجدول",
|
||||
"resizeTable": "تغيير ارتفاع الجدول",
|
||||
"resizeTableHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير حجم الجدول",
|
||||
"resizeDashboardHeight": "تغيير ارتفاع لوحة المعلومات",
|
||||
"resizeDashboardHeightHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير ارتفاع لوحة المعلومات",
|
||||
"removeFilter": "إزالة عامل التصفية {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "توسيع الجدول",
|
||||
"collapse_table": "طيّ الجدول — توسيع الخريطة",
|
||||
"group": "مجموعة",
|
||||
"deselect_all": "إلغاء تحديد الكل"
|
||||
"deselect_all": "إلغاء تحديد الكل",
|
||||
"results_live": "عرض {count} من أصل {total} {unit}",
|
||||
"filters_live": "عوامل التصفية: {list}",
|
||||
"search_live": "البحث: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "شعوب دوكسا على هذه الخريطة",
|
||||
"notPlaced": "ضمن القائمة، بلا موقع بعد",
|
||||
"outOfScope": "لا توجد شعوب دوكسا — غير ملوَّنة"
|
||||
"outOfScope": "لا توجد شعوب دوكسا — غير ملوَّنة",
|
||||
"hnrTip": "مجموعات لديها تسجيلات صوتية أو فيلم يسوع أو فيديو كتابي أو «كلمات الحياة»، لكن لم يُعثر لها على نص مكتوب من الكتاب المقدس في المصادر التي فُحصت. ليس ادعاءً بعدم وجوده."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "أكبر الشعوب",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "Alle Zeilen auswählen",
|
||||
"deselectAllRows": "Auswahl aller Zeilen aufheben",
|
||||
"rowDetail": "Zeilendetails",
|
||||
"dismissHint": "Hinweis schließen"
|
||||
"dismissHint": "Hinweis schließen",
|
||||
"resizeFiltersRail": "Filterleiste in der Größe ändern",
|
||||
"resizeFiltersRailHint": "Ziehen oder Pfeiltasten verwenden, um die Filterleiste in der Größe zu ändern",
|
||||
"resizeChartsRail": "Diagrammleiste in der Größe ändern",
|
||||
"resizeChartsRailHint": "Ziehen oder Pfeiltasten verwenden, um die Diagrammleiste in der Größe zu ändern",
|
||||
"resizeMapTableSplit": "Aufteilung zwischen Karte und Tabelle ändern",
|
||||
"resizeMapTableSplitHint": "Ziehen oder Pfeiltasten verwenden, um die Aufteilung zwischen Karte und Tabelle zu ändern",
|
||||
"resizeTable": "Tabellenhöhe ändern",
|
||||
"resizeTableHint": "Ziehen oder Pfeiltasten verwenden, um die Tabelle in der Größe zu ändern",
|
||||
"resizeDashboardHeight": "Höhe des Dashboards ändern",
|
||||
"resizeDashboardHeightHint": "Ziehen oder Pfeiltasten verwenden, um die Höhe des Dashboards zu ändern",
|
||||
"removeFilter": "Filter {name} entfernen"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "Tabelle ausklappen",
|
||||
"collapse_table": "Tabelle einklappen – Karte vergrößern",
|
||||
"group": "Volksgruppe",
|
||||
"deselect_all": "Auswahl aufheben"
|
||||
"deselect_all": "Auswahl aufheben",
|
||||
"results_live": "{count} von {total} {unit} angezeigt",
|
||||
"filters_live": "Filter: {list}",
|
||||
"search_live": "Suche: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "Doxa-Volksgruppen auf dieser Karte",
|
||||
"notPlaced": "auf der Liste, noch nicht verortet",
|
||||
"outOfScope": "keine Doxa-Volksgruppen — nicht eingefärbt"
|
||||
"outOfScope": "keine Doxa-Volksgruppen — nicht eingefärbt",
|
||||
"hnrTip": "Gruppen mit Tonaufnahmen, dem JESUS-Film, einem Bibelvideo oder Words of Life, aber ohne gefundene Bibeltexte in den geprüften Quellen. Keine Behauptung, dass es keine gibt."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "Größte Gruppen",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "Select all rows",
|
||||
"deselectAllRows": "Deselect all rows",
|
||||
"rowDetail": "Row detail",
|
||||
"dismissHint": "Dismiss hint"
|
||||
"dismissHint": "Dismiss hint",
|
||||
"resizeFiltersRail": "Resize filters rail",
|
||||
"resizeFiltersRailHint": "Drag or use arrow keys to resize the filters rail",
|
||||
"resizeChartsRail": "Resize charts rail",
|
||||
"resizeChartsRailHint": "Drag or use arrow keys to resize the charts rail",
|
||||
"resizeMapTableSplit": "Resize map/table split",
|
||||
"resizeMapTableSplitHint": "Drag or use arrow keys to resize the map/table split",
|
||||
"resizeTable": "Resize table height",
|
||||
"resizeTableHint": "Drag or use arrow keys to resize the table",
|
||||
"resizeDashboardHeight": "Resize dashboard height",
|
||||
"resizeDashboardHeightHint": "Drag or use arrow keys to resize the dashboard's height",
|
||||
"removeFilter": "Remove filter {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "Expand table",
|
||||
"collapse_table": "Collapse table — grow the map",
|
||||
"group": "group",
|
||||
"deselect_all": "Deselect all"
|
||||
"deselect_all": "Deselect all",
|
||||
"results_live": "{count} of {total} {unit} shown",
|
||||
"filters_live": "Filters: {list}",
|
||||
"search_live": "Search: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "Doxa people groups on this map",
|
||||
"notPlaced": "on the roster, not yet placed",
|
||||
"outOfScope": "no Doxa people groups — not coloured"
|
||||
"outOfScope": "no Doxa people groups — not coloured",
|
||||
"hnrTip": "Groups with recorded audio, the JESUS Film, a Bible video or Words of Life, but no text Scripture found in the pools checked. Not a claim that none exists."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "Largest groups",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "Seleccionar todas las filas",
|
||||
"deselectAllRows": "Deseleccionar todas las filas",
|
||||
"rowDetail": "Detalle de la fila",
|
||||
"dismissHint": "Descartar la sugerencia"
|
||||
"dismissHint": "Descartar la sugerencia",
|
||||
"resizeFiltersRail": "Cambiar el tamaño del panel de filtros",
|
||||
"resizeFiltersRailHint": "Arrastra o usa las teclas de flecha para cambiar el tamaño del panel de filtros",
|
||||
"resizeChartsRail": "Cambiar el tamaño del panel de gráficos",
|
||||
"resizeChartsRailHint": "Arrastra o usa las teclas de flecha para cambiar el tamaño del panel de gráficos",
|
||||
"resizeMapTableSplit": "Cambiar la división entre el mapa y la tabla",
|
||||
"resizeMapTableSplitHint": "Arrastra o usa las teclas de flecha para cambiar la división entre el mapa y la tabla",
|
||||
"resizeTable": "Cambiar la altura de la tabla",
|
||||
"resizeTableHint": "Arrastra o usa las teclas de flecha para cambiar el tamaño de la tabla",
|
||||
"resizeDashboardHeight": "Cambiar la altura del panel",
|
||||
"resizeDashboardHeightHint": "Arrastra o usa las teclas de flecha para cambiar la altura del panel",
|
||||
"removeFilter": "Quitar el filtro {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "Expandir tabla",
|
||||
"collapse_table": "Contraer tabla — ampliar el mapa",
|
||||
"group": "pueblo",
|
||||
"deselect_all": "Deseleccionar todo"
|
||||
"deselect_all": "Deseleccionar todo",
|
||||
"results_live": "Se muestran {count} de {total} {unit}",
|
||||
"filters_live": "Filtros: {list}",
|
||||
"search_live": "Búsqueda: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "Pueblos de Doxa en este mapa",
|
||||
"notPlaced": "en la lista, aún sin ubicar",
|
||||
"outOfScope": "sin pueblos de Doxa — sin color"
|
||||
"outOfScope": "sin pueblos de Doxa — sin color",
|
||||
"hnrTip": "Grupos con audio grabado, la película JESÚS, un video bíblico o Palabras de Vida, pero sin Escritura en texto encontrada en las fuentes revisadas. No afirma que no exista."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "Pueblos más grandes",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "Sélectionner toutes les lignes",
|
||||
"deselectAllRows": "Désélectionner toutes les lignes",
|
||||
"rowDetail": "Détail de la ligne",
|
||||
"dismissHint": "Masquer l'astuce"
|
||||
"dismissHint": "Masquer l'astuce",
|
||||
"resizeFiltersRail": "Redimensionner le volet des filtres",
|
||||
"resizeFiltersRailHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner le volet des filtres",
|
||||
"resizeChartsRail": "Redimensionner le volet des graphiques",
|
||||
"resizeChartsRailHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner le volet des graphiques",
|
||||
"resizeMapTableSplit": "Redimensionner le partage carte/tableau",
|
||||
"resizeMapTableSplitHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner le partage carte/tableau",
|
||||
"resizeTable": "Redimensionner la hauteur du tableau",
|
||||
"resizeTableHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner le tableau",
|
||||
"resizeDashboardHeight": "Redimensionner la hauteur du tableau de bord",
|
||||
"resizeDashboardHeightHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner la hauteur du tableau de bord",
|
||||
"removeFilter": "Supprimer le filtre {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "Développer le tableau",
|
||||
"collapse_table": "Réduire le tableau — agrandir la carte",
|
||||
"group": "peuple",
|
||||
"deselect_all": "Tout désélectionner"
|
||||
"deselect_all": "Tout désélectionner",
|
||||
"results_live": "{count} sur {total} {unit} affichés",
|
||||
"filters_live": "Filtres : {list}",
|
||||
"search_live": "Recherche : {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "Peuples Doxa sur cette carte",
|
||||
"notPlaced": "sur la liste, pas encore localisés",
|
||||
"outOfScope": "aucun peuple Doxa — non coloré"
|
||||
"outOfScope": "aucun peuple Doxa — non coloré",
|
||||
"hnrTip": "Groupes disposant d'enregistrements audio, du film JÉSUS, d'une vidéo biblique ou de Paroles de Vie, mais sans Écriture écrite trouvée dans les sources consultées. Ce n'est pas une affirmation qu'il n'en existe pas."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "Peuples les plus nombreux",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "सभी पंक्तियाँ चुनें",
|
||||
"deselectAllRows": "सभी पंक्तियाँ अचयनित करें",
|
||||
"rowDetail": "पंक्ति विवरण",
|
||||
"dismissHint": "संकेत हटाएँ"
|
||||
"dismissHint": "संकेत हटाएँ",
|
||||
"resizeFiltersRail": "फ़िल्टर पट्टी का आकार बदलें",
|
||||
"resizeFiltersRailHint": "फ़िल्टर पट्टी का आकार बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें",
|
||||
"resizeChartsRail": "चार्ट पट्टी का आकार बदलें",
|
||||
"resizeChartsRailHint": "चार्ट पट्टी का आकार बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें",
|
||||
"resizeMapTableSplit": "मानचित्र/तालिका विभाजन का आकार बदलें",
|
||||
"resizeMapTableSplitHint": "मानचित्र/तालिका विभाजन का आकार बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें",
|
||||
"resizeTable": "तालिका की ऊँचाई बदलें",
|
||||
"resizeTableHint": "तालिका का आकार बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें",
|
||||
"resizeDashboardHeight": "डैशबोर्ड की ऊँचाई बदलें",
|
||||
"resizeDashboardHeightHint": "डैशबोर्ड की ऊँचाई बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें",
|
||||
"removeFilter": "फ़िल्टर {name} हटाएँ"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "तालिका विस्तृत करें",
|
||||
"collapse_table": "तालिका संक्षिप्त करें — मानचित्र बड़ा करें",
|
||||
"group": "जनसमूह",
|
||||
"deselect_all": "सभी अचयनित करें"
|
||||
"deselect_all": "सभी अचयनित करें",
|
||||
"results_live": "{total} में से {count} {unit} दिखाए गए",
|
||||
"filters_live": "फ़िल्टर: {list}",
|
||||
"search_live": "खोज: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "इस मानचित्र पर दोक्सा जनसमूह",
|
||||
"notPlaced": "सूची में, अभी स्थान नहीं",
|
||||
"outOfScope": "कोई दोक्सा जनसमूह नहीं — रंग नहीं"
|
||||
"outOfScope": "कोई दोक्सा जनसमूह नहीं — रंग नहीं",
|
||||
"hnrTip": "जिन समूहों के पास रिकॉर्ड किया गया ऑडियो, यीशु फ़िल्म, बाइबल वीडियो या जीवन के वचन हैं, पर जाँचे गए स्रोतों में लिखित धर्मशास्त्र नहीं मिला। यह दावा नहीं कि वह मौजूद नहीं है।"
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "सबसे बड़े जनसमूह",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "Seleziona tutte le righe",
|
||||
"deselectAllRows": "Deseleziona tutte le righe",
|
||||
"rowDetail": "Dettaglio riga",
|
||||
"dismissHint": "Ignora il suggerimento"
|
||||
"dismissHint": "Ignora il suggerimento",
|
||||
"resizeFiltersRail": "Ridimensiona la barra dei filtri",
|
||||
"resizeFiltersRailHint": "Trascina o usa i tasti freccia per ridimensionare la barra dei filtri",
|
||||
"resizeChartsRail": "Ridimensiona la barra dei grafici",
|
||||
"resizeChartsRailHint": "Trascina o usa i tasti freccia per ridimensionare la barra dei grafici",
|
||||
"resizeMapTableSplit": "Ridimensiona la divisione mappa/tabella",
|
||||
"resizeMapTableSplitHint": "Trascina o usa i tasti freccia per ridimensionare la divisione mappa/tabella",
|
||||
"resizeTable": "Ridimensiona l'altezza della tabella",
|
||||
"resizeTableHint": "Trascina o usa i tasti freccia per ridimensionare la tabella",
|
||||
"resizeDashboardHeight": "Ridimensiona l'altezza della dashboard",
|
||||
"resizeDashboardHeightHint": "Trascina o usa i tasti freccia per ridimensionare l'altezza della dashboard",
|
||||
"removeFilter": "Rimuovi il filtro {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "Espandi tabella",
|
||||
"collapse_table": "Comprimi tabella — ingrandisci la mappa",
|
||||
"group": "popolo",
|
||||
"deselect_all": "Deseleziona tutto"
|
||||
"deselect_all": "Deseleziona tutto",
|
||||
"results_live": "{count} di {total} {unit} mostrati",
|
||||
"filters_live": "Filtri: {list}",
|
||||
"search_live": "Ricerca: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "Popoli Doxa su questa mappa",
|
||||
"notPlaced": "in elenco, non ancora collocati",
|
||||
"outOfScope": "nessun popolo Doxa — non colorato"
|
||||
"outOfScope": "nessun popolo Doxa — non colorato",
|
||||
"hnrTip": "Gruppi con audio registrato, il film JESUS, un video biblico o Parole di Vita, ma senza Scrittura scritta trovata nelle fonti controllate. Non significa che non esista."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "Popoli più numerosi",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "Selecionar todas as linhas",
|
||||
"deselectAllRows": "Desmarcar todas as linhas",
|
||||
"rowDetail": "Detalhe da linha",
|
||||
"dismissHint": "Dispensar a dica"
|
||||
"dismissHint": "Dispensar a dica",
|
||||
"resizeFiltersRail": "Redimensionar o painel de filtros",
|
||||
"resizeFiltersRailHint": "Arraste ou use as teclas de seta para redimensionar o painel de filtros",
|
||||
"resizeChartsRail": "Redimensionar o painel de gráficos",
|
||||
"resizeChartsRailHint": "Arraste ou use as teclas de seta para redimensionar o painel de gráficos",
|
||||
"resizeMapTableSplit": "Redimensionar a divisão entre o mapa e a tabela",
|
||||
"resizeMapTableSplitHint": "Arraste ou use as teclas de seta para redimensionar a divisão entre o mapa e a tabela",
|
||||
"resizeTable": "Redimensionar a altura da tabela",
|
||||
"resizeTableHint": "Arraste ou use as teclas de seta para redimensionar a tabela",
|
||||
"resizeDashboardHeight": "Redimensionar a altura do painel",
|
||||
"resizeDashboardHeightHint": "Arraste ou use as teclas de seta para redimensionar a altura do painel",
|
||||
"removeFilter": "Remover o filtro {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "Expandir tabela",
|
||||
"collapse_table": "Recolher tabela — ampliar o mapa",
|
||||
"group": "povo",
|
||||
"deselect_all": "Desmarcar tudo"
|
||||
"deselect_all": "Desmarcar tudo",
|
||||
"results_live": "A mostrar {count} de {total} {unit}",
|
||||
"filters_live": "Filtros: {list}",
|
||||
"search_live": "Pesquisa: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "Povos Doxa neste mapa",
|
||||
"notPlaced": "na lista, ainda sem localização",
|
||||
"outOfScope": "sem povos Doxa — sem cor"
|
||||
"outOfScope": "sem povos Doxa — sem cor",
|
||||
"hnrTip": "Grupos com áudio gravado, o filme JESUS, um vídeo bíblico ou Palavras de Vida, mas sem Escritura em texto encontrada nas fontes verificadas. Não é uma afirmação de que não exista."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "Maiores povos",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "Selectează toate rândurile",
|
||||
"deselectAllRows": "Deselectează toate rândurile",
|
||||
"rowDetail": "Detaliu rând",
|
||||
"dismissHint": "Închide sugestia"
|
||||
"dismissHint": "Închide sugestia",
|
||||
"resizeFiltersRail": "Redimensionează bara de filtre",
|
||||
"resizeFiltersRailHint": "Trage sau folosește tastele săgeată pentru a redimensiona bara de filtre",
|
||||
"resizeChartsRail": "Redimensionează bara de grafice",
|
||||
"resizeChartsRailHint": "Trage sau folosește tastele săgeată pentru a redimensiona bara de grafice",
|
||||
"resizeMapTableSplit": "Redimensionează împărțirea hartă/tabel",
|
||||
"resizeMapTableSplitHint": "Trage sau folosește tastele săgeată pentru a redimensiona împărțirea hartă/tabel",
|
||||
"resizeTable": "Redimensionează înălțimea tabelului",
|
||||
"resizeTableHint": "Trage sau folosește tastele săgeată pentru a redimensiona tabelul",
|
||||
"resizeDashboardHeight": "Redimensionează înălțimea tabloului de bord",
|
||||
"resizeDashboardHeightHint": "Trage sau folosește tastele săgeată pentru a redimensiona înălțimea tabloului de bord",
|
||||
"removeFilter": "Elimină filtrul {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "Extinde tabelul",
|
||||
"collapse_table": "Restrânge tabelul — mărește harta",
|
||||
"group": "popor",
|
||||
"deselect_all": "Deselectează tot"
|
||||
"deselect_all": "Deselectează tot",
|
||||
"results_live": "{count} din {total} {unit} afișate",
|
||||
"filters_live": "Filtre: {list}",
|
||||
"search_live": "Căutare: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "Popoare Doxa pe această hartă",
|
||||
"notPlaced": "pe listă, încă nelocalizate",
|
||||
"outOfScope": "niciun popor Doxa — necolorat"
|
||||
"outOfScope": "niciun popor Doxa — necolorat",
|
||||
"hnrTip": "Grupuri cu înregistrări audio, filmul ISUS, un videoclip biblic sau Cuvinte ale Vieții, dar fără Scriptură scrisă găsită în sursele verificate. Nu înseamnă că nu există."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "Cele mai mari popoare",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "Выбрать все строки",
|
||||
"deselectAllRows": "Снять выделение со всех строк",
|
||||
"rowDetail": "Подробности строки",
|
||||
"dismissHint": "Скрыть подсказку"
|
||||
"dismissHint": "Скрыть подсказку",
|
||||
"resizeFiltersRail": "Изменить размер панели фильтров",
|
||||
"resizeFiltersRailHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить размер панели фильтров",
|
||||
"resizeChartsRail": "Изменить размер панели диаграмм",
|
||||
"resizeChartsRailHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить размер панели диаграмм",
|
||||
"resizeMapTableSplit": "Изменить соотношение карты и таблицы",
|
||||
"resizeMapTableSplitHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить соотношение карты и таблицы",
|
||||
"resizeTable": "Изменить высоту таблицы",
|
||||
"resizeTableHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить размер таблицы",
|
||||
"resizeDashboardHeight": "Изменить высоту панели",
|
||||
"resizeDashboardHeightHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить высоту панели",
|
||||
"removeFilter": "Удалить фильтр {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "Развернуть таблицу",
|
||||
"collapse_table": "Свернуть таблицу — увеличить карту",
|
||||
"group": "народ",
|
||||
"deselect_all": "Снять выделение"
|
||||
"deselect_all": "Снять выделение",
|
||||
"results_live": "Показано {count} из {total} {unit}",
|
||||
"filters_live": "Фильтры: {list}",
|
||||
"search_live": "Поиск: {term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "Народы Doxa на этой карте",
|
||||
"notPlaced": "в списке, пока без координат",
|
||||
"outOfScope": "нет народов Doxa — не окрашено"
|
||||
"outOfScope": "нет народов Doxa — не окрашено",
|
||||
"hnrTip": "Группы с аудиозаписями, фильмом «Иисус», библейским видео или «Словами жизни», но без письменного Писания в проверенных источниках. Это не утверждение, что его нет."
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "Крупнейшие народы",
|
||||
|
|
|
|||
|
|
@ -9,5 +9,16 @@
|
|||
"selectAllRows": "选择所有行",
|
||||
"deselectAllRows": "取消选择所有行",
|
||||
"rowDetail": "行详情",
|
||||
"dismissHint": "关闭提示"
|
||||
"dismissHint": "关闭提示",
|
||||
"resizeFiltersRail": "调整筛选器栏大小",
|
||||
"resizeFiltersRailHint": "拖动或使用方向键调整筛选器栏大小",
|
||||
"resizeChartsRail": "调整图表栏大小",
|
||||
"resizeChartsRailHint": "拖动或使用方向键调整图表栏大小",
|
||||
"resizeMapTableSplit": "调整地图与表格的分隔",
|
||||
"resizeMapTableSplitHint": "拖动或使用方向键调整地图与表格的分隔",
|
||||
"resizeTable": "调整表格高度",
|
||||
"resizeTableHint": "拖动或使用方向键调整表格大小",
|
||||
"resizeDashboardHeight": "调整仪表板高度",
|
||||
"resizeDashboardHeightHint": "拖动或使用方向键调整仪表板高度",
|
||||
"removeFilter": "移除筛选条件 {name}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,5 +60,8 @@
|
|||
"expand_table": "展开表格",
|
||||
"collapse_table": "收起表格 — 放大地图",
|
||||
"group": "个民族",
|
||||
"deselect_all": "取消全选"
|
||||
"deselect_all": "取消全选",
|
||||
"results_live": "已显示 {total} 个{unit}中的 {count} 个",
|
||||
"filters_live": "筛选条件:{list}",
|
||||
"search_live": "搜索:{term}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
"cvd40": "40+",
|
||||
"onMap": "本地图上的 Doxa 族群",
|
||||
"notPlaced": "在名单上,尚未定位",
|
||||
"outOfScope": "没有 Doxa 族群 — 不着色"
|
||||
"outOfScope": "没有 Doxa 族群 — 不着色",
|
||||
"hnrTip": "这些群体有录音、《耶稣传》电影、圣经视频或“生命之道”,但在所查资料中未找到文字经文。这并不表示不存在。"
|
||||
},
|
||||
"tabs": {
|
||||
"groups": "最大的族群",
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
"check:coverage-consistent:poison": "node internal/check-gospel-coverage-consistent.mjs --poison",
|
||||
"check:csv-shape": "node internal/check-csv-export-shape.mjs",
|
||||
"check:csv-shape:self-test": "node internal/check-csv-export-shape.mjs --self-test",
|
||||
"check:dashboard-filter-a11y": "node plugin-designs/research-dashboard/scripts/check-dashboard-filter-a11y.mjs",
|
||||
"check:dashboard-geocoder-provider": "node plugin-designs/research-dashboard/scripts/check-dashboard-geocoder-provider.mjs",
|
||||
"check:deck-click": "node internal/check-deck-click.mjs",
|
||||
"check:dep-names": "node internal/check-dependency-names.mjs",
|
||||
|
|
@ -99,6 +100,7 @@
|
|||
"check:i18n-treeshake": "node internal/check-i18n-treeshake.mjs",
|
||||
"check:kpi-unit": "node internal/check-kpi-unit-once.mjs",
|
||||
"check:label-joins": "node internal/check-label-joins.mjs",
|
||||
"check:language-code-link": "node plugin-designs/doxa-research-map/scripts/check-language-code-link.mjs",
|
||||
"check:leaf-engine-per-provider": "node internal/check-leaf-engine-per-provider.mjs",
|
||||
"check:leaf-english-leaks": "node internal/check-leaf-english-leaks.mjs",
|
||||
"check:leaf-english-leaks:self-test": "node internal/check-leaf-english-leaks.mjs --self-test",
|
||||
|
|
@ -278,6 +280,7 @@
|
|||
"check:composites-mount": "every capability-4/5 composite's OWN setup() and mounted hooks run without throwing, in en and ar, headless (no browser): vite loads each composite as its bundle entry defines it (configureApp, and ProfileLoader's provides where the entry mounts ProfileLoader), and @vue/runtime-core mounts it on a no-op renderer. Exists because 08f89f55 shipped two composites calling getRuntimeLocale/detectLocale/RTL_LOCALES with no import: the build was green, setup threw a ReferenceError in every locale, and Big Picture and Simple Research rendered nothing. Proves setup runs; cannot prove the children render.",
|
||||
"check:coverage-consistent": "the gospel-resources surfaces must agree: no resource on an ISO RESERVED code (und/mul/mis/zxx), every resourced code NAMED, table reach recounted off the pins, no invented URL, tiers reconcile. Static, sub-second. Self-test: `bun run check:coverage-consistent:poison`, all 12 clauses (A-L) must fail. Clause L is the one that is not about consistency: it fails when the link-verification record goes stale, because 'link checked' is a claim about the present tense. Written after the same drift defect was found by hand three times.",
|
||||
"check:csv-shape": "the export must OPEN as a table: header on line 0, every row matching. Run the `check:csv-shape:self-test` script for the NEGATIVE test (forces the provenance comment back to line 0 IN MEMORY and requires this gate to REJECT it) — the header used to claim 'NEGATIVE-TESTED' with no way to re-run it.",
|
||||
"check:dashboard-filter-a11y": "the dashboard's cross-filter is operable and audible: every filter chip is a <button type=\"button\"> with an aria-label naming the ACTION (a filter that can be set by keyboard must be clearable by keyboard), the shell carries exactly ONE always-rendered polite role=\"status\" region so a brush that changes a number far from the control is announced once rather than six times or not at all, and no resize handle's accessible name is a raw English literal. AST over the parsed templates plus the built bundle — no browser (rega's alone).",
|
||||
"check:dashboard-geocoder-provider": "the research dashboard leaf at ?provider=maplibre makes ZERO requests to api.mapbox.com, and its search bars still suggest (built tree; browser gate). It was kept out of gates:post while the generated leaf hard-linked the Mapbox engine; the leaf now loads only the engine it is asked for.",
|
||||
"check:dep-names": "every declared dep is a REAL package name (a rename once rewrote @capacitor/* and broke bun install in a clone)",
|
||||
"check:descriptions": "every shipped profile must say what it is (reads the BUILT manifest)",
|
||||
|
|
@ -310,6 +313,7 @@
|
|||
"check:host-locale-contract": "a HOST's profile-config.locale reaches every leaf: each leaf page is loaded with ONLY \"locale\":\"ar\" added to its profile-config (no ?lang=, the page keeps lang=\"en\") and must draw at least half the Arabic text the same page draws at ?lang=ar. regions-dashboard/regions-list is the positive control (NOT MEASURED if it does not enter Arabic). Guards ProfileLoader's inject('appI18n'): a bundle that never provides appI18n silently ignores the host. --dir <tree> for a before/after, --only a/b,c/d to narrow. Through browser-slot.sh.",
|
||||
"check:i18n-never-translated": "a key PRESENT in all 11 catalogs but IDENTICAL in all of them is copied, not translated. check:i18n-parity asserts presence; presence and translatedness are different properties. Carries an allowlist for keys correctly identical everywhere (pure format strings, brand names, ISO designations) — each with a reason, so the list records decisions rather than silencing findings.",
|
||||
"check:i18n-treeshake": "each built bundle carries every translation area its code asks for: every area-prefixed key literal in <bundle>.js belongs to an area the build included (the build narrows library/i18n's catalogue glob per bundle, internal/i18n-areas.mjs). Headless.",
|
||||
"check:language-code-link": "the map's language selection reaches the grid as a locale-stable CODE, or narrows nothing at all. rega measured Languages > Language > \"Arabic\" taking the grid 2,107 -> 0 in BOTH locales: the emitter looked for a row whose language LABEL equalled the selected name, but a language tier's label is derived by splitting the API label at the comma, and no row reads \"Arabic\" - they read \"Arabic, Sudanese\", \"Arabic, Levantine\", 22 codes in all. Lifts the emitter's match rule and the composite's gridLanguage() from the shipping source (never re-typed) and runs them against a committed fixture of the 864 distinct language label/value pairs: the emitter's rule must agree with the legend's own three-arm filter on every (label, tier) pair, every tier must select at least one row, a tier covering one code must emit it, a tier covering several must emit NONE and leave the axis unfiltered. No network, no browser; --refresh-fixture re-takes the fixture.",
|
||||
"check:leaf-engine-per-provider": "every leaf in the manifest at ?provider=maplibre makes ZERO requests to any *.mapbox.com host and a map leaf still draws; at its default every map leaf draws with the engine it drew with before (read from the canvas that drew). --baseline <tree> compares against another tree (e.g. main). Browser gate, @browser-slot-max-hold 2700.",
|
||||
"check:leaves-mount": "DID THE ELEMENT ACTUALLY MOUNT, on all five gospel leaves. Exists because a ReferenceError thrown during setup dies INSIDE the custom-element boundary: the page loads, every asset returns 200, pageerror fires zero times, and the element sits there with an empty shadow root. A healthy-looking dead page. This asks the cheap unambiguous question the rich gates are too slow to ask on every leaf — is anything there — in five steps that each name their own failure: tag defined, host present, shadowRoot attached, shadow root non-empty, visible text rendered. It does NOT trust the absence of console errors; zero errors is not the same as working. --poison for the negative test.",
|
||||
"check:legend-export-reachable": "the Export affordance must be reachable at BOTH widths. Selects a leaf row first (the control is gated on selectedNode) and opens the mobile sheet first (it starts closed). Asserts a REAL BOX, not CSS visibility — on mobile the elements report visibility:visible at 0x0. PASSES at both widths since the mobile sheet was given :export-enabled and :tabs. SKIPs when nothing is served.",
|
||||
|
|
|
|||
|
|
@ -42,18 +42,9 @@ const profileModules = import.meta.glob('./*.vue')
|
|||
// where _registry.js discovers them for every bundle, and src/colors/ holds no .js at all. The glob
|
||||
// matched nothing, so leaving it would be dead code that reads as a deliberate override.
|
||||
|
||||
// ─── Mapbox RTL text plugin — load ONCE before any map instance ──────────────
|
||||
if (typeof window !== 'undefined' && window.mapboxgl?.setRTLTextPlugin) {
|
||||
try {
|
||||
window.mapboxgl.setRTLTextPlugin(
|
||||
'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.3.0/mapbox-gl-rtl-text.js',
|
||||
null,
|
||||
true // lazy
|
||||
)
|
||||
} catch (_) {
|
||||
// Plugin already set in this session — ignore.
|
||||
}
|
||||
}
|
||||
// RTL text plugin (Arabic/Hebrew/Persian shaping): installed by useMapInstance through
|
||||
// library/maps/rtl-text.js, on BOTH engines, before every map is constructed. Do not re-add a
|
||||
// hand-rolled mapboxgl-only block here -- it was a strict subset of that call.
|
||||
|
||||
/**
|
||||
* Each instance gets its own Pinia + i18n so multiple embeds on one page never
|
||||
|
|
|
|||
|
|
@ -32,18 +32,9 @@ const profileModules = import.meta.glob('./*.vue')
|
|||
// where _registry.js discovers them for every bundle, and src/colors/ holds no .js at all. The glob
|
||||
// matched nothing, so leaving it would be dead code that reads as a deliberate override.
|
||||
|
||||
// ─── Mapbox RTL text plugin — load ONCE before any map instance ──────────────
|
||||
if (typeof window !== 'undefined' && window.mapboxgl?.setRTLTextPlugin) {
|
||||
try {
|
||||
window.mapboxgl.setRTLTextPlugin(
|
||||
'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.3.0/mapbox-gl-rtl-text.js',
|
||||
null,
|
||||
true // lazy
|
||||
)
|
||||
} catch (_) {
|
||||
// Already set in this session — ignore.
|
||||
}
|
||||
}
|
||||
// RTL text plugin (Arabic/Hebrew/Persian shaping): installed by useMapInstance through
|
||||
// library/maps/rtl-text.js, on BOTH engines, before every map is constructed. Do not re-add a
|
||||
// hand-rolled mapboxgl-only block here -- it was a strict subset of that call.
|
||||
|
||||
/**
|
||||
* Build a fresh defineCustomElement-wrapped class. Each instance gets its own
|
||||
|
|
|
|||
|
|
@ -2182,29 +2182,74 @@ function emitFilterState() {
|
|||
//
|
||||
// The NAME still goes out because this map's own legend selects by name; the CODE goes out for
|
||||
// anyone matching rows. Both halves get the form they can actually use.
|
||||
// ★ THE LOOKUP HAS TO MATCH THE WAY THE LEGEND BUILT THE LABEL (rega, 2026-09-26, main 49992a5d:
|
||||
// MapLibre, BOTH locales, Languages > Language > "Arabic" -> languageCode:"" -> grid 2,107 -> 0).
|
||||
//
|
||||
// WHAT I GOT WRONG. This found a row whose language LABEL equals the selected name with `===`.
|
||||
// A language node's label is NOT a label any row carries: useLanguageFamilyLegendData builds the
|
||||
// tree family > language > dialect, and the LANGUAGE tier's label is a BASE NAME derived by
|
||||
// splitting the API label at the comma. MEASURED against the live source (2,107 rows, all 2,107
|
||||
// carrying primary_language as {value,label}): there is NO row whose label is "Arabic". What
|
||||
// exists is "Arabic, Sudanese", "Arabic, Levantine", "Arabic, Gulf", ... So the exact match could
|
||||
// never hit, in any locale — which is why rega saw it fail identically in en and ar, and why the
|
||||
// locale fix that prompted this code was right about the DISEASE and wrong about this line.
|
||||
//
|
||||
// This is the derived-value trap, one tier down from where I last wrote it up: a value that
|
||||
// crosses a component boundary must exist on a row, or the two ends are comparing different
|
||||
// things. "Arabic" is a GROUPING the legend invented; `primary_language.label` is a FIELD.
|
||||
//
|
||||
// So the rows are matched the way the legend's own node matches pins — base, comma-prefix,
|
||||
// space-suffix — rather than by a fourth hand-typed rule that can drift from the other three.
|
||||
const langName = mapStore?.selectedLanguage || ''
|
||||
// A dialect is a language selection too, and it was emitting nothing at all: the watcher below
|
||||
// did not observe selectedDialect, so drilling to the deepest tier left the grid on the previous
|
||||
// state. Its originalLabels ARE exact API labels, so it is the one unambiguous case.
|
||||
const dialect = mapStore?.selectedDialect || null
|
||||
const dialectLabels = Array.isArray(dialect?.originalLabels) ? dialect.originalLabels.map((s) => String(s).trim()).filter(Boolean) : []
|
||||
// Read the records here rather than assuming a `rows` in scope — check:no-free-identifiers caught
|
||||
// exactly that on its first outing against this very edit, which is the class of bug it is for.
|
||||
const langRows = mapData?.normalizedPeopleGroups?.value || []
|
||||
const langCode = langName
|
||||
? String(
|
||||
(langRows.find((r) => {
|
||||
const l = r && (r.language ?? r.primary_language)
|
||||
const lab = l && typeof l === 'object' ? l.label : l
|
||||
return String(lab || '').trim() === String(langName).trim()
|
||||
}) || {})._raw?.primary_language?.value || ''
|
||||
).trim()
|
||||
: ''
|
||||
const rowLangLabel = (r) => {
|
||||
const l = r && (r.language ?? r.primary_language)
|
||||
return String((l && typeof l === 'object' ? l.label : l) || '').trim()
|
||||
}
|
||||
// The legend node's own predicate, in JS. Keep these three arms in step with the `filter`
|
||||
// expression in useLanguageFamilyLegendData.js — they are the same rule, and a fourth spelling
|
||||
// of it is how this broke in the first place.
|
||||
const matchesLanguage = (lab, base) =>
|
||||
lab === base || lab.startsWith(base + ',') || lab.includes(' ' + base)
|
||||
const selectedRows = dialectLabels.length
|
||||
? langRows.filter((r) => dialectLabels.includes(rowLangLabel(r)))
|
||||
: (langName ? langRows.filter((r) => matchesLanguage(rowLangLabel(r), langName.trim())) : [])
|
||||
// ★ ONE CODE ONLY WHEN THERE IS ONE. "Arabic" covers many ISO 639-3 codes (apd, acm, ayl, ...),
|
||||
// so there is no single value that means it, and inventing one would filter the grid to a
|
||||
// fraction of the selection while looking like it worked. Emitting '' is the honest answer, and
|
||||
// the composite's job is then to NOT narrow on an axis it cannot express (fail OPEN) rather than
|
||||
// to narrow to nothing. The full set travels alongside for any consumer that can use a set.
|
||||
const langCodes = [...new Set(selectedRows
|
||||
.map((r) => String(r?._raw?.primary_language?.value || (r?.language && typeof r.language === 'object' ? r.language.value : '') || '').trim())
|
||||
.filter(Boolean))]
|
||||
const langCode = langCodes.length === 1 ? langCodes[0] : ''
|
||||
|
||||
const detail = {
|
||||
region: mapStore?.selectedRegion || '',
|
||||
religion: religionName,
|
||||
language: langName,
|
||||
// A dialect selection reports the dialect's own display name, so a host that shows the value
|
||||
// shows what the user clicked rather than its parent.
|
||||
language: dialectLabels.length ? (dialect?.key ? `${langName}, ${dialect.key}` : langName) : langName,
|
||||
languageCode: langCode,
|
||||
// ADDITIVE: every code the selection covers, so a consumer with multi-value filtering can
|
||||
// narrow correctly where a single code cannot express the selection. Existing listeners that
|
||||
// only read `languageCode` are unaffected.
|
||||
languageCodes: langCodes,
|
||||
}
|
||||
host.dispatchEvent(new CustomEvent('map-filtered', { detail, bubbles: true, composed: true }))
|
||||
}
|
||||
watch(() => [mapStore?.selectedRegion, mapStore?.selectedLanguage, uiStore?.religionFilter],
|
||||
// selectedDialect joins the sources: it is the deepest tier of the Language tree and a genuine
|
||||
// language selection, but it was not observed here, so drilling from "Arabic" to "Arabic, Sudanese"
|
||||
// changed the map and left the grid reporting the tier above. `.key` rather than the object,
|
||||
// because the store replaces it wholesale and a deep watch here would re-emit on every re-render.
|
||||
watch(() => [mapStore?.selectedRegion, mapStore?.selectedLanguage, mapStore?.selectedDialect?.key, uiStore?.religionFilter],
|
||||
() => emitFilterState())
|
||||
|
||||
// ─── Universal-legend (LegendRows) → applyDimFilter bridge ───────────────────
|
||||
|
|
|
|||
|
|
@ -0,0 +1,205 @@
|
|||
#!/usr/bin/env node
|
||||
/**
|
||||
* check-language-code-link.mjs — the map's language selection must reach the grid, or narrow nothing.
|
||||
*
|
||||
* THE BUG (rega, 2026-09-26, main 49992a5d, MapLibre, BOTH locales). Languages > Language >
|
||||
* "Arabic": the map emitted `map-filtered` with {language:"Arabic", languageCode:""}, the composite
|
||||
* handed the grid an empty code, and the grid went 2,107 -> 0. An empty grid reads as "no results",
|
||||
* which is the worst shape a wiring bug can take — the reader believes the data.
|
||||
*
|
||||
* THE CAUSE, and it is one line. The emitter looked for a row whose language LABEL === the selected
|
||||
* name. A LANGUAGE NODE'S LABEL IS NOT A LABEL ANY ROW CARRIES: useLanguageFamilyLegendData builds
|
||||
* family > language > dialect and derives the language tier by splitting the API label at the comma.
|
||||
* MEASURED on the live source: 2,107 rows, all carrying primary_language as {value,label}, and NO
|
||||
* row whose label is "Arabic" — what exists is "Arabic, Sudanese", "Arabic, Levantine", "Arabic,
|
||||
* Gulf", 22 codes in all. The exact match could never hit, in any locale, which is why it failed
|
||||
* identically in en and ar.
|
||||
*
|
||||
* ★ THE NUMBERS THIS GATE PINS, measured on the committed fixture (864 distinct label/value pairs,
|
||||
* 805 base language tiers):
|
||||
* OLD exact-label rule: 61 tiers resolved "" -> the grid went to zero. "Arabic" was one.
|
||||
* NEW rule: 764 tiers resolve ONE code (the grid filters), 41 cover several and
|
||||
* abstain honestly.
|
||||
* The 41 are real ambiguity, not a bug: "Arabic" alone means 22 ISO codes, so no single value can
|
||||
* express it. Sending one of them would show a fraction of the selection while looking correct;
|
||||
* sending the tier NAME shows zero. Abstaining is the only option that does not lie, until
|
||||
* filterSet goes multi-value (SPEC-DASHBOARD-KIT D1).
|
||||
*
|
||||
* ★ ONE APPROXIMATION, STATED RATHER THAN HIDDEN. The gate derives the tier set by splitting each
|
||||
* label at the first comma. The legend derives `langKey` by a longer route (family lookup, suffix
|
||||
* patterns), so the two sets are close but not provably identical — a tier the legend shows and
|
||||
* this split does not would go unchecked. What IS exact is the part that broke: check B proves the
|
||||
* emitter's predicate and the legend's filter agree on every (label, tier) pair, so the two ends
|
||||
* cannot drift apart again whatever the tier set turns out to be.
|
||||
*
|
||||
* WHAT IT CHECKS — all of it against the SHIPPING SOURCE, lifted, never re-typed:
|
||||
* A. the emitter's match rule exists and is the legend's three-arm rule (base / "base," prefix /
|
||||
* " base" suffix), evaluated against the fixture.
|
||||
* B. the legend's own filter expression still has those same three arms — because the ONE thing
|
||||
* that caused this bug was two spellings of one rule drifting apart. A fourth spelling is the
|
||||
* next bug, so the gate compares the two that exist.
|
||||
* C. for every base tier: exactly one code -> a NON-EMPTY languageCode; several -> an EMPTY
|
||||
* languageCode AND a populated languageCodes.
|
||||
* D. the composite fails OPEN: gridLanguage() must return '' when the selection covers several
|
||||
* codes. Returning the label there is what produced the empty grid.
|
||||
* E. no tier may produce a value that selects zero rows. That is the user-visible invariant and
|
||||
* it is asserted directly, not inferred.
|
||||
*
|
||||
* NO NETWORK, NO BROWSER (Playwright is rega's alone). The fixture is committed and was taken from
|
||||
* the live source; refresh it with --refresh-fixture when the source's language set changes.
|
||||
*
|
||||
* NEGATIVE-TESTED 2026-09-26, each FAILS:
|
||||
* the emitter's rule reverted to `lab === base` -> A, then C/E naming "Arabic"
|
||||
* the comma-prefix arm dropped from the emitter -> A (disagrees with the legend)
|
||||
* the legend's filter arms changed without the emitter -> B
|
||||
* gridLanguage() reverted to `value || label` -> D
|
||||
*/
|
||||
import { readFileSync, writeFileSync, existsSync } from 'node:fs'
|
||||
import { resolve, dirname, join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const TAG = 'LANGUAGE-CODE-LINK'
|
||||
const HERE = dirname(fileURLToPath(import.meta.url))
|
||||
const ROOT = resolve(HERE, '..', '..', '..')
|
||||
const EMITTER = join(ROOT, 'plugin-designs/doxa-research-map/research-map.vue')
|
||||
const COMPOSITE = join(ROOT, 'plugin-designs/research-map-plus-grid/research-map-plus-grid.vue')
|
||||
const LEGEND = join(ROOT, 'library/composables/legends/useLanguageFamilyLegendData.js')
|
||||
const FIXTURE = join(HERE, 'fixtures', 'language-codes.json')
|
||||
|
||||
const fails = []
|
||||
const notes = []
|
||||
|
||||
// ── --refresh-fixture: the only thing here that touches the network ──────────────────────────
|
||||
if (process.argv.includes('--refresh-fixture')) {
|
||||
const sources = JSON.parse(readFileSync(join(ROOT, 'library/api/sources.json'), 'utf8'))
|
||||
const cfg = sources.sources[sources.activeSource]
|
||||
const url = `https://pray.doxa.life${cfg.endpoints.bulk}?fields=${cfg.defaultFields.join(',')}&lang=en`
|
||||
const j = await (await fetch(url, { signal: AbortSignal.timeout(60000) })).json()
|
||||
const rows = j.posts || j.data || []
|
||||
// Deduplicate by the (label,value) PAIR — never sample. Both questions this fixture answers
|
||||
// (does the exact label exist; how many codes does this tier cover) must be asked of the
|
||||
// complete language set, or the counts above are about a sample and mean nothing.
|
||||
const seen = new Set(); const keep = []
|
||||
for (const r of rows) {
|
||||
const l = r.primary_language
|
||||
if (!l || !l.label || !l.value) continue
|
||||
const k = l.label + '\u0000' + l.value
|
||||
if (seen.has(k)) continue
|
||||
seen.add(k)
|
||||
keep.push({ primary_language: { value: l.value, label: l.label } })
|
||||
}
|
||||
writeFileSync(FIXTURE, JSON.stringify(keep) + '\n')
|
||||
console.log(`${TAG}: fixture refreshed — ${rows.length} api rows -> ${keep.length} distinct (label,value) pairs.`)
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
if (!existsSync(FIXTURE)) { console.log(`${TAG}: SKIP — no fixture (run with --refresh-fixture).`); process.exit(0) }
|
||||
const rows = JSON.parse(readFileSync(FIXTURE, 'utf8'))
|
||||
const emitterSrc = readFileSync(EMITTER, 'utf8')
|
||||
const compositeSrc = readFileSync(COMPOSITE, 'utf8')
|
||||
const legendSrc = readFileSync(LEGEND, 'utf8')
|
||||
|
||||
// ── A. lift the emitter's match rule and run it ──────────────────────────────────────────────
|
||||
// Lifted, not re-typed: a gate that carries its own copy of the rule passes while the product is
|
||||
// broken, which is precisely how the bug above survived a green check:linked-vocabulary.
|
||||
const mRule = /const matchesLanguage = \(lab, base\) =>\s*([\s\S]*?)\n\s*const selectedRows/.exec(emitterSrc)
|
||||
let matchesLanguage = null
|
||||
if (!mRule) {
|
||||
fails.push('A research-map.vue: no `const matchesLanguage = (lab, base) =>` — the emitter\'s match rule moved or was renamed, so this gate is blind to the line that broke.')
|
||||
} else {
|
||||
try { matchesLanguage = new Function('lab', 'base', `return (${mRule[1].trim()})`) } catch (e) {
|
||||
fails.push(`A research-map.vue: the lifted match rule does not evaluate (${e.message}).`)
|
||||
}
|
||||
}
|
||||
|
||||
// ── B. the legend's own filter must still be the same three arms ─────────────────────────────
|
||||
// This is the drift guard. The bug was two spellings of one rule disagreeing; the fix mirrors the
|
||||
// legend's expression in JS, so the gate's job is to notice when the original moves.
|
||||
{
|
||||
const node = /id:\s*`lang:\$\{fam\.key\}__\$\{langKey\}`[\s\S]*?filter: \[([\s\S]*?)\],\n\s*children: \[\],/.exec(legendSrc)
|
||||
if (!node) {
|
||||
fails.push('B useLanguageFamilyLegendData.js: could not find the `lang:` node\'s filter expression — the legend\'s own rule moved, and the emitter mirrors it.')
|
||||
} else {
|
||||
const f = node[1]
|
||||
const arms = [
|
||||
[/\['==', \['get', 'language'\], langKey\]/, 'exact match on the base name'],
|
||||
[/\['==', \['slice', \['get', 'language'\], 0, langKey\.length \+ 1\], langKey \+ ','\]/, 'the "base," comma-prefix arm'],
|
||||
[/\['in', ' ' \+ langKey, \['get', 'language'\]\]/, 'the " base" suffix-contains arm'],
|
||||
]
|
||||
for (const [re, what] of arms) {
|
||||
if (!re.test(f)) fails.push(`B useLanguageFamilyLegendData.js: the language node's filter no longer has ${what}. research-map.vue's matchesLanguage() mirrors these three arms — change both together, or the map and the grid select different rows again.`)
|
||||
}
|
||||
if (matchesLanguage) {
|
||||
// And prove the mirror on real data rather than on the text: the JS rule must agree with the
|
||||
// expression's semantics for every label in the fixture.
|
||||
const expr = (lab, base) => lab === base || lab.slice(0, base.length + 1) === base + ',' || lab.includes(' ' + base)
|
||||
let disagreements = 0
|
||||
const bases = new Set(rows.map((r) => String(r.primary_language.label).split(',')[0].trim()))
|
||||
for (const base of bases) for (const r of rows) {
|
||||
const lab = String(r.primary_language.label).trim()
|
||||
if (expr(lab, base) !== !!matchesLanguage(lab, base)) disagreements++
|
||||
}
|
||||
if (disagreements) fails.push(`B the emitter's matchesLanguage() disagrees with the legend's filter on ${disagreements} (label, tier) pair(s).`)
|
||||
else notes.push(`match rule: agrees with the legend's three-arm filter on every one of ${bases.size} tiers x ${rows.length} labels`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── C/E. every tier resolves to a code, or abstains — and never to an empty grid ──────────────
|
||||
if (matchesLanguage) {
|
||||
const byBase = new Map()
|
||||
for (const r of rows) {
|
||||
const b = String(r.primary_language.label).split(',')[0].trim()
|
||||
if (!byBase.has(b)) byBase.set(b, [])
|
||||
byBase.get(b).push(r)
|
||||
}
|
||||
let single = 0, many = 0
|
||||
const zeroSelecting = []
|
||||
for (const [base, tierRows] of byBase) {
|
||||
const selected = rows.filter((r) => matchesLanguage(String(r.primary_language.label).trim(), base))
|
||||
// E: the tier the user clicked must select SOMETHING. A tier that selects nothing is the
|
||||
// 2,107 -> 0 screen by another route.
|
||||
if (!selected.length) { zeroSelecting.push(base); continue }
|
||||
const codes = [...new Set(selected.map((r) => r.primary_language.value).filter(Boolean))]
|
||||
const languageCode = codes.length === 1 ? codes[0] : ''
|
||||
if (codes.length === 1) {
|
||||
single++
|
||||
if (!languageCode) fails.push(`C "${base}" covers exactly one code but resolved an empty languageCode.`)
|
||||
} else {
|
||||
many++
|
||||
if (languageCode) fails.push(`C "${base}" covers ${codes.length} codes but still emitted a single languageCode — one of them would show a fraction of the selection while looking correct.`)
|
||||
if (!codes.length) fails.push(`C "${base}" resolved no codes at all.`)
|
||||
}
|
||||
}
|
||||
if (zeroSelecting.length) {
|
||||
fails.push(`E ${zeroSelecting.length} language tier(s) select ZERO rows, so clicking them empties the grid: ${zeroSelecting.slice(0, 6).join(', ')}`)
|
||||
}
|
||||
notes.push(`tiers: ${byBase.size} — ${single} resolve one code (the grid filters), ${many} cover several (the axis is left open)`)
|
||||
if (many === 0) fails.push('C no tier in the fixture covers several codes, so the ambiguous path is untested — the fixture was sampled rather than deduplicated.')
|
||||
}
|
||||
|
||||
// ── D. the composite fails OPEN ──────────────────────────────────────────────────────────────
|
||||
{
|
||||
const g = /function gridLanguage\(\) \{([\s\S]*?)\n\}/.exec(compositeSrc)
|
||||
if (!g) {
|
||||
fails.push('D research-map-plus-grid.vue: no gridLanguage() — the composite is back to sending `value || label`, which hands the grid a tier NAME no row carries and empties it.')
|
||||
} else {
|
||||
let fn = null
|
||||
try { fn = new Function('linked', `${g[1]}`) } catch (e) { fails.push(`D gridLanguage() does not evaluate (${e.message}).`) }
|
||||
if (fn) {
|
||||
const many = { language: { value: '', label: 'Arabic', codes: ['apd', 'acm', 'ayl'] } }
|
||||
const one = { language: { value: 'ben', label: 'Bengali', codes: ['ben'] } }
|
||||
if (fn(many) !== '') fails.push(`D gridLanguage() returned ${JSON.stringify(fn(many))} for a selection covering 3 codes — it must return '' and leave the axis unfiltered. Returning the label is what took the grid to 0.`)
|
||||
if (fn(one) !== 'ben') fails.push(`D gridLanguage() returned ${JSON.stringify(fn(one))} for an unambiguous selection — it must send the single code.`)
|
||||
if (!fails.some((f) => f.startsWith('D'))) notes.push('composite: gridLanguage() sends the code when there is one and abstains when there is not')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const n of notes) console.log(' · ' + n)
|
||||
if (fails.length) {
|
||||
console.error(`\n${TAG}: FAIL`)
|
||||
for (const f of fails) console.error(' ' + f)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`${TAG}: PASS — every language tier reaches the grid as a code, or honestly narrows nothing.`)
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -48,20 +48,9 @@ const profileModules = import.meta.glob('./*.vue')
|
|||
// No-op today: doxa-simple-map ships no local strategies (empty glob).
|
||||
registerStrategies(import.meta.glob('./src/colors/*.js', { eager: true }))
|
||||
|
||||
// ─── Mapbox RTL text plugin — load ONCE before any map instance ──────────────
|
||||
// Required for proper rendering of Arabic text on the basemap.
|
||||
// Lazy = plugin loads only when RTL text is first encountered.
|
||||
if (typeof window !== 'undefined' && window.mapboxgl?.setRTLTextPlugin) {
|
||||
try {
|
||||
window.mapboxgl.setRTLTextPlugin(
|
||||
'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.3.0/mapbox-gl-rtl-text.js',
|
||||
null,
|
||||
true // lazy
|
||||
)
|
||||
} catch (_) {
|
||||
// Plugin already set in this session — ignore.
|
||||
}
|
||||
}
|
||||
// RTL text plugin (Arabic/Hebrew/Persian shaping): installed by useMapInstance through
|
||||
// library/maps/rtl-text.js, on BOTH engines, before every map is constructed. Do not re-add a
|
||||
// hand-rolled mapboxgl-only block here -- it was a strict subset of that call.
|
||||
|
||||
/**
|
||||
* Build a fresh defineCustomElement-wrapped class.
|
||||
|
|
|
|||
|
|
@ -38,20 +38,9 @@ import { createAppI18n } from '@map/i18n/index.js'
|
|||
// app.provide('profileModules', ...) below.
|
||||
const profileModules = import.meta.glob('./*.vue')
|
||||
|
||||
// ─── Mapbox RTL text plugin — load ONCE before any map instance ──────────────
|
||||
// Required for proper rendering of Arabic text on the basemap.
|
||||
// Lazy = plugin loads only when RTL text is first encountered.
|
||||
if (typeof window !== 'undefined' && window.mapboxgl?.setRTLTextPlugin) {
|
||||
try {
|
||||
window.mapboxgl.setRTLTextPlugin(
|
||||
'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.3.0/mapbox-gl-rtl-text.js',
|
||||
null,
|
||||
true // lazy
|
||||
)
|
||||
} catch (_) {
|
||||
// Plugin already set in this session — ignore.
|
||||
}
|
||||
}
|
||||
// RTL text plugin (Arabic/Hebrew/Persian shaping): installed by useMapInstance through
|
||||
// library/maps/rtl-text.js, on BOTH engines, before every map is constructed. Do not re-add a
|
||||
// hand-rolled mapboxgl-only block here -- it was a strict subset of that call.
|
||||
|
||||
/**
|
||||
* Build the defineCustomElement-wrapped class for this bundle.
|
||||
|
|
|
|||
|
|
@ -604,8 +604,24 @@ function buildMatchColorExpr(zones) {
|
|||
}
|
||||
|
||||
function ensureLayers() {
|
||||
if (map.getSource('tapestry')) return
|
||||
map.addSource('tapestry', { type: 'geojson', data: tapestry })
|
||||
// ⚠ GUARD ON THE LAYERS, NOT ONLY THE SOURCE — "the source exists" and "the layers exist" are two
|
||||
// properties, and this function's job is the second one. The old guard was
|
||||
// `if (map.getSource('tapestry')) return`, which returns and adds NOTHING whenever the source
|
||||
// survives while the layers are gone. That state is real: a style reload wipes LAYERS, and a source
|
||||
// can be present without them.
|
||||
// ⚠ THIS IS NOT THE CAUSE OF THE BLANK ENGLISH README SHOT, and I want that on record because I
|
||||
// diagnosed it as such and was wrong. rega settled that one with the measurement I did not have:
|
||||
// the leaf paints 9.5-16.5 s after load and the screenshot tool waited 7 s. A timeout, not a defect.
|
||||
// I had built a confident chain — source-survives-layers, half-built style, en/ar divergence — that
|
||||
// explained the symptom without being true of it.
|
||||
// THE GUARD BUG IS STILL REAL, on its own merits and on a different path: setStyle() (the
|
||||
// light/dark toggle) wipes LAYERS, and a source can outlive them, so the old guard returns having
|
||||
// added nothing. That is why paintAll is re-armed on 'style.load' at :1625 — the re-add is a real
|
||||
// code path, and this guard could silently no-op it.
|
||||
// ensureSelectionLayers():652 already had the right shape (source AND getLayer) — the correct
|
||||
// pattern was in this file and these two functions did not copy it. addPinLayers had the same bug.
|
||||
if (map.getSource('tapestry') && map.getLayer('tapestry-fill') && map.getLayer('tapestry-line')) return
|
||||
if (!map.getSource('tapestry')) map.addSource('tapestry', { type: 'geojson', data: tapestry })
|
||||
// 09b light-default L-D2: the neon cyber palette runs hot on white. ensureLayers
|
||||
// is called on the initial draw AND on every post-setStyle theme re-add, so we
|
||||
// read isDark.value HERE (JS state, not a map expression) to pick per-theme
|
||||
|
|
@ -614,22 +630,30 @@ function ensureLayers() {
|
|||
// the bright tapestry-LINE outline carries the glow on light either way.
|
||||
const deafOpacity = isDark.value ? 0.45 : 0.30
|
||||
const othersOpacity = isDark.value ? 0.65 : 0.45
|
||||
map.addLayer({
|
||||
id: 'tapestry-fill',
|
||||
type: 'fill',
|
||||
source: 'tapestry',
|
||||
paint: {
|
||||
'fill-color': matchColorExpr,
|
||||
'fill-opacity': ['case', ['==', ['get', 'zoneKey'], 'deaf'], deafOpacity, othersOpacity],
|
||||
},
|
||||
})
|
||||
map.addLayer({
|
||||
id: 'tapestry-line',
|
||||
type: 'line',
|
||||
source: 'tapestry',
|
||||
// F2-D2: brighter, thicker outline gives contrast on dark without washing out light.
|
||||
paint: { 'line-color': matchColorExpr, 'line-width': 1.2, 'line-opacity': 0.9 },
|
||||
})
|
||||
// ⚠ EACH LAYER IS GUARDED SEPARATELY, because the two can be lost independently — and addLayer
|
||||
// THROWS on an id that already exists, which would abort this function and skip everything after it.
|
||||
// A half-built style is exactly the state this fix exists for, so it must not be made worse by
|
||||
// re-adding a survivor.
|
||||
if (!map.getLayer('tapestry-fill')) {
|
||||
map.addLayer({
|
||||
id: 'tapestry-fill',
|
||||
type: 'fill',
|
||||
source: 'tapestry',
|
||||
paint: {
|
||||
'fill-color': matchColorExpr,
|
||||
'fill-opacity': ['case', ['==', ['get', 'zoneKey'], 'deaf'], deafOpacity, othersOpacity],
|
||||
},
|
||||
})
|
||||
}
|
||||
if (!map.getLayer('tapestry-line')) {
|
||||
map.addLayer({
|
||||
id: 'tapestry-line',
|
||||
type: 'line',
|
||||
source: 'tapestry',
|
||||
// F2-D2: brighter, thicker outline gives contrast on dark without washing out light.
|
||||
paint: { 'line-color': matchColorExpr, 'line-width': 1.2, 'line-opacity': 0.9 },
|
||||
})
|
||||
}
|
||||
|
||||
// ★ THE REAL READINESS SIGNAL. onLegendSelect() returns early unless map.getLayer('tapestry-fill')
|
||||
// exists, so a "Show on map" request that arrives before this function runs cannot hold a
|
||||
|
|
@ -1579,9 +1603,18 @@ function onLegendSelect(node) {
|
|||
// the boot path stranded. Every helper inside is idempotent (guards on
|
||||
// getSource()/getLayer()), so over-calling is safe; under-calling is the bug.
|
||||
function paintAll() {
|
||||
if (!map || !tapestry) return // data pipeline not done yet
|
||||
ensureLayers() // tapestry fill + line
|
||||
if (!map) return
|
||||
// ★ IT PAINTS WHAT IS READY, rather than refusing until everything is. The old guard was
|
||||
// `if (!map || !tapestry) return`, which meant the PINS could not be drawn until the boundaries had
|
||||
// been fetched AND parsed — and rega's baseline trace showed the parse, not the network, is the
|
||||
// 5.6-6.4 s cost. The pins need only the 68 KB records list. Every step below is idempotent and
|
||||
// guards its own source and layers, so calling this twice (once with pins only, once when the
|
||||
// tapestry lands) adds each thing exactly once.
|
||||
// ⚠ tapestry STAYS WHOLE-OR-NULL. This does not paint a partial tapestry; it simply does not block
|
||||
// the pins on one. boundsFor(), the search index and the telemetry keep their invariant.
|
||||
if (typeof addPinLayers === 'function') addPinLayers()
|
||||
if (!tapestry) return // territories not resolved yet — pins are up, come back
|
||||
ensureLayers() // tapestry fill + line
|
||||
// 09b shift-select: re-add the selection highlight layers + re-bind the
|
||||
// shift-click handler + re-apply the current selection paint so a user's
|
||||
// in-progress land division survives a dark/light toggle.
|
||||
|
|
@ -2023,24 +2056,57 @@ onMounted(async () => {
|
|||
if (!r.ok) throw new Error(`boundary fetch ${r.status} ${f}`)
|
||||
return r.json()
|
||||
})
|
||||
const [adm0, adm1Ind, adm1Chn] = await Promise.all([
|
||||
getJSON('world-adm0.geojson'),
|
||||
getJSON('gb-IND-ADM1.geojson'),
|
||||
getJSON('gb-CHN-ADM1.geojson'),
|
||||
])
|
||||
|
||||
// ── live records WITH rop1 + population (full record; LESSON L3 / slice 04u) ──
|
||||
// population resolves the deaf A017 row AND the legend's second column; one
|
||||
// full fetch, no per-slice field subsets.
|
||||
status.value = 'fetching 2106 UUPGs…'
|
||||
// ★ THE API REQUEST IS ISSUED NOW, NOT AFTER THE BOUNDARIES. Measured 2026-09-26: this chain was
|
||||
// strictly serial — `await Promise.all([3 boundaries])` and only THEN `await fetch(API)` — so
|
||||
// 3,549 KB of geojson (world-adm0 1,866 + gb-IND-ADM1 1,628 + gb-CHN-ADM1 54) had to download AND
|
||||
// JSON.parse before the API request was even sent. rega measured the first paint at 9.5-16.5 s.
|
||||
// Starting the fetch here overlaps the two; nothing below needs the boundaries to BUILD the URL.
|
||||
// ⚠ NOT awaited here — the promise is created and awaited further down, so a rejection surfaces at
|
||||
// the same place in the same try/catch as before. Creating it early changes WHEN the request goes
|
||||
// out, not where its failure lands.
|
||||
if (!API_BASE) {
|
||||
// Fail closed — no data host configured (window.MAP_APP_API_URL / VITE_API_BASE_URL).
|
||||
throw new Error('No API base configured — set window.MAP_APP_API_URL or VITE_API_BASE_URL. Failing closed (no default host).')
|
||||
}
|
||||
const fields = 'slug,name,country_code,wagf_region,wagf_block,rop1,population,latitude,longitude'
|
||||
const resp = await fetch(`${API_BASE}/api/people-groups/list?fields=${fields}&lang=en`, { cache: 'no-store' })
|
||||
if (!resp.ok) throw new Error(`list ${resp.status}`)
|
||||
const records = normalizeRecords(await applyPeopleGroupList(extractRecords(await resp.json()), profileConfig))
|
||||
const _fields = 'slug,name,country_code,wagf_region,wagf_block,rop1,population,latitude,longitude'
|
||||
// ⚠ NO `cache: 'no-store'`. It forced a full re-download of ~870 KB on every reload, including a
|
||||
// hard refresh during development, and this list changes on the order of days — not within a
|
||||
// session. The default HTTP cache honours whatever the API's own headers say, which is the
|
||||
// server's call to make rather than this client's. A reader who needs today's data gets it from
|
||||
// the API's cache headers; a reader reloading a page gets an instant map.
|
||||
const recordsPromise = fetch(`${API_BASE}/api/people-groups/list?fields=${_fields}&lang=en`)
|
||||
.then((r) => { if (!r.ok) throw new Error(`list ${r.status}`); return r.json() })
|
||||
|
||||
// ★ ALL THREE BOUNDARY DOWNLOADS START HERE and none is awaited yet. They are held as promises so
|
||||
// the records (68 KB) can be awaited first and the PINS drawn while these 3.6 MB are still being
|
||||
// fetched and — the real cost — parsed by MapLibre's workers.
|
||||
// ⚠ CREATED BEFORE ANY await, NOT AFTER. An earlier version put one of these under a Promise.all
|
||||
// and it overlapped nothing: a promise created after an await starts only once that await
|
||||
// resolves, so the code read as parallel and behaved strictly serially.
|
||||
const boundaryPromises = {
|
||||
adm0: getJSON('world-adm0.geojson'),
|
||||
adm1Chn: getJSON('gb-CHN-ADM1.geojson'),
|
||||
// 1,628 KB, and only the India pg_slugs zones need it.
|
||||
adm1Ind: getJSON('gb-IND-ADM1.geojson'),
|
||||
}
|
||||
|
||||
// ── live records WITH rop1 + population (full record; LESSON L3 / slice 04u) ──
|
||||
// population resolves the deaf A017 row AND the legend's second column; one
|
||||
// full fetch, no per-slice field subsets.
|
||||
//
|
||||
// ★ THE RECORDS ARE AWAITED BEFORE THE BOUNDARIES, so the pins can be drawn while MapLibre is still
|
||||
// parsing 3.6 MB of GeoJSON. rega traced the baseline (main ccc2b1bb, tokenless MapLibre, software
|
||||
// GL) and the finding overturned my own profile: every key byte arrives by 1.2-2.9 s, but the first
|
||||
// territory draws 5.6-6.4 s LATER, and only ~2.6 s of that gap is main-thread long tasks. The rest
|
||||
// is MapLibre's WORKERS parsing and tiling the boundaries. I had profiled file sizes and request
|
||||
// order — the artifact — and concluded the download was the cost; on localhost those 3.6 MB arrive
|
||||
// in ~230 ms. Reordering requests was never going to reach 3 s because PARSING is the bottleneck.
|
||||
// The pins need none of it: they are built from `records` (lat/lng) and slugToZone, and the
|
||||
// selector evaluate() at the pin build maps slugs to zone keys without touching any geometry.
|
||||
// 68 KB, arriving at ~2.9 s cold.
|
||||
status.value = 'fetching 2106 UUPGs…'
|
||||
const records = normalizeRecords(await applyPeopleGroupList(extractRecords(await recordsPromise), profileConfig))
|
||||
// 09b shift-select §1(b): build iso3→display-name from the LIVE records so an
|
||||
// ADM0 country click resolves to the exact label the legend shows (the ADM0
|
||||
// geojson features carry only iso3 — no name). Falls back to ISO3_NAME inside
|
||||
|
|
@ -2051,17 +2117,6 @@ onMounted(async () => {
|
|||
// 04u §1b). Selectors/colors/counts are unchanged; only `pop` is added.
|
||||
legendNodes.value = buildLegendNodes(clusters, { deafCount: DEAF_COUNT, records })
|
||||
|
||||
// ── resolve all 26 zones → ONE tapestry FeatureCollection ────────────────
|
||||
const { tapestry: fc, perZone } = resolveAllZones(leafZoneList, { records, adm0, adm1Ind, adm1Chn })
|
||||
tapestry = markRaw(fc)
|
||||
|
||||
// 09b-search-bar §1(a/c) + 09b-search-reuse-geocoder: build the unified
|
||||
// search index + the geocoder feed. P0 fix (LESSON-03 L3): this MUST run
|
||||
// AFTER `tapestry = markRaw(fc)` — the geocoder feed's centroidFor calls
|
||||
// boundsFor(), which iterates tapestry.features; calling it before the
|
||||
// tapestry exists threw "can't access property 'features', tapestry is null"
|
||||
// into the pipeline catch, killing tapestry + pins + search (blank-ish UI).
|
||||
buildSearch(records)
|
||||
|
||||
// ── pins layer (kept from 04b, now stamped with zoneKey for isolate dim) ──
|
||||
// build slug→zoneKey using the same selectors (first match wins; regional before asia)
|
||||
|
|
@ -2118,8 +2173,14 @@ onMounted(async () => {
|
|||
// Pin layer add, factored out so BOTH the initial draw() and the post-setStyle
|
||||
// theme re-add (handleToggleTheme) can call it. Idempotent: guards getSource('upg').
|
||||
addPinLayers = () => {
|
||||
if (map.getSource('upg')) return
|
||||
map.addSource('upg', { type: 'geojson', data: pinFC })
|
||||
// ⚠ SAME BUG, SAME FIX as ensureLayers():606 — guard on the LAYER, not only the source. The old
|
||||
// `if (map.getSource('upg')) return` adds nothing whenever the source survives a style reload
|
||||
// while 'upg-pins' does not. NOT the cause of the blank English README shot (that was a 7 s
|
||||
// screenshot wait against a 9.5-16.5 s first paint — rega measured it); this is the
|
||||
// setStyle/theme-toggle path, where the re-add is real and could silently no-op.
|
||||
if (map.getSource('upg') && map.getLayer('upg-pins')) return
|
||||
if (!map.getSource('upg')) map.addSource('upg', { type: 'geojson', data: pinFC })
|
||||
if (map.getLayer('upg-pins')) { attachPinHandlers(); return }
|
||||
map.addLayer({
|
||||
id: 'upg-pins', type: 'circle', source: 'upg', paint: {
|
||||
// BUG-UPG100-DOTS-HARD-TO-SEE (2026-09-19): the previous floor (2.5px @ low zoom,
|
||||
|
|
@ -2166,6 +2227,45 @@ onMounted(async () => {
|
|||
attachPinHandlers()
|
||||
}
|
||||
|
||||
// ★ PAINT THE PINS NOW, before the boundaries are awaited. This is the whole point of the reorder:
|
||||
// something useful on screen at ~3 s instead of 7-9 s. It uses the SAME readiness rule as the boot
|
||||
// gate below (style loaded, or wait for it) — the map may not have finished its style yet, and
|
||||
// addSource/addLayer require a loaded style.
|
||||
// ⚠ FIRE-AND-FORGET, NOT AWAITED. The boundary await below must not be delayed by waiting on the
|
||||
// style; if the style is slow the pins simply appear a little later, and the boot gate repaints
|
||||
// everything regardless. paintAll is idempotent, so the two paths cannot double-add.
|
||||
const paintPinsEarly = () => { try { paintAll() } catch (e) { console.warn('early pin paint skipped', e && e.message) } }
|
||||
if (map.isStyleLoaded()) paintPinsEarly()
|
||||
else map.once('style.load', paintPinsEarly)
|
||||
|
||||
// ── NOW the boundaries, and the territories behind the pins ───────────────
|
||||
// ★ EVERYTHING ABOVE THIS LINE NEEDS ONLY THE 68 KB RECORDS LIST. The boundary await sits HERE so
|
||||
// the pin layer can be added while MapLibre's workers are still parsing 3.6 MB of GeoJSON —
|
||||
// rega's baseline trace showed the first territory drawing 5.6-6.4 s after the last key byte
|
||||
// arrived, and only ~2.6 s of that is main-thread work. Parsing is the bottleneck, not the network,
|
||||
// so putting SOMETHING useful on screen means drawing what does not need parsing.
|
||||
// (dx-shepherd ENDTOKEN-DXS-UPG-PINSFIRST; it replaced my two-pass-zones plan, which would still
|
||||
// have waited on world-adm0.)
|
||||
status.value = 'loading boundaries…'
|
||||
const [adm0, adm1Chn] = await Promise.all([boundaryPromises.adm0, boundaryPromises.adm1Chn])
|
||||
const adm1Ind = await boundaryPromises.adm1Ind
|
||||
|
||||
// ── resolve all 26 zones → ONE tapestry FeatureCollection ────────────────
|
||||
// ⚠ `tapestry` IS ASSIGNED ONLY WHEN ALL 27 ZONES ARE RESOLVED — whole or null, never partial. It
|
||||
// backs boundsFor() (fly-to and zone framing), the search index and the status telemetry, so a
|
||||
// half-built tapestry would answer a reader's search or click with wrong bounds and missing hits.
|
||||
// Drawing the pins early does not touch it: the pin layer is its own source.
|
||||
const { tapestry: fc, perZone } = resolveAllZones(leafZoneList, { records, adm0, adm1Ind, adm1Chn })
|
||||
tapestry = markRaw(fc)
|
||||
|
||||
// 09b-search-bar §1(a/c) + 09b-search-reuse-geocoder: build the unified
|
||||
// search index + the geocoder feed. P0 fix (LESSON-03 L3): this MUST run
|
||||
// AFTER `tapestry = markRaw(fc)` — the geocoder feed's centroidFor calls
|
||||
// boundsFor(), which iterates tapestry.features; calling it before the
|
||||
// tapestry exists threw "can't access property 'features', tapestry is null"
|
||||
// into the pipeline catch, killing tapestry + pins + search (blank-ish UI).
|
||||
buildSearch(records)
|
||||
|
||||
// ── boot paint gate (P0 4188af3d / LESSON-03 L7+L10+L31) ─────────────────
|
||||
// BUG-1 (04t) taught us addSource/addLayer require the STYLE to be loaded —
|
||||
// but its gate `if (map.isStyleLoaded()) draw(); else map.once('style.load',
|
||||
|
|
|
|||
|
|
@ -12,14 +12,9 @@ import { createAppI18n } from '@map/i18n/index.js'
|
|||
|
||||
const profileModules = import.meta.glob('./*.vue')
|
||||
|
||||
if (typeof window !== 'undefined' && window.mapboxgl?.setRTLTextPlugin) {
|
||||
try {
|
||||
window.mapboxgl.setRTLTextPlugin(
|
||||
'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.3.0/mapbox-gl-rtl-text.js',
|
||||
null, true
|
||||
)
|
||||
} catch (_) { /* already set this session */ }
|
||||
}
|
||||
// RTL text plugin (Arabic/Hebrew/Persian shaping): installed by useMapInstance through
|
||||
// library/maps/rtl-text.js, on BOTH engines, before every map is constructed. Do not re-add a
|
||||
// hand-rolled mapboxgl-only block here -- it was a strict subset of that call.
|
||||
|
||||
const El = defineCustomElement(ProfileLoader, {
|
||||
configureApp(app) {
|
||||
|
|
|
|||
|
|
@ -30,6 +30,10 @@ const A11Y_EN = {
|
|||
'legend.a11y.expandRow': 'Expand {label}', 'legend.a11y.collapseRow': 'Collapse {label}',
|
||||
'legend.a11y.clearSelection': 'Clear selection',
|
||||
'aria.expandLegend': 'Expand legend', 'aria.collapseLegend': 'Collapse legend',
|
||||
// The legend's own states and hints (keys shared with library/components/legends/SemanticTreeLegend.vue).
|
||||
'legend.loadingRows': 'Loading {label}…', 'legend.loadingData': 'Loading data…',
|
||||
'legend.noDataAtThisLevel': 'No data at this level', 'legend.showingTop': 'Showing top {n} of {m}',
|
||||
'legend.useGeocoderHint': 'use the geocoder above to find the rest',
|
||||
}
|
||||
const fillA11y = (str, p) => String(str).replace(/\{(\w+)\}/g, (m, k) => (p && k in p ? p[k] : m))
|
||||
let ta = (key, p) => fillA11y(A11Y_EN[key] ?? key, p)
|
||||
|
|
@ -487,14 +491,13 @@ function rowClasses(row) {
|
|||
|
||||
<div v-if="tabLoading && !visibleRows.length" class="stl-empty stl-loading">
|
||||
<span class="stl-spinner"></span>
|
||||
<span>Loading {{ tabList[activeTab]?.label || 'rows' }}…</span>
|
||||
<span>{{ ta('legend.loadingRows', { label: tabList[activeTab]?.label || 'rows' }) }}</span>
|
||||
</div>
|
||||
<div v-else-if="!visibleRows.length && nodes.length === 0" class="stl-empty">Loading data…</div>
|
||||
<div v-else-if="!visibleRows.length" class="stl-empty">No data at this level</div>
|
||||
<div v-else-if="!visibleRows.length && nodes.length === 0" class="stl-empty">{{ ta('legend.loadingData') }}</div>
|
||||
<div v-else-if="!visibleRows.length" class="stl-empty">{{ ta('legend.noDataAtThisLevel') }}</div>
|
||||
<div v-if="topNodesOverflow > 0" class="stl-overflow">
|
||||
Showing top {{ tabList[activeTab].topLimit.toLocaleString() }} of
|
||||
{{ topNodesAll.length.toLocaleString() }} —
|
||||
<span class="stl-overflow-hint">use the geocoder above to find the rest</span>
|
||||
{{ ta('legend.showingTop', { n: tabList[activeTab].topLimit.toLocaleString(), m: topNodesAll.length.toLocaleString() }) }} —
|
||||
<span class="stl-overflow-hint">{{ ta('legend.useGeocoderHint') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
* config.searchKeys drive which axes show + what the text search matches. The geocoder-based
|
||||
* DashboardSearchHeader (DOXA-LIB-3) remains available in the kit but is not mounted here.
|
||||
*/
|
||||
import { computed, watch, inject, ref, unref, onMounted } from 'vue'
|
||||
import { computed, watch, inject, ref, unref, onMounted, onBeforeUnmount } from 'vue'
|
||||
import { tStatic } from '@map/i18n/index.js'
|
||||
|
||||
// This component's chrome, read out of the catalogue. tStatic and not useI18n: these mount inside
|
||||
|
|
@ -133,7 +133,79 @@ const pageScroll = computed(() => unref(hostConfig)?.layout === 'page-scroll')
|
|||
// The assembler: creates+provides the bus/data/config, computes the linked surface.
|
||||
// Passed the MERGED config so a host-set `provider` reaches DashboardMapPanel via
|
||||
// inject('dashboardConfig'). With no host config this is byte-for-byte the previous behaviour.
|
||||
const { bus, data, kpis, exporter, responsive } = useDashboardShell(mergedConfig.value)
|
||||
const { bus, data, kpis, exporter, responsive, filteredRows } = useDashboardShell(mergedConfig.value)
|
||||
|
||||
// ── ★ ANNOUNCE THE RESULT OF A FILTER (the dashboard's largest screen-reader gap) ─────────────
|
||||
// THE DEFECT, measured 2026-09-26: this element contained exactly ONE role="status" (the table's
|
||||
// selection pill) and ZERO aria-live regions. That is the specific way a cross-filtering dashboard
|
||||
// fails a screen-reader user, and it is invisible to everyone else: the whole POINT of
|
||||
// brushing-and-linking is that acting on ONE control changes a number somewhere ELSE. A sighted
|
||||
// user picks "Islam" in the left rail and watches 2,107 become 693 in the KPI strip, the map and
|
||||
// the table. A screen-reader user presses the same control, hears the control's own state change,
|
||||
// and is told NOTHING about the 1,414 rows that just left the board. The filter worked; the
|
||||
// feedback never existed.
|
||||
//
|
||||
// WHY IT LIVES IN THE SHELL AND NOT IN A PANEL. Six surfaces change on every brush (KPI strip,
|
||||
// map, table, charts, chips, breadcrumb). A live region per panel would announce the same event
|
||||
// up to six times, which is worse than silence — screen readers queue polite announcements, so the
|
||||
// user would wait through five repetitions before reaching the next control. The shell is the one
|
||||
// place that is above all six and mounted exactly once.
|
||||
//
|
||||
// POLITE, not assertive: this is a result, not an alert. `aria-atomic` so the whole sentence is
|
||||
// re-read rather than the changed word alone ("693" announced by itself is not information).
|
||||
//
|
||||
// ★ THE NODE MUST EXIST BEFORE IT HAS TEXT. A live region that is INSERTED already containing its
|
||||
// message is frequently not announced at all — the accessibility tree has to be observing the node
|
||||
// when the text changes. So the element is always rendered and starts EMPTY; it is never v-if'd,
|
||||
// never v-show'd, and never unmounted. (This is also why it is not inside any of the v-show'd
|
||||
// region cells above.)
|
||||
const liveMessage = ref('')
|
||||
let liveTimer = null
|
||||
let liveArmed = false
|
||||
// Debounced, for the same reason useSelectionCamera debounces the camera: typing in the search box
|
||||
// re-derives filteredRows on every keystroke, and an un-debounced polite region would queue one
|
||||
// announcement PER CHARACTER and then read them all back in order. 700ms is past a normal typing
|
||||
// cadence, so the user hears the settled answer once.
|
||||
const LIVE_DEBOUNCE_MS = 700
|
||||
function announce() {
|
||||
const shown = filteredRows.value.length
|
||||
const all = (data.rows.value || []).length
|
||||
// fmt() is the shell's own formatter. NUMERALS ARE HELD — this is deliberately the same
|
||||
// en-US grouping every visible surface already prints, so the announcement and the KPI strip
|
||||
// can never read as two different numbers.
|
||||
const unit = T('dashboard.groups', 'groups')
|
||||
let msg = T('dashboard.results_live', '{count} of {total} {unit} shown')
|
||||
.replace('{count}', fmt(shown)).replace('{total}', fmt(all)).replace('{unit}', unit)
|
||||
// The active filters, named. "693 of 2,107 groups shown" on its own does not say WHY, and the
|
||||
// chips that carry that answer are exactly what a screen-reader user cannot glance at.
|
||||
const active = Object.keys(bus.filterSet)
|
||||
if (active.length) {
|
||||
const names = active.map((k) => mergedConfig.value.facets?.[k]?.label || k).join(', ')
|
||||
msg += ' · ' + T('dashboard.filters_live', 'Filters: {list}').replace('{list}', names)
|
||||
}
|
||||
const q = (bus.searchTerm?.value || '').trim()
|
||||
if (q) msg += ' · ' + T('dashboard.search_live', 'Search: {term}').replace('{term}', q)
|
||||
liveMessage.value = msg
|
||||
}
|
||||
watch(
|
||||
// Every input that can move the count, in one key. filteredRows is the truth (it already folds
|
||||
// facets AND the tiered search), and the filter/search keys are included so that a change which
|
||||
// happens to leave the count identical — swapping one 693-row facet for another — still speaks.
|
||||
() => [filteredRows.value.length, JSON.stringify(bus.filterSet), bus.searchTerm?.value || ''].join('|'),
|
||||
() => {
|
||||
// ★ DO NOT SPEAK ON ARRIVAL. The first settled value is the page loading, not the user doing
|
||||
// something, and an element that announces itself the moment it mounts is noise a screen-reader
|
||||
// user cannot prevent — on an embed with several elements it is noise several times over. The
|
||||
// region arms itself after the first data-driven settle, so it only ever reports a CHANGE.
|
||||
if (!liveArmed) { liveArmed = true; return }
|
||||
clearTimeout(liveTimer)
|
||||
liveTimer = setTimeout(announce, LIVE_DEBOUNCE_MS)
|
||||
}
|
||||
)
|
||||
// A pending announcement must not outlive the element. Unmounting a dashboard mid-debounce (the
|
||||
// SPA swaps tabs, a composite is torn down) would otherwise fire announce() against a dead
|
||||
// instance — the same unmount-race class the map panel already guards.
|
||||
onBeforeUnmount(() => clearTimeout(liveTimer))
|
||||
|
||||
// ── OUTWARD FILTER SIGNAL ────────────────────────────────────────────────────────────────
|
||||
// WHY THIS EXISTS (measured 2026-09-22). This component was a SEALED BOX: zero defineProps,
|
||||
|
|
@ -652,6 +724,13 @@ useShadowStyles(`
|
|||
.rd-shell.rd-narrow .rd-seg{ display:flex; }
|
||||
.rd-seg button{ flex:1; border:0; background:var(--dx-elevated,#fff); border-top:1px solid var(--rd-line,#d1d4cd); font-size:12px; font-weight:700; color:var(--dx-muted,#6d766e); cursor:pointer; }
|
||||
.rd-seg button.on{ color:var(--rd-ink, #3b463d); box-shadow:inset 0 -3px 0 var(--rd-accent,#e67e22); }
|
||||
/* VISUALLY HIDDEN, NOT display:none. display:none (and visibility:hidden, and width/height:0 with
|
||||
overflow visible) removes the node from the ACCESSIBILITY tree too, which would silence the one
|
||||
region that exists to be heard. The clip-path + 1px box is the standard visually-hidden recipe:
|
||||
the node keeps a real box, stays in the a11y tree, and paints nothing. white-space:nowrap stops
|
||||
a long sentence from forcing a scrollbar on the shell while it is clipped. */
|
||||
.rd-sr-live{ position:absolute; width:1px; height:1px; margin:-1px; padding:0; border:0;
|
||||
overflow:hidden; clip-path:inset(50%); white-space:nowrap; }
|
||||
.rd-exportbar{ position:absolute; left:0; right:0; bottom:0; display:flex; align-items:center; gap:10px; padding:8px 14px;
|
||||
background:var(--rd-ink, #3b463d); color:#fff; z-index:50; box-shadow:0 -2px 10px #0003; animation:rd-slideup .2s ease; }
|
||||
.rd-exportbar .sp{ flex:1; } .rd-exportbar b{ font-size:13px; }
|
||||
|
|
@ -752,11 +831,18 @@ onMounted(() => {
|
|||
NEW .rd-rz-shell handle's job below. In page-scroll mode it still drives --rd-map-h (the
|
||||
map's SHARE of --rd-shell-h, not the total — see the CSS note above .rd-shell.rd-page-scroll),
|
||||
because --table-h is force-set to `auto` and no longer drives any layout — see the
|
||||
PAGE-SCROLL AXIS SWITCH note in useDashboardLayout.js. -->
|
||||
PAGE-SCROLL AXIS SWITCH note in useDashboardLayout.js.
|
||||
★ THE ONE HANDLE WHOSE NAME NEVER REACHED THE CATALOGUE. Its four siblings above and
|
||||
below read their title and aria-label through T(); these two were RAW ENGLISH literals,
|
||||
so this separator announced itself in English in all 11 locales while the handles on
|
||||
either side of it translated. It survived review because each half looks correct in
|
||||
isolation — the ternary is right, the strings are right, and only the MISSING T( is
|
||||
wrong. Two keys per handle, the same shape as the siblings: the *Hint is the tooltip,
|
||||
the plain key is the accessible name. -->
|
||||
<div v-show="!isNarrow && !tableCollapsed" class="rd-rz rd-rz-table" data-resize="table"
|
||||
role="separator" aria-orientation="horizontal" tabindex="0"
|
||||
:title="pageScroll ? 'Drag or use arrow keys to resize the map/table split' : 'Drag or use arrow keys to resize the table'"
|
||||
:aria-label="pageScroll ? 'Resize map/table split' : 'Resize table height'"
|
||||
:title="pageScroll ? T('aria.resizeMapTableSplitHint', 'Drag or use arrow keys to resize the map/table split') : T('aria.resizeTableHint', 'Drag or use arrow keys to resize the table')"
|
||||
:aria-label="pageScroll ? T('aria.resizeMapTableSplit', 'Resize map/table split') : T('aria.resizeTable', 'Resize table height')"
|
||||
:aria-valuenow="pageScroll ? mapH : (parseFloat(tableH) || 34)"
|
||||
:aria-valuemin="pageScroll ? 220 : 12" :aria-valuemax="pageScroll ? 1400 : 70"
|
||||
@pointerdown="startTableResize" @keydown="onResizeKeydown('table', $event)"></div>
|
||||
|
|
@ -773,6 +859,13 @@ onMounted(() => {
|
|||
:aria-label="T('aria.resizeDashboardHeight', 'Resize dashboard height')"
|
||||
:aria-valuenow="shellH" aria-valuemin="400" aria-valuemax="2600"
|
||||
@pointerdown="startShellResize" @keydown="onResizeKeydown('shell', $event)"></div>
|
||||
<!-- ★ THE POLITE LIVE REGION (see the announce() block in the script). ALWAYS RENDERED and
|
||||
starting EMPTY — no v-if, no v-show, never inside a collapsible cell: a live region that
|
||||
is inserted already carrying its message is routinely not announced, because the
|
||||
accessibility tree has to be watching the node when the text changes. It is visually
|
||||
hidden rather than display:none, because display:none removes it from the accessibility
|
||||
tree as well and would silence it for the very users it exists for. -->
|
||||
<div class="rd-sr-live" data-live-region role="status" aria-live="polite" aria-atomic="true">{{ liveMessage }}</div>
|
||||
<div class="rd-seg" data-segmented @click="setView">
|
||||
<button v-for="s in SEG" :key="s.k" :class="{ on: mobileView === s.k }" data-view-btn :data-view="s.k">{{ s.l }}</button>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,285 @@
|
|||
#!/usr/bin/env node
|
||||
/**
|
||||
* check-dashboard-filter-a11y.mjs — the dashboard's cross-filter must be OPERABLE and AUDIBLE.
|
||||
*
|
||||
* THE TWO DEFECTS THIS EXISTS TO PREVENT (both measured on main, 2026-09-26, both shipped).
|
||||
*
|
||||
* 1. A FILTER YOU CAN SET BUT CANNOT CLEAR WITHOUT A MOUSE. The filter chips were
|
||||
* `<span data-chip>` with click delegation on the bar. A span is not focusable, carries no
|
||||
* role, and the browser fires no click for it on Enter or Space. Every control that SETS a
|
||||
* filter is keyboard-operable (the tree rail's rows, the dropdowns, the geocoder), so a
|
||||
* keyboard user could walk into a narrowed board with no way out but reloading the page.
|
||||
* That asymmetry — reachable in, unreachable out — is the defect, not the missing role.
|
||||
*
|
||||
* 2. A CROSS-FILTER THAT ANNOUNCES NOTHING. The whole point of brushing-and-linking is that
|
||||
* acting on ONE control changes a number somewhere ELSE. The element contained exactly one
|
||||
* role="status" (the table's selection pill) and ZERO aria-live regions, so a sighted user
|
||||
* watched 2,107 become 693 across six surfaces while a screen-reader user was told nothing
|
||||
* at all. The filter worked; the feedback did not exist.
|
||||
*
|
||||
* PLUS the localization half of the same class: a `role="separator"` resize handle whose
|
||||
* aria-label is a RAW ENGLISH LITERAL announces itself in English in all 11 locales. Four of the
|
||||
* five handles read theirs through T(); the map/table one did not, and it survived review because
|
||||
* each half looks correct on its own — the ternary is right, the strings are right, and only the
|
||||
* missing T( is wrong.
|
||||
*
|
||||
* ★ WHY THIS IS AN AST WALK AND NOT A GREP. grep cannot tell `:aria-label="T(...)"` (a bound
|
||||
* expression) from `aria-label="T(...)"` (a literal that happens to contain the characters), cannot
|
||||
* tell a chip that is a <button> from a <span> whose class is named like one, and cannot see that a
|
||||
* live region sits inside a v-show'd cell. The template is parsed with @vue/compiler-sfc and the
|
||||
* ELEMENT TREE is asserted, so every check is about the structure that ships.
|
||||
*
|
||||
* ★ AND WHY IT ALSO READS THE BUILT BUNDLE. Source-correct + bundle-stale is a real, repeated
|
||||
* failure here (check-composite-interop carries the same part B for the same reason): a gate that
|
||||
* only reads source will pass while the reader gets last week's element.
|
||||
*
|
||||
* NO BROWSER. Playwright is rega's alone (fleet policy). Nothing here launches one.
|
||||
*
|
||||
* NEGATIVE-TESTED 2026-09-26 — each of these makes it FAIL, naming the file and the reason:
|
||||
* chips back to <span> -> A1 "chip is a <span>, not a <button>"
|
||||
* type="button" removed -> A2
|
||||
* :aria-label removed from the chip -> A3 (no accessible name)
|
||||
* the live region given v-if="…" -> B3
|
||||
* aria-live changed to "assertive" -> B1 (no polite region)
|
||||
* the map/table aria-label put back to a raw -> C "aria-label is a raw literal"
|
||||
* string literal
|
||||
* a stale bundle (source fixed, not rebuilt) -> D
|
||||
*/
|
||||
import { readFileSync, existsSync, readdirSync } from 'node:fs'
|
||||
import { resolve, dirname, join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { parse } from '@vue/compiler-sfc'
|
||||
import { TREE_NAME } from '../../../internal/_tree-name.mjs'
|
||||
|
||||
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../../..')
|
||||
const CHIPS = join(ROOT, 'plugin-designs/research-dashboard/src/components/dashboards/DashboardFilterChips.vue')
|
||||
const SHELL = join(ROOT, 'plugin-designs/research-dashboard/research-dashboard.vue')
|
||||
// ★ THE CHIPS THE USER ACTUALLY TOUCHES ARE NOT IN DashboardFilterChips.vue.
|
||||
// That component is exported from the kit's index.js and mounted by NOBODY — DashboardTopBar's
|
||||
// header records why (round 1 of BUG-DUPLICATE-FILTER-BADGES removed it, and the second header's
|
||||
// SearchFilterHeader has rendered the live strip ever since). A gate that only read the kit file
|
||||
// would therefore be green about a screen that does not exist and blind to the one that does —
|
||||
// the same "numeric probe for the wrong noun" that let the duplicate-badges bug survive ~50
|
||||
// reports. Both are checked: the LIVE strip so a regression is caught, and the kit file so the
|
||||
// defect is not lying in wait for the next dashboard that mounts it.
|
||||
const LIVE_CHIPS = join(ROOT, 'library/components/search/SearchFilterHeader.vue')
|
||||
|
||||
const fails = []
|
||||
const notes = []
|
||||
const fail = (code, msg) => fails.push(`${code} ${msg}`)
|
||||
|
||||
// ── template AST helpers ─────────────────────────────────────────────────────────────────────
|
||||
// @vue/compiler-sfc node types: 1 = ELEMENT, 2 = TEXT, 5 = INTERPOLATION.
|
||||
// props entries: type 6 = plain ATTRIBUTE (name/value), type 7 = DIRECTIVE (v-bind/v-if/v-show/…).
|
||||
function templateAst(file) {
|
||||
const { descriptor, errors } = parse(readFileSync(file, 'utf8'), { filename: file })
|
||||
if (errors && errors.length) throw new Error(`${file}: ${errors[0].message}`)
|
||||
if (!descriptor.template) throw new Error(`${file}: no <template>`)
|
||||
return descriptor.template.ast
|
||||
}
|
||||
function walk(node, visit) {
|
||||
if (!node) return
|
||||
if (node.type === 1) visit(node)
|
||||
for (const c of node.children || []) walk(c, visit)
|
||||
}
|
||||
function elements(ast) { const out = []; walk(ast, (n) => out.push(n)); return out }
|
||||
|
||||
/** A plain attribute's value, or undefined when it is absent or bound. */
|
||||
const attr = (el, name) => {
|
||||
const p = (el.props || []).find((q) => q.type === 6 && q.name === name)
|
||||
return p ? (p.value ? p.value.content : '') : undefined
|
||||
}
|
||||
/** A v-bind:<name> / :<name> directive's expression source, or undefined. */
|
||||
const bound = (el, name) => {
|
||||
const p = (el.props || []).find((q) => q.type === 7 && q.name === 'bind'
|
||||
&& q.arg && q.arg.type === 4 && q.arg.content === name)
|
||||
return p && p.exp ? p.exp.content : undefined
|
||||
}
|
||||
/** True when the element carries the named structural directive (v-if / v-else-if / v-show). */
|
||||
const hasDirective = (el, name) => (el.props || []).some((q) => q.type === 7 && q.name === name)
|
||||
/** True when the element renders any non-whitespace text or interpolation, at any depth. */
|
||||
function hasText(el) {
|
||||
let found = false
|
||||
const rec = (n) => {
|
||||
if (found || !n) return
|
||||
if (n.type === 2 && String(n.content).trim()) found = true
|
||||
if (n.type === 5) found = true
|
||||
for (const c of n.children || []) rec(c)
|
||||
}
|
||||
for (const c of el.children || []) rec(c)
|
||||
return found
|
||||
}
|
||||
const has = (el, name) => attr(el, name) !== undefined || bound(el, name) !== undefined
|
||||
|
||||
// ── A. THE CHIPS ARE OPERABLE BUTTONS ────────────────────────────────────────────────────────
|
||||
{
|
||||
const ast = templateAst(CHIPS)
|
||||
const chips = elements(ast).filter((el) => has(el, 'data-chip'))
|
||||
if (!chips.length) fail('A0', `${CHIPS}: no [data-chip] element found — the chip bar moved or was renamed; this gate is now blind.`)
|
||||
for (const el of chips) {
|
||||
const which = attr(el, 'data-chip') !== undefined ? `data-chip="${attr(el, 'data-chip')}"` : 'data-chip (bound)'
|
||||
if (el.tag !== 'button') {
|
||||
fail('A1', `DashboardFilterChips.vue: ${which} is a <${el.tag}>, not a <button> — not focusable, and Enter/Space fire no click, so a filter set by keyboard cannot be cleared by keyboard.`)
|
||||
continue
|
||||
}
|
||||
if (attr(el, 'type') !== 'button') {
|
||||
fail('A2', `DashboardFilterChips.vue: ${which} has no type="button" — inside a partner page's <form> it would default to submit and post the form on every chip press.`)
|
||||
}
|
||||
// Accessible name precedence: aria-label -> visible text. `title` is NOT one.
|
||||
//
|
||||
// ★ THE TWO CHIPS HAVE OPPOSITE REQUIREMENTS, and that is not an inconsistency.
|
||||
// A REMOVABLE chip ([data-filter-chip]) reads "Religion: Islam". That is a perfectly good
|
||||
// accessible NAME and a useless accessible ACTION: announced alone it tells the user what the
|
||||
// filter is, never that pressing removes it. So it must carry an explicit aria-label naming
|
||||
// the action. (This is the one case where "it already has visible text" is the wrong answer,
|
||||
// which is why it is asserted rather than inferred.)
|
||||
// The RESET-ALL chip reads "Reset all" — the words already ARE the action, so an aria-label
|
||||
// would only override what the user can see and break voice control ("click Reset all").
|
||||
const label = bound(el, 'aria-label') ?? attr(el, 'aria-label')
|
||||
const removable = has(el, 'data-filter-chip')
|
||||
if (removable && !label) {
|
||||
fail('A3', `DashboardFilterChips.vue: ${which} is removable but has no aria-label — its visible text names the FILTER ("Religion: Islam"), not the ACTION, so it announces as a filter you cannot tell is a remove button. (title is a tooltip, not an accessible name.)`)
|
||||
}
|
||||
if (!removable && !label && !hasText(el)) {
|
||||
fail('A3', `DashboardFilterChips.vue: ${which} has neither an aria-label nor visible text — it would be announced as a bare "button".`)
|
||||
}
|
||||
if (!removable && label && hasText(el)) {
|
||||
fail('A4', `DashboardFilterChips.vue: ${which} has BOTH visible text and an aria-label — the label overrides the words the user can see, which breaks voice control.`)
|
||||
}
|
||||
}
|
||||
notes.push(`kit chips (unmounted): ${chips.length} [data-chip] element(s), all <button type="button"> with an accessible name`)
|
||||
}
|
||||
|
||||
// ── A-LIVE. THE STRIP THAT IS ACTUALLY ON SCREEN ─────────────────────────────────────────────
|
||||
// SearchFilterHeader is library/ (rule 5B — studio lands changes to it). This gate only READS it,
|
||||
// and it PASSES today: the ✕ is already a real <button type="button"> with a localized aria-label
|
||||
// and "Clear All" is already a real button. That is worth pinning precisely BECAUSE it is already
|
||||
// right — the failure mode here is a future refactor turning either back into a <span>, which no
|
||||
// build error would catch.
|
||||
{
|
||||
const ast = templateAst(LIVE_CHIPS)
|
||||
const els = elements(ast)
|
||||
const x = els.filter((el) => (attr(el, 'class') || '').split(/\s+/).includes('sfh__chip-x'))
|
||||
const clear = els.filter((el) => (attr(el, 'class') || '').split(/\s+/).includes('sfh__clear'))
|
||||
if (!x.length) fail('A5', `SearchFilterHeader.vue: no .sfh__chip-x remove control found — the LIVE chip strip moved or was renamed; this gate is now blind to the only chips on screen.`)
|
||||
for (const el of x) {
|
||||
if (el.tag !== 'button') fail('A6', `SearchFilterHeader.vue: the chip ✕ is a <${el.tag}>, not a <button> — a filter that can be SET from the keyboard could not be CLEARED from the keyboard.`)
|
||||
else if (attr(el, 'type') !== 'button') fail('A7', `SearchFilterHeader.vue: the chip ✕ has no type="button".`)
|
||||
const label = bound(el, 'aria-label') ?? attr(el, 'aria-label')
|
||||
if (!label) fail('A8', `SearchFilterHeader.vue: the chip ✕ has no aria-label — its only content is "×", which announces as nothing useful.`)
|
||||
else if (attr(el, 'aria-label') !== undefined) fail('A9', `SearchFilterHeader.vue: the chip ✕ aria-label is a raw literal (${JSON.stringify(attr(el, 'aria-label'))}) — it announces in English in all 11 locales.`)
|
||||
}
|
||||
if (!clear.length) fail('A5', `SearchFilterHeader.vue: no .sfh__clear control found.`)
|
||||
for (const el of clear) {
|
||||
if (el.tag !== 'button') fail('A6', `SearchFilterHeader.vue: "Clear all" is a <${el.tag}>, not a <button>.`)
|
||||
}
|
||||
notes.push(`live chips (SearchFilterHeader): ✕ and "Clear all" are real <button type="button">, ✕ named from the catalogue`)
|
||||
|
||||
// ── THE ✕ IS BIG ENOUGH TO HIT (WCAG 2.5.8) ────────────────────────────────────────────────
|
||||
// The chip's box is pinned to --dx-sel-row-h (16px) to hold a measured fixed-height invariant,
|
||||
// and the ✕ carries padding:0 — so the only way OUT of a narrowed board was a ~13x16px glyph.
|
||||
// The fix cannot be a taller button (that reopens the layout-shift bug the pin exists for), so
|
||||
// it is an absolutely-positioned 24x24 ::after: pointer surface without intrinsic size.
|
||||
// ASSERTED IN CSS because there is nothing else to read — no DOM, no browser. The failure this
|
||||
// catches is a future author deleting the overlay as "an empty pseudo-element doing nothing".
|
||||
{
|
||||
const { descriptor } = parse(readFileSync(LIVE_CHIPS, 'utf8'), { filename: LIVE_CHIPS })
|
||||
const css = (descriptor.styles || []).map((s) => s.content).join('\n')
|
||||
const rule = /\.sfh__chip-x::after\s*\{([^}]*)\}/.exec(css)
|
||||
if (!rule) {
|
||||
fail('A10', `SearchFilterHeader.vue: no .sfh__chip-x::after rule — the chip ✕ is back to a ~13x16px target, and it is the ONLY way out of a narrowed board. (2.5.8 is a TARGET SIZE criterion: the floor applies at every width, never behind @media (pointer: coarse).)`)
|
||||
} else {
|
||||
const body = rule[1]
|
||||
for (const dim of ['width', 'height']) {
|
||||
const m = new RegExp(`(?:^|;|\\s)${dim}\\s*:\\s*(\\d+)px`).exec(body)
|
||||
if (!m) fail('A11', `SearchFilterHeader.vue: .sfh__chip-x::after has no explicit ${dim} in px — the hit area is not measurable.`)
|
||||
else if (Number(m[1]) < 24) fail('A11', `SearchFilterHeader.vue: .sfh__chip-x::after ${dim} is ${m[1]}px, under the 24px target-size floor.`)
|
||||
}
|
||||
if (!/position\s*:\s*absolute/.test(body)) {
|
||||
fail('A12', `SearchFilterHeader.vue: .sfh__chip-x::after is not position:absolute — an in-flow 24px box would grow the chip past the pinned --dx-sel-row-h and reopen the layout shift that pin exists to prevent.`)
|
||||
}
|
||||
notes.push('live chip ✕: a 24x24 absolutely-positioned hit area, so the row height is untouched')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── B. THE SHELL HAS ONE ALWAYS-PRESENT POLITE LIVE REGION ───────────────────────────────────
|
||||
const shellAst = templateAst(SHELL)
|
||||
{
|
||||
const all = elements(shellAst)
|
||||
const polite = all.filter((el) => (attr(el, 'aria-live') || bound(el, 'aria-live')) === 'polite')
|
||||
if (!polite.length) {
|
||||
fail('B1', `research-dashboard.vue: no aria-live="polite" region. A cross-filter changes a number FAR from the control that changed it; with no live region a screen-reader user is told nothing when 2,107 becomes 693.`)
|
||||
} else if (polite.length > 1) {
|
||||
fail('B2', `research-dashboard.vue: ${polite.length} polite live regions — a single brush would be announced once per region, and polite announcements QUEUE, so the user waits through every repeat.`)
|
||||
} else {
|
||||
const el = polite[0]
|
||||
for (const d of ['if', 'else-if', 'show']) {
|
||||
if (hasDirective(el, d)) {
|
||||
fail('B3', `research-dashboard.vue: the live region carries v-${d}. A region inserted already holding its text is routinely NOT announced — the accessibility tree has to be observing the node when the text changes. It must always be rendered and start empty.`)
|
||||
}
|
||||
}
|
||||
if (attr(el, 'role') !== 'status') fail('B4', `research-dashboard.vue: the live region has no role="status".`)
|
||||
if ((attr(el, 'aria-atomic') || bound(el, 'aria-atomic')) !== 'true') {
|
||||
fail('B5', `research-dashboard.vue: the live region is not aria-atomic="true" — only the changed word is re-read, and "693" announced alone is not information.`)
|
||||
}
|
||||
if (!hasText(el)) fail('B6', `research-dashboard.vue: the live region renders no interpolation — it can never say anything.`)
|
||||
notes.push('live region: one polite role="status" aria-atomic region, always rendered')
|
||||
}
|
||||
}
|
||||
|
||||
// ── C. EVERY RESIZE HANDLE'S NAME COMES FROM THE CATALOGUE ───────────────────────────────────
|
||||
{
|
||||
const handles = elements(shellAst).filter((el) => has(el, 'data-resize'))
|
||||
if (!handles.length) fail('C0', `research-dashboard.vue: no [data-resize] handle found — this gate is now blind.`)
|
||||
for (const el of handles) {
|
||||
const which = `[data-resize="${attr(el, 'data-resize') ?? '?'}"]`
|
||||
for (const name of ['aria-label', 'title']) {
|
||||
const lit = attr(el, name)
|
||||
const exp = bound(el, name)
|
||||
if (lit !== undefined) {
|
||||
fail('C1', `research-dashboard.vue: ${which} ${name} is a raw literal (${JSON.stringify(lit)}) — it announces in English in all 11 locales.`)
|
||||
} else if (exp === undefined) {
|
||||
fail('C2', `research-dashboard.vue: ${which} has no ${name}. A role="separator" with no accessible name is announced as an unnamed widget.`)
|
||||
} else if (!/\bT\(/.test(exp)) {
|
||||
fail('C3', `research-dashboard.vue: ${which} ${name} is bound but never reaches the catalogue (no T( in ${JSON.stringify(exp)}) — it announces in English in all 11 locales.`)
|
||||
}
|
||||
}
|
||||
}
|
||||
notes.push(`resize handles: ${handles.length}, every aria-label and title read through T()`)
|
||||
}
|
||||
|
||||
// ── D. THE SHIPPED BUNDLE CARRIES ALL OF IT ──────────────────────────────────────────────────
|
||||
// Source-correct and bundle-stale is a real, repeated failure here. SKIP (not pass) when nothing
|
||||
// is built, so a clean checkout is not failed for a tree it does not have.
|
||||
{
|
||||
const bundle = join(ROOT, 'public', TREE_NAME, 'research-dashboard', 'research-dashboard.js')
|
||||
if (!existsSync(bundle)) {
|
||||
notes.push(`built bundle: SKIPPED — ${bundle.replace(ROOT + '/', '')} does not exist (nothing built)`)
|
||||
} else {
|
||||
const js = readFileSync(bundle, 'utf8')
|
||||
// ONLY markers that are actually MOUNTED. `data-filter-chip` and `aria.removeFilter` belong to
|
||||
// the unmounted kit component and are correctly tree-shaken out of this bundle — requiring them
|
||||
// here would be a gate demanding that dead code ship, which is how a check teaches the next
|
||||
// author to mount something the agent asked to have removed.
|
||||
const need = [
|
||||
['aria-live', 'the polite live region'],
|
||||
['data-live-region', 'the live region marker'],
|
||||
['aria.resizeMapTableSplit', 'the map/table handle catalogue key'],
|
||||
['sfh__chip-x', 'the live chip remove button'],
|
||||
]
|
||||
for (const [lit, what] of need) {
|
||||
if (!js.includes(lit)) fail('D', `built research-dashboard.js is missing ${JSON.stringify(lit)} (${what}) — the source is fixed but the SHIPPED element is not. Run: BUNDLE=research-dashboard bun x vite build && bun run tree && bun run fix:sri`)
|
||||
}
|
||||
if (!fails.some((f) => f.startsWith('D'))) notes.push('built bundle: carries the live region, the live chip button and the map/table catalogue key')
|
||||
}
|
||||
}
|
||||
|
||||
// ── report ───────────────────────────────────────────────────────────────────────────────────
|
||||
for (const n of notes) console.log(' · ' + n)
|
||||
if (fails.length) {
|
||||
console.error('\nDASHBOARD-FILTER-A11Y: FAIL')
|
||||
for (const f of fails) console.error(' ' + f)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log('DASHBOARD-FILTER-A11Y: PASS — the chips are keyboard-operable and named, the shell announces every brush once, and no handle name is raw English.')
|
||||
|
|
@ -25,13 +25,45 @@
|
|||
* look identical: the bars appear, suggestions work, nothing errors. Only the request log tells the
|
||||
* truth, which is why this counts requests rather than looking at the page.
|
||||
*
|
||||
* ASSERTIONS, on the built tree:
|
||||
* maplibre ZERO requests to api.mapbox.com.
|
||||
* both whatever search bars this leaf renders still produce suggestions — a zero bought by
|
||||
* breaking search is not a fix. A leaf with NO bar now FAILS (it used to pass hollow);
|
||||
* the default leaf is doxa-research-map/research-map, which mounts one (--leaf to change).
|
||||
* ★ CORRECTED 2026-09-26, after rega reported "0 search bars on both engines" and it was the CHECK
|
||||
* that was wrong, not the product. Two separate mistakes, both of them mine:
|
||||
*
|
||||
* Exit: 0 pass or SKIP (no built tree, no browser, no data) · 1 fail.
|
||||
* 1. UNDER MAPLIBRE, NO SEARCH BAR IS THE CONTRACT — not a hollow pass and not a failure.
|
||||
* research-map.vue: `hasGeocoder = mapProvider === 'mapbox'`, and research-map.instances.json
|
||||
* says it in words: "Under maplibre the search bar is deliberately ABSENT — GeocoderComponent's
|
||||
* maplibre path still geocodes through Mapbox, so shipping it would bill the very key this
|
||||
* instance exists to avoid". The previous revision had just been taught that a bar-less leaf is
|
||||
* a hollow pass, and applied that lesson to the one engine where ABSENCE IS THE POINT. An
|
||||
* absent bar is in fact the STRONGEST form of this gate's own assertion: a search that cannot
|
||||
* be typed into cannot send anyone's IP to Mapbox.
|
||||
* So the rule is now conditional rather than hardcoded, because a keyless geocoder may ship
|
||||
* one day and this gate should not have to be rewritten when it does: if maplibre renders NO
|
||||
* bar, that is recorded and passes; if it renders one, it must WORK and still make zero
|
||||
* Mapbox requests. Either way the zero is what is asserted.
|
||||
*
|
||||
* 2. THE MAPBOX RUN WAS NEVER GIVEN A TOKEN, so it could not have rendered a bar either. The leaf
|
||||
* bakes BAKED_TOKEN = "" and nothing else supplies one, so mapbox-gl cannot construct a Map,
|
||||
* `map` stays null, and the bar's `v-if="appReady && map && hasGeocoder"` never fires. Note the
|
||||
* mechanism: an explicit ?provider=mapbox does NOT fall back to maplibre (explicitMapProvider
|
||||
* reads the URL first) — the engine is Mapbox, it simply has no key. A gate that fails a
|
||||
* product for a key the gate did not provide is measuring its own environment.
|
||||
* It now takes MAPBOX_TOKEN from the env (or vite.doxa-maps-build-config.json `token`, the
|
||||
* same ladder check:experimental-shelf uses) and injects it as window.MAP_TOKEN before
|
||||
* navigation, the way check:auto-engine and check:a11y-button-names do. With no token the
|
||||
* mapbox half is NOT MEASURED — reported as a SKIP line so run-parallel prints ⊘ rather than
|
||||
* counting it as a pass, because an always-taken skip is indistinguishable from an unwired
|
||||
* gate unless the runner says so.
|
||||
*
|
||||
* ASSERTIONS, on the built tree:
|
||||
* maplibre ZERO requests to api.mapbox.com. (Measured with or without a token.)
|
||||
* If a bar is present it must produce suggestions; if it is absent, that is the
|
||||
* documented contract and is recorded as such.
|
||||
* mapbox the bar is PRESENT and produces suggestions. Requires a token; without one this
|
||||
* half is skipped, never failed. Mapbox traffic is expected here and not asserted on.
|
||||
*
|
||||
* NEVER PRINTS THE TOKEN. Only its presence is reported.
|
||||
*
|
||||
* Exit: 0 pass or SKIP (no built tree, no browser, no data, no token) · 1 fail.
|
||||
*/
|
||||
import { createServer } from 'node:http'
|
||||
import { spawn } from 'node:child_process'
|
||||
|
|
@ -50,6 +82,12 @@ let chromium
|
|||
try { ({ chromium } = await import('playwright')) } catch { skip('playwright is not installed.') }
|
||||
|
||||
const manifest = JSON.parse(readFileSync(MANIFEST, 'utf8'))
|
||||
// The token ladder every other browser gate here uses: env first, then the build config. Presence
|
||||
// is reported; the value never is.
|
||||
const TOKEN = (() => {
|
||||
if (process.env.MAPBOX_TOKEN) return process.env.MAPBOX_TOKEN
|
||||
try { return JSON.parse(readFileSync(join(ROOT, 'vite.doxa-maps-build-config.json'), 'utf8')).token || '' } catch { return '' }
|
||||
})()
|
||||
// ★ A LEAF THAT MOUNTS THE SEARCH BAR, or the suggestion half proves nothing (2026-09-26: the
|
||||
// research-dashboard leaf renders no bar, so every run passed with "search bars: 0" — a hollow PASS).
|
||||
// Default: the research map, which mounts the library GeocoderComponent. --leaf <bundle>/<profile>.
|
||||
|
|
@ -78,10 +116,17 @@ const browser = await chromium.launch({ args: ['--enable-unsafe-swiftshader', '-
|
|||
const fails = []
|
||||
const lines = []
|
||||
try {
|
||||
for (const engine of ['maplibre', 'mapbox']) {
|
||||
// The mapbox half needs a key. Measure maplibre either way — it is the headline claim and it is
|
||||
// fully measurable keyless, which is the whole point of the engine.
|
||||
const engines = TOKEN ? ['maplibre', 'mapbox'] : ['maplibre']
|
||||
for (const engine of engines) {
|
||||
const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } })
|
||||
const mapboxCalls = []
|
||||
page.on('request', (r) => { const u = r.url(); if (u.includes('api.mapbox.com')) mapboxCalls.push(u) })
|
||||
// ★ ONLY under mapbox. Injecting a token into the maplibre run would change what is being
|
||||
// measured: resolveMapProvider's `auto` rung reads a token as "use Mapbox", and even with an
|
||||
// explicit ?provider=maplibre a present token is a variable this gate exists to hold at zero.
|
||||
if (engine === 'mapbox') await page.addInitScript((tk) => { window.MAP_TOKEN = tk }, TOKEN)
|
||||
await page.goto(`${LEAF}?provider=${engine}`, { waitUntil: 'domcontentloaded', timeout: 60000 })
|
||||
await page.waitForTimeout(20000)
|
||||
|
||||
|
|
@ -96,8 +141,11 @@ try {
|
|||
if (el.shadowRoot) walk(el.shadowRoot)
|
||||
}
|
||||
}
|
||||
walk(document)
|
||||
if (!hits.length) return { bars: 0, suggestions: 0 }
|
||||
// Did an engine actually construct a map? A canvas is the one artefact both engines share,
|
||||
// and it tells "the bar was removed" apart from "there was never a map to hang it on".
|
||||
let mapReady = false
|
||||
for (const root of seen) { if (root.querySelector && root.querySelector('canvas.mapboxgl-canvas, canvas.maplibregl-canvas, .mapboxgl-map canvas, .maplibregl-map canvas')) { mapReady = true; break } }
|
||||
if (!hits.length) return { bars: 0, suggestions: 0, mapReady }
|
||||
const input = hits[0]
|
||||
input.focus()
|
||||
input.value = 'Afar'
|
||||
|
|
@ -106,23 +154,40 @@ try {
|
|||
await sleep(500)
|
||||
const root = input.getRootNode()
|
||||
const n = root.querySelectorAll('.mapboxgl-ctrl-geocoder .suggestions li, .maplibregl-ctrl-geocoder .suggestions li, .suggestions li').length
|
||||
if (n) return { bars: hits.length, suggestions: n }
|
||||
if (n) return { bars: hits.length, suggestions: n, mapReady }
|
||||
}
|
||||
return { bars: hits.length, suggestions: 0 }
|
||||
return { bars: hits.length, suggestions: 0, mapReady }
|
||||
})
|
||||
await page.close()
|
||||
|
||||
lines.push(` · ${engine.padEnd(9)} api.mapbox.com requests: ${mapboxCalls.length} · search bars: ${search.bars} · suggestions for "Afar": ${search.suggestions}`)
|
||||
lines.push(` · ${engine.padEnd(9)} api.mapbox.com requests: ${mapboxCalls.length} · search bars: ${search.bars} · suggestions for "Afar": ${search.suggestions}${engine === 'mapbox' ? ' · token: supplied' : ''}`)
|
||||
|
||||
if (engine === 'maplibre' && mapboxCalls.length) {
|
||||
fails.push(`under maplibre the dashboard made ${mapboxCalls.length} request(s) to api.mapbox.com:`)
|
||||
for (const u of [...new Set(mapboxCalls)].slice(0, 8)) fails.push(` ${u.slice(0, 150)}`)
|
||||
}
|
||||
// NO BAR IS A FAILURE, not a pass: this gate exists to prove search still works with zero Mapbox calls.
|
||||
if (!search.bars) {
|
||||
fails.push(`under ${engine} the leaf rendered NO search bar, so search was never exercised — point --leaf at a leaf that mounts one.`)
|
||||
} else if (!search.suggestions) {
|
||||
fails.push(`under ${engine} the search bar rendered but typing produced no suggestions — zero Mapbox traffic bought by a broken search is not a fix.`)
|
||||
if (engine === 'maplibre') {
|
||||
// THE HEADLINE. One request sends the visitor's IP to Mapbox and breaks the keyless promise,
|
||||
// whatever the page looks like afterwards.
|
||||
if (mapboxCalls.length) {
|
||||
fails.push(`under maplibre the leaf made ${mapboxCalls.length} request(s) to api.mapbox.com:`)
|
||||
for (const u of [...new Set(mapboxCalls)].slice(0, 8)) fails.push(` ${u.slice(0, 150)}`)
|
||||
}
|
||||
// A bar is OPTIONAL here and its absence is the documented contract (see the header). What is
|
||||
// NOT optional is that a bar, if present, works — otherwise a future keyless geocoder could
|
||||
// ship broken and this gate would read it as a clean zero.
|
||||
if (!search.bars) {
|
||||
lines.push(' (no search bar under maplibre — the documented contract: research-map.vue hasGeocoder = provider === \'mapbox\', because GeocoderComponent\'s maplibre path still geocodes through Mapbox. An absent bar is the strongest form of the zero above.)')
|
||||
} else if (!search.suggestions) {
|
||||
fails.push('under maplibre a search bar rendered but typing produced no suggestions — if a keyless geocoder now ships it has to work, not merely be quiet.')
|
||||
}
|
||||
} else {
|
||||
// MAPBOX: the bar is the feature this profile was built around, and it must still work.
|
||||
// `mapReady` separates "the bar was removed" from "the map never constructed", which are
|
||||
// different bugs with the same symptom — and the second one is how this gate misread itself.
|
||||
if (!search.bars) {
|
||||
fails.push(search.mapReady
|
||||
? 'under mapbox the map constructed but rendered NO search bar — hasGeocoder or the GeocoderComponent mount is broken.'
|
||||
: 'under mapbox NO map constructed (so the bar\'s v-if could never fire). The token was supplied, so this is the product or the leaf, not a missing key.')
|
||||
} else if (!search.suggestions) {
|
||||
fails.push('under mapbox the search bar rendered but typing produced no suggestions.')
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
|
|
@ -138,4 +203,11 @@ if (fails.length) {
|
|||
for (const f of fails) console.log(` ✗ ${f}`)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`${TAG}: PASS — MapLibre calls Mapbox zero times and still searches; Mapbox is unchanged.`)
|
||||
if (!TOKEN) {
|
||||
// Half-measured is not a pass. run-parallel reads a `TAG: SKIP` line and prints ⊘, so the wave
|
||||
// cannot report this as one of N gates that graded something. Exit 0: nothing FAILED.
|
||||
console.log(`${TAG}: SKIP — maplibre measured and clean; the mapbox half needs a key and none was supplied.`)
|
||||
console.log(' Set MAPBOX_TOKEN in the environment, or `token` in vite.doxa-maps-build-config.json, to measure it.')
|
||||
process.exit(0)
|
||||
}
|
||||
console.log(`${TAG}: PASS — MapLibre calls Mapbox zero times, and Mapbox still searches.`)
|
||||
|
|
|
|||
|
|
@ -43,6 +43,28 @@ function onClick(e) {
|
|||
if (k === '__all__') bus.clearFilters(); else bus.setFilter(k, null)
|
||||
}
|
||||
|
||||
// ── ★ THE CHIP IS A BUTTON, AND THAT IS THE WHOLE KEYBOARD FIX ─────────────────────────────────
|
||||
// These were <span data-chip> with click delegation on the bar. A span is not focusable, has no
|
||||
// role, and fires no click from Enter or Space — so a filter that could be SET from the keyboard
|
||||
// (the tree rail's rows and the dropdowns are both operable) could NOT BE CLEARED from the
|
||||
// keyboard. That asymmetry is the defect: a keyboard user could walk themselves into a filtered
|
||||
// view with no way out except reloading the page.
|
||||
//
|
||||
// A <button type="button"> fixes it with NO new handler, because the browser already synthesises a
|
||||
// click for Enter and Space on a button. The existing delegation (closest('[data-chip]')) keeps
|
||||
// working byte-for-byte — which is the point: adding a @keydown here would have created a SECOND
|
||||
// activation path that can disagree with the click path, and the bar's one-listener design is
|
||||
// deliberate (it is defineCustomElement-safe).
|
||||
//
|
||||
// `type="button"` is not decoration. A bare <button> inside a form defaults to type="submit"; a
|
||||
// partner page that embeds this element inside its own form would have had every chip submit it.
|
||||
//
|
||||
// THE ACCESSIBLE NAME must say what the press DOES, not what the chip shows. The visible text is
|
||||
// "Religion: Islam"; announced alone that is a label, not an action, so a screen-reader user hears
|
||||
// the filter but not that pressing removes it. `title` is NOT an accessible name (this repo's
|
||||
// check:a11y-button-names exists for exactly that confusion), so the name is an aria-label.
|
||||
const removeLabel = (c) => T('aria.removeFilter', 'Remove filter {name}').replace('{name}', c.facet + ': ' + c.text)
|
||||
|
||||
useShadowStyles(`
|
||||
/* BOUNDED so the chips never slide under the centred search bar (BUG-SELECTION-CHIPS-UNDER-SEARCHBAR).
|
||||
MEASURED live at 1440x900 before the fix: search x 540..900, first chip x 482..718 — ~178px of
|
||||
|
|
@ -67,9 +89,24 @@ useShadowStyles(`
|
|||
.rd-chips{ display:flex; align-items:center; gap:6px; flex-wrap:nowrap; min-width:0;
|
||||
overflow-x:auto; overflow-y:hidden; scrollbar-width:none; }
|
||||
.rd-chips::-webkit-scrollbar{ height:0; width:0; }
|
||||
/* A <button> does NOT inherit the host's font, resets margin to the UA's, and paints a UA
|
||||
background/appearance — so every one of those is restated here. Without font-family:inherit the
|
||||
chips would silently drop to the UA default face while every other chip-like control in the
|
||||
dashboard kept the app font: the keyboard fix would have arrived as a typography regression.
|
||||
text-align + margin:0 cover the other two UA defaults a span never had. */
|
||||
.rd-chip{ display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:600; padding:3px 9px; border-radius:999px;
|
||||
background:#fff; color:#1a1a2e; border:1px solid #e67e22; cursor:pointer; line-height:1.2;
|
||||
font-family:inherit; margin:0; text-align:left; -webkit-appearance:none; appearance:none;
|
||||
/* WCAG 2.5.8 is a TARGET SIZE criterion, not a touch criterion — so the 24px floor belongs at
|
||||
EVERY width, never behind @media (pointer:coarse). Measured before: 11px text x 1.2 + 6px
|
||||
padding + 2px border = ~21px. The bar is 52px and the chips are centred in it, so the 3px
|
||||
costs no layout; the font size is untouched. */
|
||||
min-height:24px;
|
||||
flex:0 0 auto; max-width:200px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
||||
/* :focus-visible, not :focus — a MOUSE click on a button focuses it, and a permanent ring after
|
||||
every click would read as a selection state the chip does not have. The offset keeps the ring
|
||||
off the 1px orange border so the two do not merge into one muddy edge. */
|
||||
.rd-chip:focus-visible{ outline:2px solid #1a237e; outline-offset:2px; }
|
||||
/* the label span is what actually truncates; the facet prefix and the x stay readable */
|
||||
.rd-chip .rd-chip-val{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }
|
||||
.rd-chip .fc{ opacity:.55; font-weight:500; flex:0 0 auto; } .rd-chip i{ font-style:normal; opacity:.6; font-size:12px; flex:0 0 auto; }
|
||||
|
|
@ -84,14 +121,18 @@ useShadowStyles(`
|
|||
Language label (some run 40+ chars) stays readable on hover rather than being lost to the
|
||||
ellipsis. The value lives in its own span because that is the only part that should shrink:
|
||||
the facet prefix and the ✕ affordance must stay legible at every width. -->
|
||||
<span v-for="c in chips" :key="c.k" class="rd-chip" :data-chip="c.k" data-filter-chip
|
||||
:title="c.facet + ': ' + c.text">
|
||||
<span class="fc">{{ c.facet }}:</span><span class="rd-chip-val">{{ c.text }}</span> <i>✕</i>
|
||||
</span>
|
||||
<button v-for="c in chips" :key="c.k" type="button" class="rd-chip" :data-chip="c.k" data-filter-chip
|
||||
:title="c.facet + ': ' + c.text" :aria-label="removeLabel(c)">
|
||||
<span class="fc">{{ c.facet }}:</span><span class="rd-chip-val">{{ c.text }}</span> <i aria-hidden="true">✕</i>
|
||||
</button>
|
||||
<!-- ★ REUSES controls.reset_all rather than adding a second key. This chip clears every
|
||||
filter, which is the same action that button names, and two keys for one action is how
|
||||
a control ends up saying two different things in two languages. The English shifts from
|
||||
"Clear all" to "Reset all" — a deliberate consequence of having one name for one thing. -->
|
||||
<span class="rd-chip rd-clear" data-chip="__all__">{{ T('controls.reset_all', 'Reset all') }}</span>
|
||||
<!-- No aria-label: this one has VISIBLE TEXT, and visible text IS the accessible name. Adding
|
||||
an aria-label would OVERRIDE it, which is how a control ends up announced as something
|
||||
other than what it reads as — and it would break voice control, where the user says the
|
||||
words they can see. -->
|
||||
<button type="button" class="rd-chip rd-clear" data-chip="__all__">{{ T('controls.reset_all', 'Reset all') }}</button>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -236,7 +236,10 @@ const bundleSrc = (bundle, file) =>
|
|||
// legend selects by NAME; the grid matches rows by VALUE. Carrying one form would have meant the
|
||||
// link matching nothing the moment the grid's data followed the URL's language — and an empty
|
||||
// intersection reads as "no results", not as a broken wire.
|
||||
const linked = reactive({ region: { value: '', label: '' }, religion: '', language: { value: '', label: '' } })
|
||||
// `language.codes` is every ISO code the current language selection covers — one for a real
|
||||
// language, many for a legend TIER like "Arabic". It is what lets gridLanguage() tell "I can
|
||||
// express this" from "I cannot", instead of guessing from an empty code.
|
||||
const linked = reactive({ region: { value: '', label: '' }, religion: '', language: { value: '', label: '', codes: [] } })
|
||||
|
||||
// ★ WHAT THE LIST IS SHOWING, so the map can go there (BUILD-GRID-SELECTION-FLIES-THE-MAP).
|
||||
// The link ran one way: the map narrowed the grid, and the grid moved nothing. The grid already
|
||||
|
|
@ -254,7 +257,7 @@ const gridSlugs = ref([])
|
|||
function clearExcept(keep) {
|
||||
if (keep !== 'region' && (linked.region.value || linked.region.label)) { linked.region.value = ''; linked.region.label = '' }
|
||||
if (keep !== 'religion' && linked.religion) linked.religion = ''
|
||||
if (keep !== 'language' && (linked.language.value || linked.language.label)) { linked.language.value = ''; linked.language.label = '' }
|
||||
if (keep !== 'language' && (linked.language.value || linked.language.label)) { linked.language.value = ''; linked.language.label = ''; linked.language.codes = [] }
|
||||
}
|
||||
const slugify = (label) => String(label || '').toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '')
|
||||
|
||||
|
|
@ -291,6 +294,9 @@ function adopt(next) {
|
|||
if (v !== linked.language.value || l !== linked.language.label) {
|
||||
linked.language.value = v
|
||||
linked.language.label = l
|
||||
// Every code the selection covers. The grid direction reports ONE real language, so this is
|
||||
// that one code; the map direction may report a grouping (see the note on the push below).
|
||||
linked.language.codes = Array.isArray(next.language.codes) ? next.language.codes : (v ? [v] : [])
|
||||
clearExcept('language')
|
||||
}
|
||||
return
|
||||
|
|
@ -331,11 +337,43 @@ function onMapFiltered(ev) {
|
|||
adopt({
|
||||
region: { value: label ? slugify(label) : '', label },
|
||||
religion: ev?.detail?.religion || '',
|
||||
// The map sends both: the name its legend selected by, and the locale-stable ISO code.
|
||||
language: { value: ev?.detail?.languageCode || '', label: ev?.detail?.language || '' },
|
||||
// The map sends three things: the name its legend selected by, the locale-stable ISO code when
|
||||
// there IS a single one, and every code the selection covers.
|
||||
language: {
|
||||
value: ev?.detail?.languageCode || '',
|
||||
label: ev?.detail?.language || '',
|
||||
codes: Array.isArray(ev?.detail?.languageCodes) ? ev.detail.languageCodes : [],
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// ★ AN AXIS THIS GRID CANNOT EXPRESS MUST NOT NARROW IT TO NOTHING (rega, 2026-09-26: Languages >
|
||||
// Language > "Arabic" took the grid 2,107 -> 0 in BOTH locales, reading as "no results").
|
||||
//
|
||||
// This line used to be `linked.language.value || linked.language.label`, and the fallback was the
|
||||
// trap rather than the safety net. When the map reports a language TIER — "Arabic" — there is no
|
||||
// single ISO code that means it (MEASURED on the live source: "Arabic" covers "Arabic, Sudanese",
|
||||
// "Arabic, Levantine", "Arabic, Gulf" ... under many different codes), so the code arrives empty
|
||||
// and the NAME was sent instead. The grid's valueMatches() normalises and compares whole values, so
|
||||
// "Arabic" matches no row that reads "Arabic, Sudanese" — an empty grid, indistinguishable from a
|
||||
// genuinely empty result.
|
||||
//
|
||||
// The three cases, and none of them may lie:
|
||||
// one code -> send it. Locale-stable, and the grid filters exactly the selection.
|
||||
// many codes -> send NOTHING and leave the axis unfiltered. The map is narrowed, the grid is not,
|
||||
// and the reader can see both — which is honest. Sending the tier NAME would show
|
||||
// zero rows; sending one of the codes would show a fraction while looking correct.
|
||||
// Both are worse than not narrowing on an axis we cannot yet express.
|
||||
// no codes -> nothing is selected; send the label if there is one (the grid->map direction
|
||||
// always carries a real, single language, so its label is a value the grid owns).
|
||||
// The `many` case closes properly when filterSet goes multi-value (SPEC-DASHBOARD-KIT D1): the grid
|
||||
// then takes the whole set and this becomes a real narrowing instead of an honest abstention.
|
||||
function gridLanguage() {
|
||||
const codes = Array.isArray(linked.language.codes) ? linked.language.codes : []
|
||||
if (codes.length > 1) return ''
|
||||
return linked.language.value || linked.language.label
|
||||
}
|
||||
|
||||
let rootEl = null
|
||||
|
||||
// ★ PUSH THE STATE ONTO THE MOUNTED CHILDREN, DON'T JUST RE-COMPUTE THE SECTIONS.
|
||||
|
|
@ -363,7 +401,7 @@ function pushToChildren() {
|
|||
// ★ THE CODE, NOT THE NAME. valueMatches compares the normalized value as well as the label,
|
||||
// so a stable ISO code matches in every locale while a display name only matches in the one it
|
||||
// was fetched in.
|
||||
grid.setAttribute('primary-language', linked.language.value || linked.language.label)
|
||||
grid.setAttribute('primary-language', gridLanguage())
|
||||
}
|
||||
}
|
||||
watch(linked, pushToChildren, { deep: true })
|
||||
|
|
@ -469,7 +507,7 @@ const sections = computed(() => [
|
|||
// reason); driving them from the composite is the same channel, not a new one.
|
||||
'wagf-region': linked.region.value,
|
||||
'religion-family': linked.religion,
|
||||
'primary-language': linked.language.value || linked.language.label,
|
||||
'primary-language': gridLanguage(),
|
||||
}
|
||||
}
|
||||
])
|
||||
|
|
|
|||
|
|
@ -99,6 +99,13 @@ try {
|
|||
for (const locale of LOCALES) {
|
||||
for (const engine of PROVIDERS) {
|
||||
const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } })
|
||||
// ★ LISTEN BEFORE THE PAGE RUNS. The grid reports its total on its FIRST filter pass, which can happen
|
||||
// before an evaluate() after goto attaches a listener; the gate then read "the grid never reported a
|
||||
// total" while the grid had reported one (rega, ded4b3c1). Every total is recorded from the start.
|
||||
await page.addInitScript(() => {
|
||||
window.__lvTotals = []
|
||||
document.addEventListener('groups-filtered', (e) => { window.__lvTotals.push(e.detail?.total ?? null) }, true)
|
||||
})
|
||||
await page.goto(`${LEAF}?provider=${engine}&lang=${locale}`, { waitUntil: 'domcontentloaded', timeout: 60000 })
|
||||
|
||||
// Everything below runs in ONE evaluate: the totals have to be read from the same live page, and
|
||||
|
|
@ -129,9 +136,10 @@ try {
|
|||
|
||||
// The grid reports its total on every filter pass. Listening is how a total is read here: the
|
||||
// rendered count line is localized and the DOM shape is not this gate's business.
|
||||
let total = null
|
||||
const seen = []
|
||||
document.addEventListener('groups-filtered', (e) => { total = e.detail?.total ?? null; seen.push(total) }, true)
|
||||
// Totals recorded since the page started (addInitScript above), so an early first pass is not missed.
|
||||
const seen = window.__lvTotals || (window.__lvTotals = [])
|
||||
let total = seen.length ? seen[seen.length - 1] : null
|
||||
document.addEventListener('groups-filtered', (e) => { total = e.detail?.total ?? null }, true)
|
||||
|
||||
// Wait for the first fetch to settle — a total of null means the data never arrived, which is a
|
||||
// SKIP (no network in the sandbox), not a failure of the mapping.
|
||||
|
|
|
|||
|
|
@ -14,14 +14,9 @@ import { createAppI18n } from '@map/i18n/index.js'
|
|||
|
||||
const profileModules = import.meta.glob('./*.vue')
|
||||
|
||||
if (typeof window !== 'undefined' && window.mapboxgl?.setRTLTextPlugin) {
|
||||
try {
|
||||
window.mapboxgl.setRTLTextPlugin(
|
||||
'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.3.0/mapbox-gl-rtl-text.js',
|
||||
null, true
|
||||
)
|
||||
} catch (_) { /* already set this session */ }
|
||||
}
|
||||
// RTL text plugin (Arabic/Hebrew/Persian shaping): installed by useMapInstance through
|
||||
// library/maps/rtl-text.js, on BOTH engines, before every map is constructed. Do not re-add a
|
||||
// hand-rolled mapboxgl-only block here -- it was a strict subset of that call.
|
||||
|
||||
const El = defineCustomElement(ProfileLoader, {
|
||||
configureApp(app) {
|
||||
|
|
|
|||
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-GqrrpKeHPNicpqMRMVJkhWDf9bXnh5VfDTh2BomJrK51ihGF1nqB6gXxFp1CshKO" crossorigin="anonymous"></script>
|
||||
<script src="../all-people-groups.js" integrity="sha384-Qx9wLdFfKNdHYBhyeoGB0ETtxUT4zez3wcLum2KvFxcg7n/i90lvdy7BT1lxHlHC" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
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-Ii8bDqkNqNyPoL4R6n7nz0C7hBM4DggWRXcaFRSHrcKTjSgFYebrpeBfmbAKLCzx" crossorigin="anonymous"></script>
|
||||
<script src="../../big-picture.js" integrity="sha384-l5qKAw1/lWfpXlLMVl28TucB/gKLOz19w7mBee0K1kEVSU3JF4DAaQex3icthPbM" 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-Ii8bDqkNqNyPoL4R6n7nz0C7hBM4DggWRXcaFRSHrcKTjSgFYebrpeBfmbAKLCzx" crossorigin="anonymous"></script>
|
||||
<script src="../../big-picture.js" integrity="sha384-l5qKAw1/lWfpXlLMVl28TucB/gKLOz19w7mBee0K1kEVSU3JF4DAaQex3icthPbM" 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-Ii8bDqkNqNyPoL4R6n7nz0C7hBM4DggWRXcaFRSHrcKTjSgFYebrpeBfmbAKLCzx" crossorigin="anonymous"></script>
|
||||
<script src="../big-picture.js" integrity="sha384-l5qKAw1/lWfpXlLMVl28TucB/gKLOz19w7mBee0K1kEVSU3JF4DAaQex3icthPbM" 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-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT" 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-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT" 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-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+" crossorigin="anonymous"></script>
|
||||
<script src="../cities-internet.js" integrity="sha384-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT" 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-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP" 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-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP" 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-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP" 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-MEKfB+l81kMnJzhvslh4YCXoA4AIdi00sgFqe87KNAUGp68dKmwO1/05TTMrkoBO" crossorigin="anonymous"></script>
|
||||
<script src="../../dashboard-plus-grid.js" integrity="sha384-7NQE80ArZUorprJHX0abOHyxDK4E1c1gys6tDDh6fOusYvc+NPK7xd8GQgaoJ9XK" 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-MEKfB+l81kMnJzhvslh4YCXoA4AIdi00sgFqe87KNAUGp68dKmwO1/05TTMrkoBO" crossorigin="anonymous"></script>
|
||||
<script src="../dashboard-plus-grid.js" integrity="sha384-7NQE80ArZUorprJHX0abOHyxDK4E1c1gys6tDDh6fOusYvc+NPK7xd8GQgaoJ9XK" 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-xrvAnD3X+73viLIG7ZSP+ICAIiLZDoHE+h4RKMfw1KLIKxbmJjvbMmeR/+oorZfx" crossorigin="anonymous"></script>
|
||||
<script src="../demo-map.js" integrity="sha384-GAccfTSjvK/H/HhC+1ON41fFAa1oF3WGU3WoXmd9a2y6c7Kpc+6iKv78Tmc37Zc5" 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-xrvAnD3X+73viLIG7ZSP+ICAIiLZDoHE+h4RKMfw1KLIKxbmJjvbMmeR/+oorZfx" crossorigin="anonymous"></script>
|
||||
<script src="../../demo-map.js" integrity="sha384-GAccfTSjvK/H/HhC+1ON41fFAa1oF3WGU3WoXmd9a2y6c7Kpc+6iKv78Tmc37Zc5" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
"bundle": "all-people-groups",
|
||||
"scriptUrl": "./all-people-groups/all-people-groups.js",
|
||||
"output": "dx-maps/all-people-groups/all-people-groups.js",
|
||||
"integrity": "sha384-GqrrpKeHPNicpqMRMVJkhWDf9bXnh5VfDTh2BomJrK51ihGF1nqB6gXxFp1CshKO",
|
||||
"integrity": "sha384-Qx9wLdFfKNdHYBhyeoGB0ETtxUT4zez3wcLum2KvFxcg7n/i90lvdy7BT1lxHlHC",
|
||||
"elements": [
|
||||
"all-people-groups"
|
||||
],
|
||||
|
|
@ -28,7 +28,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-GqrrpKeHPNicpqMRMVJkhWDf9bXnh5VfDTh2BomJrK51ihGF1nqB6gXxFp1CshKO\" 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-Qx9wLdFfKNdHYBhyeoGB0ETtxUT4zez3wcLum2KvFxcg7n/i90lvdy7BT1lxHlHC\" 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 +38,7 @@
|
|||
"bundle": "big-picture",
|
||||
"scriptUrl": "./big-picture/big-picture.js",
|
||||
"output": "dx-maps/big-picture/big-picture.js",
|
||||
"integrity": "sha384-Ii8bDqkNqNyPoL4R6n7nz0C7hBM4DggWRXcaFRSHrcKTjSgFYebrpeBfmbAKLCzx",
|
||||
"integrity": "sha384-l5qKAw1/lWfpXlLMVl28TucB/gKLOz19w7mBee0K1kEVSU3JF4DAaQex3icthPbM",
|
||||
"elements": [
|
||||
"bp-big-picture",
|
||||
"bp-research-header",
|
||||
|
|
@ -60,7 +60,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-Ii8bDqkNqNyPoL4R6n7nz0C7hBM4DggWRXcaFRSHrcKTjSgFYebrpeBfmbAKLCzx\" 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-l5qKAw1/lWfpXlLMVl28TucB/gKLOz19w7mBee0K1kEVSU3JF4DAaQex3icthPbM\" 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,7 +104,7 @@
|
|||
"bundle": "cities-internet",
|
||||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"output": "dx-maps/cities-internet/cities-internet.js",
|
||||
"integrity": "sha384-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+",
|
||||
"integrity": "sha384-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT",
|
||||
"elements": [
|
||||
"cities-internet-map"
|
||||
],
|
||||
|
|
@ -120,7 +120,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/connectivity-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+\" 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-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -134,7 +134,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/connectivity-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+\" 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-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -148,7 +148,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+\" 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-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -157,7 +157,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "dx-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy",
|
||||
"integrity": "sha384-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -177,7 +177,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy\" 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-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -191,7 +191,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy\" 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-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -205,7 +205,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy\" 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-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -214,7 +214,7 @@
|
|||
"bundle": "dashboard-plus-grid",
|
||||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"integrity": "sha384-MEKfB+l81kMnJzhvslh4YCXoA4AIdi00sgFqe87KNAUGp68dKmwO1/05TTMrkoBO",
|
||||
"integrity": "sha384-7NQE80ArZUorprJHX0abOHyxDK4E1c1gys6tDDh6fOusYvc+NPK7xd8GQgaoJ9XK",
|
||||
"elements": [
|
||||
"dashboard-plus-grid"
|
||||
],
|
||||
|
|
@ -234,7 +234,7 @@
|
|||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-MEKfB+l81kMnJzhvslh4YCXoA4AIdi00sgFqe87KNAUGp68dKmwO1/05TTMrkoBO\" 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-7NQE80ArZUorprJHX0abOHyxDK4E1c1gys6tDDh6fOusYvc+NPK7xd8GQgaoJ9XK\" 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,7 +258,7 @@
|
|||
"bundle": "demo-map",
|
||||
"scriptUrl": "./demo-map/demo-map.js",
|
||||
"output": "dx-maps/demo-map/demo-map.js",
|
||||
"integrity": "sha384-xrvAnD3X+73viLIG7ZSP+ICAIiLZDoHE+h4RKMfw1KLIKxbmJjvbMmeR/+oorZfx",
|
||||
"integrity": "sha384-GAccfTSjvK/H/HhC+1ON41fFAa1oF3WGU3WoXmd9a2y6c7Kpc+6iKv78Tmc37Zc5",
|
||||
"elements": [
|
||||
"demo-map"
|
||||
],
|
||||
|
|
@ -274,7 +274,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-xrvAnD3X+73viLIG7ZSP+ICAIiLZDoHE+h4RKMfw1KLIKxbmJjvbMmeR/+oorZfx\" 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-GAccfTSjvK/H/HhC+1ON41fFAa1oF3WGU3WoXmd9a2y6c7Kpc+6iKv78Tmc37Zc5\" 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": [
|
||||
{
|
||||
|
|
@ -353,7 +353,7 @@
|
|||
"bundle": "doxa-research-map",
|
||||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
|
||||
"integrity": "sha384-KX1NdxBkys/2YfTqqPvij7DCuYcORFsjcPIcdYbHYfS/XHtaAAaBX/1ynudQZUKI",
|
||||
"integrity": "sha384-slCFEOZicZgY1H8WoL1o20OsJfG8KfpYGD7a40WlqN51gY6fZx3nh4ilCZEEKGBy",
|
||||
"elements": [
|
||||
"doxa-research-map"
|
||||
],
|
||||
|
|
@ -369,7 +369,7 @@
|
|||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-KX1NdxBkys/2YfTqqPvij7DCuYcORFsjcPIcdYbHYfS/XHtaAAaBX/1ynudQZUKI\" 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-slCFEOZicZgY1H8WoL1o20OsJfG8KfpYGD7a40WlqN51gY6fZx3nh4ilCZEEKGBy\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -395,7 +395,7 @@
|
|||
"bundle": "doxa-simple-map",
|
||||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
|
||||
"integrity": "sha384-TezIC+FDA6G/n/5XivwHrUL1UA3fnrlTlojmoKPl8dfPEsZXv8e00hI3psqppmif",
|
||||
"integrity": "sha384-rVv6XJkWfVdDgsWpIj4gDmYIsYRIe8ss5zTl3QE5mqWf9N/EHksTC8dcYMSevJ9N",
|
||||
"elements": [
|
||||
"doxa-map",
|
||||
"doxa-simple-map"
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-TezIC+FDA6G/n/5XivwHrUL1UA3fnrlTlojmoKPl8dfPEsZXv8e00hI3psqppmif\" 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-rVv6XJkWfVdDgsWpIj4gDmYIsYRIe8ss5zTl3QE5mqWf9N/EHksTC8dcYMSevJ9N\" 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": [
|
||||
{
|
||||
|
|
@ -578,7 +578,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "dx-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms",
|
||||
"integrity": "sha384-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -598,7 +598,7 @@
|
|||
"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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -612,7 +612,7 @@
|
|||
"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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -626,7 +626,7 @@
|
|||
"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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -640,7 +640,7 @@
|
|||
"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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -654,7 +654,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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -663,7 +663,7 @@
|
|||
"bundle": "my-upg-100-list",
|
||||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"output": "dx-maps/my-upg-100-list/my-upg-100-list.js",
|
||||
"integrity": "sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw",
|
||||
"integrity": "sha384-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We",
|
||||
"elements": [
|
||||
"my-upg-100-list-map"
|
||||
],
|
||||
|
|
@ -683,7 +683,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw\" 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-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -697,7 +697,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw\" 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-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -711,7 +711,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw\" 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-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We\" 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,7 +836,7 @@
|
|||
"bundle": "pplr-data-maps",
|
||||
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
|
||||
"output": "dx-maps/pplr-data-maps/pplr-data-maps.js",
|
||||
"integrity": "sha384-F7yjGcJ1XstrULKAWGNtlPeV/Ytg+cQ9PbYV9QR8VDe/6w50Suv0600KloBMpCkb",
|
||||
"integrity": "sha384-tFMV6+dq4KC8cIb7WT27bNde/v93wiAeujhpNOUzgjdbmMFx8c6eMskb1OlgntMV",
|
||||
"elements": [
|
||||
"pplr-data-maps"
|
||||
],
|
||||
|
|
@ -852,7 +852,7 @@
|
|||
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./pplr-data-maps/pplr-data-maps/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=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-F7yjGcJ1XstrULKAWGNtlPeV/Ytg+cQ9PbYV9QR8VDe/6w50Suv0600KloBMpCkb\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
|
||||
"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=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-tFMV6+dq4KC8cIb7WT27bNde/v93wiAeujhpNOUzgjdbmMFx8c6eMskb1OlgntMV\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
|
||||
},
|
||||
"bundle": "pplr-data-maps"
|
||||
}
|
||||
|
|
@ -887,7 +887,7 @@
|
|||
"bundle": "regions-dashboard",
|
||||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
|
||||
"integrity": "sha384-E2TtOMaLi9WMDqht+ly/65LcvWbUL68bqV20NUEt/BUo4xWqWpUOwjzlDU2Zlicz",
|
||||
"integrity": "sha384-I7fTUAjxbs4wm8gRsNxQMmL2Bfho0Ei65mFMJAsskWmgjEvgfMeIGb0Pu9pZSxkA",
|
||||
"elements": [
|
||||
"regions-dashboard"
|
||||
],
|
||||
|
|
@ -907,7 +907,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- 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-E2TtOMaLi9WMDqht+ly/65LcvWbUL68bqV20NUEt/BUo4xWqWpUOwjzlDU2Zlicz\" 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-I7fTUAjxbs4wm8gRsNxQMmL2Bfho0Ei65mFMJAsskWmgjEvgfMeIGb0Pu9pZSxkA\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-E2TtOMaLi9WMDqht+ly/65LcvWbUL68bqV20NUEt/BUo4xWqWpUOwjzlDU2Zlicz\" 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-I7fTUAjxbs4wm8gRsNxQMmL2Bfho0Ei65mFMJAsskWmgjEvgfMeIGb0Pu9pZSxkA\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -935,7 +935,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-E2TtOMaLi9WMDqht+ly/65LcvWbUL68bqV20NUEt/BUo4xWqWpUOwjzlDU2Zlicz\" 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-I7fTUAjxbs4wm8gRsNxQMmL2Bfho0Ei65mFMJAsskWmgjEvgfMeIGb0Pu9pZSxkA\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -944,7 +944,7 @@
|
|||
"bundle": "research-dashboard",
|
||||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"output": "dx-maps/research-dashboard/research-dashboard.js",
|
||||
"integrity": "sha384-nOvTqtlseY8s/ql6YdqAZ42fVWTjWChK5l5QvGMaZ5pjKOLX4ANrfXN9u93SzS3h",
|
||||
"integrity": "sha384-VE9fSeMZSxYtIaJc3qYaVZKQl7njIRIdDxj5dPopkdeCN9OedQndX10Ny/TPKECL",
|
||||
"elements": [
|
||||
"research-dashboard-map"
|
||||
],
|
||||
|
|
@ -960,7 +960,7 @@
|
|||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-nOvTqtlseY8s/ql6YdqAZ42fVWTjWChK5l5QvGMaZ5pjKOLX4ANrfXN9u93SzS3h\" 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-VE9fSeMZSxYtIaJc3qYaVZKQl7njIRIdDxj5dPopkdeCN9OedQndX10Ny/TPKECL\" 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"
|
||||
}
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"bundle": "research-map-plus-grid",
|
||||
"scriptUrl": "./research-map-plus-grid/research-map-plus-grid.js",
|
||||
"output": "dx-maps/research-map-plus-grid/research-map-plus-grid.js",
|
||||
"integrity": "sha384-mUijovmr70lmhkp4ZJfJzpc9NLNc0xDADtgiatvxLAhQqOCW2xOYsH+5siFigPKa",
|
||||
"integrity": "sha384-MZuYms3ihyjWC7Qf946V1ykPMoKrvBxanLdNJjadVwZ7jAJNQw5MHXRrKi1WXChm",
|
||||
"elements": [
|
||||
"research-map-plus-grid"
|
||||
],
|
||||
|
|
@ -990,7 +990,7 @@
|
|||
"scriptUrl": "./research-map-plus-grid/research-map-plus-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./research-map-plus-grid/research-map-plus-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=\"./research-map-plus-grid/research-map-plus-grid.js\" integrity=\"sha384-mUijovmr70lmhkp4ZJfJzpc9NLNc0xDADtgiatvxLAhQqOCW2xOYsH+5siFigPKa\" crossorigin=\"anonymous\"></script>\n<research-map-plus-grid profile-config='{\"profile\":\"research-map-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-map-plus-grid>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-map-plus-grid/research-map-plus-grid.js\" integrity=\"sha384-MZuYms3ihyjWC7Qf946V1ykPMoKrvBxanLdNJjadVwZ7jAJNQw5MHXRrKi1WXChm\" crossorigin=\"anonymous\"></script>\n<research-map-plus-grid profile-config='{\"profile\":\"research-map-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-map-plus-grid>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -1058,7 +1058,7 @@
|
|||
"bundle": "upg-neighbor",
|
||||
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
|
||||
"output": "dx-maps/upg-neighbor/upg-neighbor.js",
|
||||
"integrity": "sha384-44S6652UocuovSnHaRUk3ZbToNMetvKHIYjLzr6dNAEXW9FQFmHd0A00mkvAatok",
|
||||
"integrity": "sha384-2R+GNbOw3l9fztqftPCJlW5C3duiuJx7DTts8BCGj+OotbAo5xNovu7mMDjcafnl",
|
||||
"elements": [
|
||||
"upg-neighbor"
|
||||
],
|
||||
|
|
@ -1074,7 +1074,7 @@
|
|||
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./upg-neighbor/upg-neighbor/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=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-44S6652UocuovSnHaRUk3ZbToNMetvKHIYjLzr6dNAEXW9FQFmHd0A00mkvAatok\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
|
||||
"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=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-2R+GNbOw3l9fztqftPCJlW5C3duiuJx7DTts8BCGj+OotbAo5xNovu7mMDjcafnl\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -1157,7 +1157,7 @@
|
|||
"bundle": "wall-of-people-groups",
|
||||
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
|
||||
"output": "dx-maps/wall-of-people-groups/wall-of-people-groups.js",
|
||||
"integrity": "sha384-ea+H1HKC3naGbAvJ7Jqk43/z5Vp/Y0HGHgJYicGKQu9A3MA4StbTsV89rk84VDlj",
|
||||
"integrity": "sha384-rHx1Z84rV9g4d5NpsHnc6aiHpzjdTkQArhM4CbU8pDzbRKSJtTFHk22EOOXQzNTz",
|
||||
"elements": [
|
||||
"wall-of-people-groups"
|
||||
],
|
||||
|
|
@ -1173,7 +1173,7 @@
|
|||
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./wall-of-people-groups/wall-of-people-groups/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=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-ea+H1HKC3naGbAvJ7Jqk43/z5Vp/Y0HGHgJYicGKQu9A3MA4StbTsV89rk84VDlj\" crossorigin=\"anonymous\"></script>\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-rHx1Z84rV9g4d5NpsHnc6aiHpzjdTkQArhM4CbU8pDzbRKSJtTFHk22EOOXQzNTz\" crossorigin=\"anonymous\"></script>\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
|
||||
},
|
||||
"bundle": "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-KX1NdxBkys/2YfTqqPvij7DCuYcORFsjcPIcdYbHYfS/XHtaAAaBX/1ynudQZUKI" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-research-map.js" integrity="sha384-slCFEOZicZgY1H8WoL1o20OsJfG8KfpYGD7a40WlqN51gY6fZx3nh4ilCZEEKGBy" 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-KX1NdxBkys/2YfTqqPvij7DCuYcORFsjcPIcdYbHYfS/XHtaAAaBX/1ynudQZUKI" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-research-map.js" integrity="sha384-slCFEOZicZgY1H8WoL1o20OsJfG8KfpYGD7a40WlqN51gY6fZx3nh4ilCZEEKGBy" 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-TezIC+FDA6G/n/5XivwHrUL1UA3fnrlTlojmoKPl8dfPEsZXv8e00hI3psqppmif" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-rVv6XJkWfVdDgsWpIj4gDmYIsYRIe8ss5zTl3QE5mqWf9N/EHksTC8dcYMSevJ9N" 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-TezIC+FDA6G/n/5XivwHrUL1UA3fnrlTlojmoKPl8dfPEsZXv8e00hI3psqppmif" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-rVv6XJkWfVdDgsWpIj4gDmYIsYRIe8ss5zTl3QE5mqWf9N/EHksTC8dcYMSevJ9N" 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-TezIC+FDA6G/n/5XivwHrUL1UA3fnrlTlojmoKPl8dfPEsZXv8e00hI3psqppmif" crossorigin="anonymous"></script>
|
||||
<script src="../doxa-simple-map.js" integrity="sha384-rVv6XJkWfVdDgsWpIj4gDmYIsYRIe8ss5zTl3QE5mqWf9N/EHksTC8dcYMSevJ9N" 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-TezIC+FDA6G/n/5XivwHrUL1UA3fnrlTlojmoKPl8dfPEsZXv8e00hI3psqppmif" crossorigin="anonymous"></script>
|
||||
<script src="../../doxa-simple-map.js" integrity="sha384-rVv6XJkWfVdDgsWpIj4gDmYIsYRIe8ss5zTl3QE5mqWf9N/EHksTC8dcYMSevJ9N" 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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC" 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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC" 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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC" 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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC" 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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -12,7 +12,7 @@
|
|||
"bundle": "all-people-groups",
|
||||
"scriptUrl": "./all-people-groups/all-people-groups.js",
|
||||
"output": "dx-maps/all-people-groups/all-people-groups.js",
|
||||
"integrity": "sha384-GqrrpKeHPNicpqMRMVJkhWDf9bXnh5VfDTh2BomJrK51ihGF1nqB6gXxFp1CshKO",
|
||||
"integrity": "sha384-Qx9wLdFfKNdHYBhyeoGB0ETtxUT4zez3wcLum2KvFxcg7n/i90lvdy7BT1lxHlHC",
|
||||
"elements": [
|
||||
"all-people-groups"
|
||||
],
|
||||
|
|
@ -28,7 +28,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-GqrrpKeHPNicpqMRMVJkhWDf9bXnh5VfDTh2BomJrK51ihGF1nqB6gXxFp1CshKO\" 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-Qx9wLdFfKNdHYBhyeoGB0ETtxUT4zez3wcLum2KvFxcg7n/i90lvdy7BT1lxHlHC\" 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 +38,7 @@
|
|||
"bundle": "big-picture",
|
||||
"scriptUrl": "./big-picture/big-picture.js",
|
||||
"output": "dx-maps/big-picture/big-picture.js",
|
||||
"integrity": "sha384-Ii8bDqkNqNyPoL4R6n7nz0C7hBM4DggWRXcaFRSHrcKTjSgFYebrpeBfmbAKLCzx",
|
||||
"integrity": "sha384-l5qKAw1/lWfpXlLMVl28TucB/gKLOz19w7mBee0K1kEVSU3JF4DAaQex3icthPbM",
|
||||
"elements": [
|
||||
"bp-big-picture",
|
||||
"bp-research-header",
|
||||
|
|
@ -60,7 +60,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-Ii8bDqkNqNyPoL4R6n7nz0C7hBM4DggWRXcaFRSHrcKTjSgFYebrpeBfmbAKLCzx\" 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-l5qKAw1/lWfpXlLMVl28TucB/gKLOz19w7mBee0K1kEVSU3JF4DAaQex3icthPbM\" 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,7 +104,7 @@
|
|||
"bundle": "cities-internet",
|
||||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"output": "dx-maps/cities-internet/cities-internet.js",
|
||||
"integrity": "sha384-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+",
|
||||
"integrity": "sha384-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT",
|
||||
"elements": [
|
||||
"cities-internet-map"
|
||||
],
|
||||
|
|
@ -120,7 +120,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/connectivity-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+\" 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-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -134,7 +134,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/connectivity-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+\" 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-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -148,7 +148,7 @@
|
|||
"scriptUrl": "./cities-internet/cities-internet.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./cities-internet/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-IiDQsuUkIp5DtPAqBrdSA5x1d+ZnGr0EXt8e2z8NqzotWivHIfBw4g7kAnWM5+9+\" 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-Bdw2y7kr30dholEdmozYlqnNJqnXmtNOx94N5xk1jYyrZ/Ax7MiQ/lr1XyQ/PXpT\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></cities-internet-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -157,7 +157,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "dx-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy",
|
||||
"integrity": "sha384-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -177,7 +177,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy\" 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-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -191,7 +191,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy\" 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-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -205,7 +205,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5Ak2Q66zQN4cBwFAgivx9o6ahN5DloKEzTXsbJD0tegMpwHmL+kB98BZ6x5lSaFy\" 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-ivAM09u3T7y7mnlH6VjVyNaA2Z9nsT09rt1ND8/UqqM6N4l05c6nUdAC3UXuDoaP\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -214,7 +214,7 @@
|
|||
"bundle": "dashboard-plus-grid",
|
||||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"integrity": "sha384-MEKfB+l81kMnJzhvslh4YCXoA4AIdi00sgFqe87KNAUGp68dKmwO1/05TTMrkoBO",
|
||||
"integrity": "sha384-7NQE80ArZUorprJHX0abOHyxDK4E1c1gys6tDDh6fOusYvc+NPK7xd8GQgaoJ9XK",
|
||||
"elements": [
|
||||
"dashboard-plus-grid"
|
||||
],
|
||||
|
|
@ -234,7 +234,7 @@
|
|||
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-MEKfB+l81kMnJzhvslh4YCXoA4AIdi00sgFqe87KNAUGp68dKmwO1/05TTMrkoBO\" 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-7NQE80ArZUorprJHX0abOHyxDK4E1c1gys6tDDh6fOusYvc+NPK7xd8GQgaoJ9XK\" 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,7 +258,7 @@
|
|||
"bundle": "demo-map",
|
||||
"scriptUrl": "./demo-map/demo-map.js",
|
||||
"output": "dx-maps/demo-map/demo-map.js",
|
||||
"integrity": "sha384-xrvAnD3X+73viLIG7ZSP+ICAIiLZDoHE+h4RKMfw1KLIKxbmJjvbMmeR/+oorZfx",
|
||||
"integrity": "sha384-GAccfTSjvK/H/HhC+1ON41fFAa1oF3WGU3WoXmd9a2y6c7Kpc+6iKv78Tmc37Zc5",
|
||||
"elements": [
|
||||
"demo-map"
|
||||
],
|
||||
|
|
@ -274,7 +274,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-xrvAnD3X+73viLIG7ZSP+ICAIiLZDoHE+h4RKMfw1KLIKxbmJjvbMmeR/+oorZfx\" 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-GAccfTSjvK/H/HhC+1ON41fFAa1oF3WGU3WoXmd9a2y6c7Kpc+6iKv78Tmc37Zc5\" 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": [
|
||||
{
|
||||
|
|
@ -353,7 +353,7 @@
|
|||
"bundle": "doxa-research-map",
|
||||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"output": "dx-maps/doxa-research-map/doxa-research-map.js",
|
||||
"integrity": "sha384-KX1NdxBkys/2YfTqqPvij7DCuYcORFsjcPIcdYbHYfS/XHtaAAaBX/1ynudQZUKI",
|
||||
"integrity": "sha384-slCFEOZicZgY1H8WoL1o20OsJfG8KfpYGD7a40WlqN51gY6fZx3nh4ilCZEEKGBy",
|
||||
"elements": [
|
||||
"doxa-research-map"
|
||||
],
|
||||
|
|
@ -369,7 +369,7 @@
|
|||
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-KX1NdxBkys/2YfTqqPvij7DCuYcORFsjcPIcdYbHYfS/XHtaAAaBX/1ynudQZUKI\" 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-slCFEOZicZgY1H8WoL1o20OsJfG8KfpYGD7a40WlqN51gY6fZx3nh4ilCZEEKGBy\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -395,7 +395,7 @@
|
|||
"bundle": "doxa-simple-map",
|
||||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"output": "dx-maps/doxa-simple-map/doxa-simple-map.js",
|
||||
"integrity": "sha384-TezIC+FDA6G/n/5XivwHrUL1UA3fnrlTlojmoKPl8dfPEsZXv8e00hI3psqppmif",
|
||||
"integrity": "sha384-rVv6XJkWfVdDgsWpIj4gDmYIsYRIe8ss5zTl3QE5mqWf9N/EHksTC8dcYMSevJ9N",
|
||||
"elements": [
|
||||
"doxa-map",
|
||||
"doxa-simple-map"
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-TezIC+FDA6G/n/5XivwHrUL1UA3fnrlTlojmoKPl8dfPEsZXv8e00hI3psqppmif\" 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-rVv6XJkWfVdDgsWpIj4gDmYIsYRIe8ss5zTl3QE5mqWf9N/EHksTC8dcYMSevJ9N\" 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": [
|
||||
{
|
||||
|
|
@ -578,7 +578,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "dx-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms",
|
||||
"integrity": "sha384-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -598,7 +598,7 @@
|
|||
"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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -612,7 +612,7 @@
|
|||
"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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -626,7 +626,7 @@
|
|||
"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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -640,7 +640,7 @@
|
|||
"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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -654,7 +654,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-d5e44udaQsTti4ubI2cR4Vfyt6CYDOm09rI1LGkhXxOVj7eYt9v+CaVByuTBG4ms\" 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-BbPsgA+ui2F6dNnbRw6FC/pbkyDef0gJH32VeJgA2b8rOCYCBFR6OxpCrdVcORYC\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -663,7 +663,7 @@
|
|||
"bundle": "my-upg-100-list",
|
||||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"output": "dx-maps/my-upg-100-list/my-upg-100-list.js",
|
||||
"integrity": "sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw",
|
||||
"integrity": "sha384-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We",
|
||||
"elements": [
|
||||
"my-upg-100-list-map"
|
||||
],
|
||||
|
|
@ -683,7 +683,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw\" 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-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -697,7 +697,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw\" 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-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -711,7 +711,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw\" 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-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We\" 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,7 +836,7 @@
|
|||
"bundle": "pplr-data-maps",
|
||||
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
|
||||
"output": "dx-maps/pplr-data-maps/pplr-data-maps.js",
|
||||
"integrity": "sha384-F7yjGcJ1XstrULKAWGNtlPeV/Ytg+cQ9PbYV9QR8VDe/6w50Suv0600KloBMpCkb",
|
||||
"integrity": "sha384-tFMV6+dq4KC8cIb7WT27bNde/v93wiAeujhpNOUzgjdbmMFx8c6eMskb1OlgntMV",
|
||||
"elements": [
|
||||
"pplr-data-maps"
|
||||
],
|
||||
|
|
@ -852,7 +852,7 @@
|
|||
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./pplr-data-maps/pplr-data-maps/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=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-F7yjGcJ1XstrULKAWGNtlPeV/Ytg+cQ9PbYV9QR8VDe/6w50Suv0600KloBMpCkb\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
|
||||
"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=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-tFMV6+dq4KC8cIb7WT27bNde/v93wiAeujhpNOUzgjdbmMFx8c6eMskb1OlgntMV\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
|
||||
},
|
||||
"bundle": "pplr-data-maps"
|
||||
}
|
||||
|
|
@ -887,7 +887,7 @@
|
|||
"bundle": "regions-dashboard",
|
||||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
|
||||
"integrity": "sha384-E2TtOMaLi9WMDqht+ly/65LcvWbUL68bqV20NUEt/BUo4xWqWpUOwjzlDU2Zlicz",
|
||||
"integrity": "sha384-I7fTUAjxbs4wm8gRsNxQMmL2Bfho0Ei65mFMJAsskWmgjEvgfMeIGb0Pu9pZSxkA",
|
||||
"elements": [
|
||||
"regions-dashboard"
|
||||
],
|
||||
|
|
@ -907,7 +907,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- 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-E2TtOMaLi9WMDqht+ly/65LcvWbUL68bqV20NUEt/BUo4xWqWpUOwjzlDU2Zlicz\" 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-I7fTUAjxbs4wm8gRsNxQMmL2Bfho0Ei65mFMJAsskWmgjEvgfMeIGb0Pu9pZSxkA\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-E2TtOMaLi9WMDqht+ly/65LcvWbUL68bqV20NUEt/BUo4xWqWpUOwjzlDU2Zlicz\" 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-I7fTUAjxbs4wm8gRsNxQMmL2Bfho0Ei65mFMJAsskWmgjEvgfMeIGb0Pu9pZSxkA\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -935,7 +935,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-E2TtOMaLi9WMDqht+ly/65LcvWbUL68bqV20NUEt/BUo4xWqWpUOwjzlDU2Zlicz\" 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-I7fTUAjxbs4wm8gRsNxQMmL2Bfho0Ei65mFMJAsskWmgjEvgfMeIGb0Pu9pZSxkA\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -944,7 +944,7 @@
|
|||
"bundle": "research-dashboard",
|
||||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"output": "dx-maps/research-dashboard/research-dashboard.js",
|
||||
"integrity": "sha384-nOvTqtlseY8s/ql6YdqAZ42fVWTjWChK5l5QvGMaZ5pjKOLX4ANrfXN9u93SzS3h",
|
||||
"integrity": "sha384-VE9fSeMZSxYtIaJc3qYaVZKQl7njIRIdDxj5dPopkdeCN9OedQndX10Ny/TPKECL",
|
||||
"elements": [
|
||||
"research-dashboard-map"
|
||||
],
|
||||
|
|
@ -960,7 +960,7 @@
|
|||
"scriptUrl": "./research-dashboard/research-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-nOvTqtlseY8s/ql6YdqAZ42fVWTjWChK5l5QvGMaZ5pjKOLX4ANrfXN9u93SzS3h\" 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-VE9fSeMZSxYtIaJc3qYaVZKQl7njIRIdDxj5dPopkdeCN9OedQndX10Ny/TPKECL\" 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"
|
||||
}
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"bundle": "research-map-plus-grid",
|
||||
"scriptUrl": "./research-map-plus-grid/research-map-plus-grid.js",
|
||||
"output": "dx-maps/research-map-plus-grid/research-map-plus-grid.js",
|
||||
"integrity": "sha384-mUijovmr70lmhkp4ZJfJzpc9NLNc0xDADtgiatvxLAhQqOCW2xOYsH+5siFigPKa",
|
||||
"integrity": "sha384-MZuYms3ihyjWC7Qf946V1ykPMoKrvBxanLdNJjadVwZ7jAJNQw5MHXRrKi1WXChm",
|
||||
"elements": [
|
||||
"research-map-plus-grid"
|
||||
],
|
||||
|
|
@ -990,7 +990,7 @@
|
|||
"scriptUrl": "./research-map-plus-grid/research-map-plus-grid.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./research-map-plus-grid/research-map-plus-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=\"./research-map-plus-grid/research-map-plus-grid.js\" integrity=\"sha384-mUijovmr70lmhkp4ZJfJzpc9NLNc0xDADtgiatvxLAhQqOCW2xOYsH+5siFigPKa\" crossorigin=\"anonymous\"></script>\n<research-map-plus-grid profile-config='{\"profile\":\"research-map-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-map-plus-grid>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-map-plus-grid/research-map-plus-grid.js\" integrity=\"sha384-MZuYms3ihyjWC7Qf946V1ykPMoKrvBxanLdNJjadVwZ7jAJNQw5MHXRrKi1WXChm\" crossorigin=\"anonymous\"></script>\n<research-map-plus-grid profile-config='{\"profile\":\"research-map-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-map-plus-grid>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -1058,7 +1058,7 @@
|
|||
"bundle": "upg-neighbor",
|
||||
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
|
||||
"output": "dx-maps/upg-neighbor/upg-neighbor.js",
|
||||
"integrity": "sha384-44S6652UocuovSnHaRUk3ZbToNMetvKHIYjLzr6dNAEXW9FQFmHd0A00mkvAatok",
|
||||
"integrity": "sha384-2R+GNbOw3l9fztqftPCJlW5C3duiuJx7DTts8BCGj+OotbAo5xNovu7mMDjcafnl",
|
||||
"elements": [
|
||||
"upg-neighbor"
|
||||
],
|
||||
|
|
@ -1074,7 +1074,7 @@
|
|||
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./upg-neighbor/upg-neighbor/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=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-44S6652UocuovSnHaRUk3ZbToNMetvKHIYjLzr6dNAEXW9FQFmHd0A00mkvAatok\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
|
||||
"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=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-2R+GNbOw3l9fztqftPCJlW5C3duiuJx7DTts8BCGj+OotbAo5xNovu7mMDjcafnl\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
|
||||
},
|
||||
"instances": [
|
||||
{
|
||||
|
|
@ -1157,7 +1157,7 @@
|
|||
"bundle": "wall-of-people-groups",
|
||||
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
|
||||
"output": "dx-maps/wall-of-people-groups/wall-of-people-groups.js",
|
||||
"integrity": "sha384-ea+H1HKC3naGbAvJ7Jqk43/z5Vp/Y0HGHgJYicGKQu9A3MA4StbTsV89rk84VDlj",
|
||||
"integrity": "sha384-rHx1Z84rV9g4d5NpsHnc6aiHpzjdTkQArhM4CbU8pDzbRKSJtTFHk22EOOXQzNTz",
|
||||
"elements": [
|
||||
"wall-of-people-groups"
|
||||
],
|
||||
|
|
@ -1173,7 +1173,7 @@
|
|||
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./wall-of-people-groups/wall-of-people-groups/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=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-ea+H1HKC3naGbAvJ7Jqk43/z5Vp/Y0HGHgJYicGKQu9A3MA4StbTsV89rk84VDlj\" crossorigin=\"anonymous\"></script>\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-rHx1Z84rV9g4d5NpsHnc6aiHpzjdTkQArhM4CbU8pDzbRKSJtTFHk22EOOXQzNTz\" crossorigin=\"anonymous\"></script>\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
|
||||
},
|
||||
"bundle": "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-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-ggRoC/GNWuVhZ0/7xr7Zt892yekJPREMrOow6GVXFJCvynJGfFj/jsi4DtLtcXLw" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-tO26eAF9J8sMQCBgfkfttC6HMFxPlqOaEqC1j245Yq5k+kkW0zyB95Ze1/VqU2We" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue