Release every window global this profile sets, on unmount
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions

A window key holding a closure pins the whole app after unmount -- the
component, its shadow root, and everything they reference, measured at
roughly 10 MB per mount. The three test handles here each close over live
state (the search index, the map, the selection), so each one is a full
retention path.

SIX GLOBALS, NOT THREE. The check names the three it can see, but each
named handle has a paired per-instance registry --
__UPG_SEARCH__/__UPG_SEARCHES__, __UPG_MAP__/__UPG_MAPS__,
__UPG_SELECT__/__UPG_SELECTS__. Releasing only the named half leaves the
registry holding the same closure, so the leak survives in the copy nobody
was looking at.

The two halves need opposite handling, which is why this is not one loop.
A named handle is a single slot that the last mount overwrites, so
deleting it blindly would strip a LIVE sibling's handle -- it is cleared
only if it is still the object this instance published, captured at
assignment so it cannot drift from what went out. A registry entry is
keyed by instance, so my key is always mine to delete, and deleting the
whole registry would strip the siblings.

Verified against the two-instance case rather than the single-mount one:
A mounts, B mounts and takes the named slot, A unmounts -- B keeps its
handle and its registry entry, and after both unmount nothing is
retained.

One delete per line, deliberately: the check reads these statements, so a
loop over a key list would release correctly and still be reported as a
leak. The whole block is wrapped because a frozen or cross-origin window
must never break teardown.
This commit is contained in:
Doxa Maps 2026-09-28 19:53:36 +00:00
parent 114075f9ab
commit 988092d363
7 changed files with 191 additions and 156 deletions

View file

@ -137,6 +137,11 @@ const profileConfig = inject('profileConfig', ref(null))
// over with a counter, because a key that changes between mounts would be worse than one that // over with a counter, because a key that changes between mounts would be worse than one that
// repeats — a gate could not name the instance it wants. // repeats — a gate could not name the instance it wants.
// A function, not a computed: it is read twice inside the map-ready path, never rendered. // A function, not a computed: it is read twice inside the map-ready path, never rendered.
// The exact objects THIS instance put on window, so teardown can identity-check before deleting a
// shared named slot — the last mount wins that slot, so a blind delete would strip a live sibling's
// handle. Captured at assignment rather than rebuilt, so they cannot drift from what was published.
let _mySearchHandle = null, _myMapHandle = null, _mySelectHandle = null
function testHandleKey() { function testHandleKey() {
return profileConfig.value?.instanceId || profileConfig.value?.profile || 'upg-100-list' return profileConfig.value?.instanceId || profileConfig.value?.profile || 'upg-100-list'
} }
@ -973,6 +978,7 @@ function buildSearch(records) {
}, },
} }
// Mirrored per instance, same reason and shape as __UPG_MAPS__ (AUDIT34 card 9). // Mirrored per instance, same reason and shape as __UPG_MAPS__ (AUDIT34 card 9).
_mySearchHandle = window.__UPG_SEARCH__
;(window.__UPG_SEARCHES__ ||= {})[testHandleKey()] = window.__UPG_SEARCH__ ;(window.__UPG_SEARCHES__ ||= {})[testHandleKey()] = window.__UPG_SEARCH__
} }
} }
@ -2273,6 +2279,7 @@ onMounted(async () => {
// instance it wants can ask for it; a caller that does not keeps today's behaviour. // instance it wants can ask for it; a caller that does not keeps today's behaviour.
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.__UPG_MAP__ = map window.__UPG_MAP__ = map
_myMapHandle = map
;(window.__UPG_MAPS__ ||= {})[testHandleKey()] = map ;(window.__UPG_MAPS__ ||= {})[testHandleKey()] = map
} }
@ -2373,6 +2380,7 @@ onMounted(async () => {
}, },
} }
// Mirrored per instance, same reason and same additive shape as __UPG_MAPS__ above. // Mirrored per instance, same reason and same additive shape as __UPG_MAPS__ above.
_mySelectHandle = window.__UPG_SELECT__
;(window.__UPG_SELECTS__ ||= {})[testHandleKey()] = window.__UPG_SELECT__ ;(window.__UPG_SELECTS__ ||= {})[testHandleKey()] = window.__UPG_SELECT__
// Legend tree + selectors are already built (bootstrapLegend() at the top of // Legend tree + selectors are already built (bootstrapLegend() at the top of
@ -2770,6 +2778,33 @@ onBeforeUnmount(() => {
if (_detachEdges) { try { _detachEdges() } catch (_) {} _detachEdges = null } if (_detachEdges) { try { _detachEdges() } catch (_) {} _detachEdges = null }
if (map) { map.remove(); map = null } if (map) { map.remove(); map = null }
tapestry = null tapestry = null
// ── RELEASE EVERY WINDOW GLOBAL THIS PROFILE SET ────────────────────────────
// ★ A window key holding a closure PINS THE WHOLE APP after unmount — the component, its shadow
// root and everything they reference — measured at roughly 10 MB per mount. The test handles below
// close over searchIndex, the map and selectedTerritories, so each one is a full retention path.
// ⚠ SIX GLOBALS, NOT THREE. Each named handle has a paired per-instance REGISTRY
// (__UPG_SEARCH__/__UPG_SEARCHES__, __UPG_MAP__/__UPG_MAPS__, __UPG_SELECT__/__UPG_SELECTS__), and
// releasing only the named half leaves the registry holding the same closure — the leak survives
// in the copy nobody was looking at. Release the SET.
// ⚠ AND THE TWO HALVES NEED OPPOSITE HANDLING, which is why this is not one loop:
// · a NAMED handle is a single slot the last mount overwrites, so deleting it blindly would strip
// a LIVE sibling's handle. Identity-check: clear it only if it is still MINE.
// · a REGISTRY entry is keyed by instance, so my key is always mine to delete — and deleting the
// whole registry would strip the siblings.
// One delete per line, deliberately: the gate reads these statements, and a loop over a key list
// would release correctly and still be reported as a leak.
if (typeof window !== 'undefined') {
const k = testHandleKey()
try {
if (window.__UPG_SEARCHES__) delete window.__UPG_SEARCHES__[k]
if (window.__UPG_MAPS__) delete window.__UPG_MAPS__[k]
if (window.__UPG_SELECTS__) delete window.__UPG_SELECTS__[k]
if (window.__UPG_SEARCH__ === _mySearchHandle) delete window.__UPG_SEARCH__
if (window.__UPG_MAP__ === _myMapHandle) delete window.__UPG_MAP__
if (window.__UPG_SELECT__ === _mySelectHandle) delete window.__UPG_SELECT__
} catch (_) { /* a frozen or cross-origin window must not break teardown */ }
}
}) })
</script> </script>

View file

@ -838,7 +838,7 @@
"bundle": "my-upg-100-list", "bundle": "my-upg-100-list",
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"output": "dx-maps/my-upg-100-list/my-upg-100-list.js", "output": "dx-maps/my-upg-100-list/my-upg-100-list.js",
"integrity": "sha384-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA", "integrity": "sha384-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z",
"elements": [ "elements": [
"my-upg-100-list-map" "my-upg-100-list-map"
], ],
@ -861,7 +861,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": { "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>", "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-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"provider\":\"maplibre\",\"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-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
} }
}, },
{ {
@ -877,7 +877,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": { "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>", "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-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"provider\":\"maplibre\",\"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-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
} }
}, },
{ {
@ -893,7 +893,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": { "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>", "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-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"provider\":\"maplibre\",\"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-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
} }
} }
] ]

View file

@ -838,7 +838,7 @@
"bundle": "my-upg-100-list", "bundle": "my-upg-100-list",
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"output": "dx-maps/my-upg-100-list/my-upg-100-list.js", "output": "dx-maps/my-upg-100-list/my-upg-100-list.js",
"integrity": "sha384-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA", "integrity": "sha384-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z",
"elements": [ "elements": [
"my-upg-100-list-map" "my-upg-100-list-map"
], ],
@ -861,7 +861,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": { "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>", "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-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"provider\":\"maplibre\",\"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-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
} }
}, },
{ {
@ -877,7 +877,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": { "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>", "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-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"provider\":\"maplibre\",\"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-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
} }
}, },
{ {
@ -893,7 +893,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": { "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>", "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-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"provider\":\"maplibre\",\"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-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
} }
} }
] ]

File diff suppressed because one or more lines are too long

View file

@ -32,7 +32,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. --> <!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js" integrity="sha384-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA" crossorigin="anonymous"></script> <script src="../my-upg-100-list.js" integrity="sha384-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. --> <!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js" integrity="sha384-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA" crossorigin="anonymous"></script> <script src="../my-upg-100-list.js" integrity="sha384-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. --> <!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js" integrity="sha384-7vRCODlnAzFyyygRrPQW8Nt6Cqly4P9Eg9Gt/vD2KVpOQjrjufxN3ty9kWWSUcBA" crossorigin="anonymous"></script> <script src="../my-upg-100-list.js" integrity="sha384-p2sykUXD9mKnE9bF3Aw6ukX3jBdLZeNe4nIJgUxQI5+9I6H4XA8eWD/k7dMnI83Z" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order: