Big Picture's header speaks the reader's language, and both composites turn round for it

TWO DEFECTS FROM THE UNIVERSAL-PROPS MATRIX, and they are the same defect at two
levels: a component can be perfectly localized and still show English, and a
page can be perfectly translated and still be laid out backwards.

★ THE HEADER HAD NO i18n AT ALL. Every label at the top of Big Picture was an
English literal passed as a PROP — FilterDropdown translates nothing, it renders
what the caller hands it — so Region, Bloc, People Group and Religion sat in
English above an Arabic page. They now read the catalogue, grid namespace first
because this header drives the cap-2 grid and its sibling reads the same keys.
Reset uses controls.reset_all, so its English becomes "Reset all": an existing
entry rather than invented wording, and arguably more accurate, since it clears
the search too.

Its search placeholder and two aria-labels have no usable entry — the nearest,
grid.search, drops "or countries", which this search actually covers — so they
are on the DECIDE card rather than quietly reworded. They are invisible to
check:composite-locale-leaks by design: its criterion is that the catalogue
already holds the string, and it does not.

★ RTL IS A DIRECTION, NOT A TRANSLATION. createAppI18n reflects an RTL locale
onto document.documentElement, which is right for a leaf page it owns and
useless for an element dropped into somebody else's page — the case these
composites exist for. A host asking for Arabic got Arabic WORDS in a
left-to-right layout: readable glyphs in the wrong place, which reads as a
styling quirk rather than the bug it is.

Both composites now set `dir` on their custom-element HOST rather than on the
layout inside it, and that choice is the fix: `dir` takes effect through the
inherited CSS `direction`, and inheritance crosses shadow boundaries, so one
attribute covers the composite's own chrome AND every nested element beneath it
— including the grid half the audit found bare. Only ever SET, never cleared: a
host page that declares its own dir owns that decision.

VERIFIED HEADLESS: three bundles build; setAttribute("dir","rtl") is present in
both composites and controls.reset_all in big-picture; freshness and SRI clean,
nothing else stale; gates:pre 6/6. NEEDS EYES: Big Picture and Simple Research
at ?lang=ar — header labels in Arabic, and the layout actually mirrored.
This commit is contained in:
Doxa Maps 2026-09-26 00:13:46 +00:00
parent b5d849f746
commit 08f89f55b3
15 changed files with 133 additions and 70 deletions

View file

@ -39,6 +39,19 @@ import { ref, reactive, watch, computed, onMounted, getCurrentInstance } from 'v
// SHARED search primitives (one source of truth for BOTH cap-2 grid + cap-1 dashboard).
import SearchBar from '@map/components/search/SearchBar.vue'
import FilterDropdown from '@map/components/search/FilterDropdown.vue'
import { tStatic } from '@map/i18n/index.js'
// ★ THIS HEADER HAD NO i18n AT ALL, and it is the top of Big Picture. Every label below was an
// English literal passed as a PROP — FilterDropdown itself translates nothing, it renders what the
// caller hands it, so a perfectly localized component showed "Region" on an Arabic page. Read
// through tStatic rather than useI18n, for the reason the rest of this tree gives: these components
// mount inside custom elements that install no i18n plugin, and an unguarded useI18n() throws on
// the way in and takes the whole header with it.
//
// The grid namespace first, because this header drives the cap-2 grid and its sibling reads the
// same keys; dashboard.* second; the English literal last, so a missing key degrades to what
// shipped rather than to a key name.
const L = (key, en) => tStatic('grid.' + key) || tStatic('dashboard.' + key) || en
const props = defineProps({
// live count of matched groups, pushed back down by the composite for display.
@ -160,22 +173,22 @@ onMounted(loadOptions)
<!-- The FOUR SHARED FilterDropdowns (replace the two native <select>s). -->
<div class="rh-controls">
<FilterDropdown
label="Region" name="wagf_region"
:label="L('wagf_region', 'Region')" name="wagf_region"
:options="options.wagf_region" :value="sel.wagf_region"
@filter-change="onFilterChange" @filter-clear="onFilterClear"
/>
<FilterDropdown
label="Bloc" name="wagf_block"
:label="L('wagf_block', 'Bloc')" name="wagf_block"
:options="options.wagf_block" :value="sel.wagf_block"
@filter-change="onFilterChange" @filter-clear="onFilterClear"
/>
<FilterDropdown
label="People Group" name="rop1"
:label="L('rop1', 'People Group')" name="rop1"
:options="options.rop1" :value="sel.rop1"
@filter-change="onFilterChange" @filter-clear="onFilterClear"
/>
<FilterDropdown
label="Religion" name="religion"
:label="L('religion', 'Religion')" name="religion"
:options="options.religion" :value="sel.religion"
@filter-change="onFilterChange" @filter-clear="onFilterClear"
/>
@ -185,7 +198,7 @@ onMounted(loadOptions)
type="button"
aria-label="Reset all filters and search"
@click="reset"
>Reset</button>
>{{ L('reset_all', '') || tStatic('controls.reset_all') || 'Reset' }}</button>
</div>
</div>
</template>

View file

@ -13,7 +13,7 @@
* Same "import the REAL components, no fork" discipline as big-picture: the grid is the exact
* people-groups-grid component; the dashboard is the exact research-dashboard component.
*/
import { reactive, provide, inject, ref, computed, watchEffect } from 'vue'
import { reactive, provide, inject, ref, computed, watchEffect, watch, onMounted, getCurrentInstance } from 'vue'
import { SUPPORTED_LOCALES, setRuntimeLocale } from '@map/i18n/index.js'
import { resolveEmbedBase } from '@map/utils/embedBase.js'
import { useSharedMapToken, publishMapToken } from '@map/composables/useSharedMapToken.js'
@ -282,6 +282,31 @@ const hostLang = computed(() => {
})
watchEffect(() => { if (hostLang.value) setRuntimeLocale(hostLang.value) })
// ★ RTL IS A DIRECTION, NOT A TRANSLATION, and nothing was setting it here.
// createAppI18n reflects an RTL locale onto document.documentElement — right for a leaf page it
// owns, useless for an element dropped into somebody else's page, which is the case this composite
// exists for. A host that asks for Arabic through profile-config got Arabic WORDS in a
// left-to-right layout: readable glyphs in the wrong place, which reads as a styling quirk rather
// than the bug it is.
//
// Set on the custom-element HOST rather than on the layout inside it, deliberately: `dir` takes
// effect through the inherited CSS `direction`, and inheritance crosses shadow boundaries — so one
// attribute on the host covers this composite's own chrome AND every nested element beneath it,
// which is the half the audit found missing. Only ever SET, never cleared: a host page that already
// declares its own dir owns that decision.
const textDir = computed(() => {
const l = hostLang.value || getRuntimeLocale() || detectLocale()
return RTL_LOCALES.has(l) ? 'rtl' : 'ltr'
})
function reflectDir() {
try {
const host = getCurrentInstance()?.proxy?.$el?.getRootNode?.()?.host
if (host && textDir.value === 'rtl') host.setAttribute('dir', 'rtl')
} catch (_) { /* no host (SSR/tests) — nothing to reflect */ }
}
onMounted(reflectDir)
watch(textDir, reflectDir)
// ★ AND PROVIDE IT THE WAY ProfileLoader WOULD. This composite bakes its children in rather than
// mounting them through ProfileLoader, and ProfileLoader is the ONLY provider of 'mapboxToken' in
// the repo — so DashboardMapPanel's inject('mapboxToken', ref('')) fell through to its empty

View file

@ -127,6 +127,31 @@ const hostLang = computed(() => {
})
watchEffect(() => { if (hostLang.value) setRuntimeLocale(hostLang.value) })
// ★ RTL IS A DIRECTION, NOT A TRANSLATION, and nothing was setting it here.
// createAppI18n reflects an RTL locale onto document.documentElement — right for a leaf page it
// owns, useless for an element dropped into somebody else's page, which is the case this composite
// exists for. A host that asks for Arabic through profile-config got Arabic WORDS in a
// left-to-right layout: readable glyphs in the wrong place, which reads as a styling quirk rather
// than the bug it is.
//
// Set on the custom-element HOST rather than on the layout inside it, deliberately: `dir` takes
// effect through the inherited CSS `direction`, and inheritance crosses shadow boundaries — so one
// attribute on the host covers this composite's own chrome AND every nested element beneath it,
// which is the half the audit found missing. Only ever SET, never cleared: a host page that already
// declares its own dir owns that decision.
const textDir = computed(() => {
const l = hostLang.value || getRuntimeLocale() || detectLocale()
return RTL_LOCALES.has(l) ? 'rtl' : 'ltr'
})
function reflectDir() {
try {
const host = getCurrentInstance()?.proxy?.$el?.getRootNode?.()?.host
if (host && textDir.value === 'rtl') host.setAttribute('dir', 'rtl')
} catch (_) { /* no host (SSR/tests) — nothing to reflect */ }
}
onMounted(reflectDir)
watch(textDir, reflectDir)
// The absolute url this composite is shared and iframed as. Built here rather than written as a
// literal because resolveEmbedBase() walks profileConfig.embedBaseUrl → window.MAP_EMBED_BASE_URL →
// the root this bundle derives from its OWN script url, so the link is right on doxa.life, on

File diff suppressed because one or more lines are too long

View file

@ -37,7 +37,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-CaUw4BXi2ILBm6z80vT65HC5TSuDBz4pDGLJkTudRnUTQ0+erjMyPI59vIIwqkgo" crossorigin="anonymous"></script>
<script src="../../big-picture.js" integrity="sha384-0xFVMAmShJjqR4UFtdLG7gDmcmHCZHl/BaWTmZ93g5ff49tVn1YG8gvZ3rwpIR4h" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -37,7 +37,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-CaUw4BXi2ILBm6z80vT65HC5TSuDBz4pDGLJkTudRnUTQ0+erjMyPI59vIIwqkgo" crossorigin="anonymous"></script>
<script src="../../big-picture.js" integrity="sha384-0xFVMAmShJjqR4UFtdLG7gDmcmHCZHl/BaWTmZ93g5ff49tVn1YG8gvZ3rwpIR4h" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -37,7 +37,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-CaUw4BXi2ILBm6z80vT65HC5TSuDBz4pDGLJkTudRnUTQ0+erjMyPI59vIIwqkgo" crossorigin="anonymous"></script>
<script src="../big-picture.js" integrity="sha384-0xFVMAmShJjqR4UFtdLG7gDmcmHCZHl/BaWTmZ93g5ff49tVn1YG8gvZ3rwpIR4h" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -40,7 +40,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-/E4UhCPqZAn+gwwHuwkLrLgbfrTwGp8x6tgsdDo/pqDHttv0z7Ln7r7wfPYSHSAU" crossorigin="anonymous"></script>
<script src="../../dashboard-plus-grid.js" integrity="sha384-XS0fK8cqqG2MV2jFBZ+umEfUozbhowTmX84gIyJhE3pXP1303tA+AsQhCDp+wU10" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -40,7 +40,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-/E4UhCPqZAn+gwwHuwkLrLgbfrTwGp8x6tgsdDo/pqDHttv0z7Ln7r7wfPYSHSAU" crossorigin="anonymous"></script>
<script src="../dashboard-plus-grid.js" integrity="sha384-XS0fK8cqqG2MV2jFBZ+umEfUozbhowTmX84gIyJhE3pXP1303tA+AsQhCDp+wU10" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -39,7 +39,7 @@
"bundle": "big-picture",
"scriptUrl": "./big-picture/big-picture.js",
"output": "dx-maps/big-picture/big-picture.js",
"integrity": "sha384-CaUw4BXi2ILBm6z80vT65HC5TSuDBz4pDGLJkTudRnUTQ0+erjMyPI59vIIwqkgo",
"integrity": "sha384-0xFVMAmShJjqR4UFtdLG7gDmcmHCZHl/BaWTmZ93g5ff49tVn1YG8gvZ3rwpIR4h",
"elements": [
"bp-big-picture",
"bp-research-header",
@ -61,7 +61,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-CaUw4BXi2ILBm6z80vT65HC5TSuDBz4pDGLJkTudRnUTQ0+erjMyPI59vIIwqkgo\" 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-0xFVMAmShJjqR4UFtdLG7gDmcmHCZHl/BaWTmZ93g5ff49tVn1YG8gvZ3rwpIR4h\" 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": [
{
@ -215,7 +215,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-/E4UhCPqZAn+gwwHuwkLrLgbfrTwGp8x6tgsdDo/pqDHttv0z7Ln7r7wfPYSHSAU",
"integrity": "sha384-XS0fK8cqqG2MV2jFBZ+umEfUozbhowTmX84gIyJhE3pXP1303tA+AsQhCDp+wU10",
"elements": [
"dashboard-plus-grid"
],
@ -235,7 +235,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; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-/E4UhCPqZAn+gwwHuwkLrLgbfrTwGp8x6tgsdDo/pqDHttv0z7Ln7r7wfPYSHSAU\" 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; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-XS0fK8cqqG2MV2jFBZ+umEfUozbhowTmX84gIyJhE3pXP1303tA+AsQhCDp+wU10\" 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": [
{
@ -971,7 +971,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-62O+v5n8jNn2QTXnNEG6Y5/5lXaSyRL1SQsJWtdfbadVpNG+7EiKrDTRRu915RYF",
"integrity": "sha384-2CUBq9yq/4Jk+lNNnpyyhulhen1xrrQd67T+45oqVHsVO6R36aplTZKWgKT1OHL9",
"elements": [
"research-map-plus-grid"
],
@ -991,7 +991,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-62O+v5n8jNn2QTXnNEG6Y5/5lXaSyRL1SQsJWtdfbadVpNG+7EiKrDTRRu915RYF\" 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-2CUBq9yq/4Jk+lNNnpyyhulhen1xrrQd67T+45oqVHsVO6R36aplTZKWgKT1OHL9\" 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": [
{

View file

@ -39,7 +39,7 @@
"bundle": "big-picture",
"scriptUrl": "./big-picture/big-picture.js",
"output": "dx-maps/big-picture/big-picture.js",
"integrity": "sha384-CaUw4BXi2ILBm6z80vT65HC5TSuDBz4pDGLJkTudRnUTQ0+erjMyPI59vIIwqkgo",
"integrity": "sha384-0xFVMAmShJjqR4UFtdLG7gDmcmHCZHl/BaWTmZ93g5ff49tVn1YG8gvZ3rwpIR4h",
"elements": [
"bp-big-picture",
"bp-research-header",
@ -61,7 +61,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-CaUw4BXi2ILBm6z80vT65HC5TSuDBz4pDGLJkTudRnUTQ0+erjMyPI59vIIwqkgo\" 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-0xFVMAmShJjqR4UFtdLG7gDmcmHCZHl/BaWTmZ93g5ff49tVn1YG8gvZ3rwpIR4h\" 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": [
{
@ -215,7 +215,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-/E4UhCPqZAn+gwwHuwkLrLgbfrTwGp8x6tgsdDo/pqDHttv0z7Ln7r7wfPYSHSAU",
"integrity": "sha384-XS0fK8cqqG2MV2jFBZ+umEfUozbhowTmX84gIyJhE3pXP1303tA+AsQhCDp+wU10",
"elements": [
"dashboard-plus-grid"
],
@ -235,7 +235,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; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-/E4UhCPqZAn+gwwHuwkLrLgbfrTwGp8x6tgsdDo/pqDHttv0z7Ln7r7wfPYSHSAU\" 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; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-XS0fK8cqqG2MV2jFBZ+umEfUozbhowTmX84gIyJhE3pXP1303tA+AsQhCDp+wU10\" 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": [
{
@ -971,7 +971,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-62O+v5n8jNn2QTXnNEG6Y5/5lXaSyRL1SQsJWtdfbadVpNG+7EiKrDTRRu915RYF",
"integrity": "sha384-2CUBq9yq/4Jk+lNNnpyyhulhen1xrrQd67T+45oqVHsVO6R36aplTZKWgKT1OHL9",
"elements": [
"research-map-plus-grid"
],
@ -991,7 +991,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-62O+v5n8jNn2QTXnNEG6Y5/5lXaSyRL1SQsJWtdfbadVpNG+7EiKrDTRRu915RYF\" 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-2CUBq9yq/4Jk+lNNnpyyhulhen1xrrQd67T+45oqVHsVO6R36aplTZKWgKT1OHL9\" 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": [
{

File diff suppressed because one or more lines are too long

View file

@ -37,7 +37,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <research-map-plus-grid> custom element. -->
<script src="../../research-map-plus-grid.js" integrity="sha384-62O+v5n8jNn2QTXnNEG6Y5/5lXaSyRL1SQsJWtdfbadVpNG+7EiKrDTRRu915RYF" crossorigin="anonymous"></script>
<script src="../../research-map-plus-grid.js" integrity="sha384-2CUBq9yq/4Jk+lNNnpyyhulhen1xrrQd67T+45oqVHsVO6R36aplTZKWgKT1OHL9" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -37,7 +37,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <research-map-plus-grid> custom element. -->
<script src="../research-map-plus-grid.js" integrity="sha384-62O+v5n8jNn2QTXnNEG6Y5/5lXaSyRL1SQsJWtdfbadVpNG+7EiKrDTRRu915RYF" crossorigin="anonymous"></script>
<script src="../research-map-plus-grid.js" integrity="sha384-2CUBq9yq/4Jk+lNNnpyyhulhen1xrrQd67T+45oqVHsVO6R36aplTZKWgKT1OHL9" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: