A9 lever 1: engine-aware resource hints on map leaves
A cold map ran serially: leaf HTML, then the bundle (250-470 KiB gz, parsed), then only the engine (from cdn.jsdelivr.net or api.mapbox.com), then the style host, tiles, and data. Four origins discovered one after another, none pre-connected. That waterfall is the shape behind A9's 3-5 s cold map. generate-tree now emits, in each MAP leaf's <head>, a preconnect for the engine origin, the style host and the data origin, and -- only on the 'auto' leaf, which carries no engine <script> today -- a preload of the engine, so DNS/TLS and the engine download start alongside the bundle instead of after it. A non-map leaf (grid/card/chart-table/app-shell/composite) gets nothing. The engine is decided at build time from the SAME inputs the runtime ladder reads (profile-config.provider, then a baked token or a token endpoint; 'auto' with no token path is MapLibre keyless), so the hint and the ladder cannot disagree. Every URL, integrity and crossorigin comes from library/constants/cdn.js, so a preload cannot drift from ensureEngineScript's tag. The one case a static hint cannot foresee -- an explicit ?provider= or window.MAP_PROVIDER overriding the build default at runtime -- costs one unused preconnect. New gate check:leaf-hints (gates:post): a map leaf without hints fails, a non-map leaf carrying a map-engine hint fails, and a hint origin must be one the code uses. PASS: 36 map leaves carry hints, 28 non-map leaves carry none. Poison-tested both sides. Unlanded (dx-base/a9-leaf-hints); the bundled-vs-shared-vs-today trade-off report and any landing wait on rega's timing and regions' tiles.
This commit is contained in:
parent
dbee30e827
commit
fcebf2c589
39 changed files with 320 additions and 2 deletions
89
internal/check-leaf-hints.mjs
Normal file
89
internal/check-leaf-hints.mjs
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
#!/usr/bin/env node
|
||||
// check-leaf-hints — a map leaf gives the browser its origins early; a non-map leaf carries no map hint.
|
||||
//
|
||||
// ★ WHY. A first visit to a map leaf ran serially: leaf HTML → the bundle (250–470 KiB gz, parsed) →
|
||||
// only THEN the engine (from cdn.jsdelivr.net or api.mapbox.com) → the style host → tiles → data. Four
|
||||
// origins, discovered one after another, none pre-connected — the shape behind A9's 3–5 s cold map
|
||||
// (_qa-cycle/03-deployment-cycle/A9-MAP-LOAD-STATIC.md). generate-tree now emits, per MAP leaf, a
|
||||
// preconnect for the engine + style + data origins and (on the 'auto' leaf, which carries no engine
|
||||
// <script>) a preload of the engine, so DNS/TLS and the engine start alongside the bundle.
|
||||
//
|
||||
// This is the two-sided guard, matching check:leaf-engine-per-provider's stance (a non-map leaf loads no
|
||||
// map peer). It reads the BUILT tree's leaf pages:
|
||||
// 1. every MAP leaf (one that draws tiles — its page carries an engine peer or the "auto" no-tags note)
|
||||
// must carry the A9 preconnect hints;
|
||||
// 2. no NON-MAP leaf (grid / card / chart-table / app-shell / composite: "NO map peer") may carry any
|
||||
// map-engine hint (preconnect to an engine/style origin, or an engine preload) — dead weight that
|
||||
// also implies a gate.
|
||||
// A hint's origin must be one the code actually uses (library/constants/cdn.js + the MapLibre style host),
|
||||
// so a stale origin cannot pass. Node only: reads files, starts nothing. Exit 0 pass/skip, 1 fail.
|
||||
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs'
|
||||
import { dirname, join, resolve } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { TREE_NAME } from './_tree-name.mjs'
|
||||
import { CDN } from '../library/constants/cdn.js'
|
||||
|
||||
const REPO = resolve(dirname(fileURLToPath(import.meta.url)), '..')
|
||||
const TREE = join(REPO, 'public', TREE_NAME)
|
||||
if (!existsSync(TREE)) {
|
||||
console.log(`LEAF-HINTS: SKIP — no tree at ${TREE} (run bun run tree first)`)
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
const ORIGIN = (u) => { try { return new URL(u).origin } catch { return '' } }
|
||||
// The origins a hint may name, from the same registry the runtime reads + the MapLibre style host.
|
||||
const ENGINE_ORIGINS = [ORIGIN(CDN.mapboxGlJs.url), ORIGIN(CDN.maplibreGlJs.url)]
|
||||
const STYLE_ORIGINS = ['https://tiles.openfreemap.org', ORIGIN(CDN.mapboxGlJs.url)]
|
||||
const MAP_ORIGINS = new Set([...ENGINE_ORIGINS, ...STYLE_ORIGINS].filter(Boolean))
|
||||
|
||||
// Markers generate-tree writes into a leaf's <head> (mapPageHtml peerBlock):
|
||||
const NON_MAP = 'NON-MAP leaf' // grid/card/chart-table/app-shell/composite → no peer
|
||||
const MAPLIBRE_PEER = 'MapLibre peer' // provider:'maplibre' static engine
|
||||
const AUTO_NOTE = 'NO STATIC ENGINE TAGS' // the 'auto' leaf: engine chosen at runtime
|
||||
const HINTS = 'A9 hints'
|
||||
|
||||
// Every leaf index.html under the tree (a profile or instance page).
|
||||
function leaves(dir, out = []) {
|
||||
for (const e of readdirSync(dir)) {
|
||||
const p = join(dir, e)
|
||||
if (statSync(p).isDirectory()) leaves(p, out)
|
||||
else if (e === 'index.html') out.push(p)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
const fails = []
|
||||
let maps = 0
|
||||
let nonMaps = 0
|
||||
for (const file of leaves(TREE)) {
|
||||
const html = readFileSync(file, 'utf8')
|
||||
const rel = file.slice(TREE.length + 1)
|
||||
const isMapLeaf = html.includes(MAPLIBRE_PEER) || html.includes(AUTO_NOTE)
|
||||
const isNonMap = html.includes(NON_MAP)
|
||||
// Engine/style-origin preconnects and engine preloads present in this page.
|
||||
const preconnects = [...html.matchAll(/<link rel="preconnect" href="([^"]+)"/g)].map((m) => m[1])
|
||||
const enginePreload = /<link rel="preload" as="script" href="([^"]+maplibre-gl[^"]*|[^"]+mapbox-gl[^"]*)"/.test(html)
|
||||
const mapHint = preconnects.some((o) => MAP_ORIGINS.has(o)) || enginePreload
|
||||
|
||||
if (isMapLeaf) {
|
||||
maps += 1
|
||||
if (!html.includes(HINTS)) fails.push(`${rel}: MAP leaf with no A9 hints (expected preconnect + preload)`)
|
||||
// Every preconnect on a map leaf must name an origin the code uses (no stale host).
|
||||
for (const o of preconnects) {
|
||||
if (!MAP_ORIGINS.has(o) && !/^https:\/\/[a-z0-9.-]+$/i.test(o)) fails.push(`${rel}: malformed preconnect origin ${o}`)
|
||||
}
|
||||
} else if (isNonMap) {
|
||||
nonMaps += 1
|
||||
if (mapHint) fails.push(`${rel}: NON-MAP leaf carries a map-engine hint (a non-map leaf loads no peer)`)
|
||||
}
|
||||
}
|
||||
|
||||
if (maps === 0) fails.push('no map leaves found in the tree: the classifier or the tree is wrong')
|
||||
|
||||
if (fails.length) {
|
||||
console.error(`LEAF-HINTS: FAIL — ${fails.length} problem(s)`)
|
||||
for (const f of fails.slice(0, 30)) console.error(` ✗ ${f}`)
|
||||
if (fails.length > 30) console.error(` … and ${fails.length - 30} more`)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`LEAF-HINTS: PASS — ${maps} map leaf/leaves carry engine-aware hints; ${nonMaps} non-map leaf/leaves carry none`)
|
||||
|
|
@ -838,6 +838,49 @@ function bundleHtml(b, index, manifest) {
|
|||
* opts.tokenUrlExpr sources.json mapboxTokenUrl value (data-safe URL or global name)
|
||||
* opts.bakedToken opt-in literal token baked from build-config (ladder rung 3)
|
||||
*/
|
||||
// The origins a map leaf touches, from the ONE registry the runtime reads (library/constants/cdn.js)
|
||||
// plus useMapInstance's MapLibre style host. Origins only (preconnect wants an origin, not a file).
|
||||
const ORIGIN = (u) => { try { return new URL(u).origin } catch { return '' } }
|
||||
const ENGINE_ORIGIN = { mapbox: ORIGIN(CDN.mapboxGlJs.url), maplibre: ORIGIN(CDN.maplibreGlJs.url) }
|
||||
const MAPLIBRE_STYLE_ORIGIN = 'https://tiles.openfreemap.org' // useMapInstance.js OPENFREEMAP_STYLE/_DARK
|
||||
|
||||
/**
|
||||
* Which engine a map leaf will use, decided at BUILD time from the same inputs the runtime ladder reads
|
||||
* (see mapPageHtml's token block): profile-config.provider, then whether a token is derivable now — a
|
||||
* baked token, or a token endpoint (tokenUrl / window.MAP_TOKEN_URL). 'auto' with no token path is
|
||||
* MapLibre, keyless. The runtime can still be overridden by ?tk=/?provider=/window.MAP_PROVIDER/a stored
|
||||
* token; the hint follows the build default and the report names that miss case (one unused preconnect).
|
||||
*/
|
||||
function engineFor({ isMapLibre, config, tokenUrlExpr, bakedToken }) {
|
||||
const asked = String((config && config.provider) || '').toLowerCase().trim()
|
||||
if (isMapLibre || asked === 'maplibre') return 'maplibre'
|
||||
if (asked === 'mapbox') return 'mapbox'
|
||||
const hasEndpoint = !!(tokenUrlExpr && tokenUrlExpr !== 'window.MAP_TOKEN_URL')
|
||||
return (bakedToken || hasEndpoint) ? 'mapbox' : 'maplibre'
|
||||
}
|
||||
|
||||
/**
|
||||
* Engine-aware resource hints for a map leaf's <head>. preconnect the token-implied engine origin, the
|
||||
* style host and the data origin; and, ONLY for the 'auto' leaf (which emits no engine <script> today),
|
||||
* preload the engine from cdn.js so it downloads alongside the bundle instead of after it. The 'maplibre'
|
||||
* and 'mapbox' branches already carry a static engine tag (mapPageHtml's peerBlock / the embed snippet),
|
||||
* so a preload there would double-fetch — those get preconnects only. Returns '' for a non-map leaf.
|
||||
*/
|
||||
function resourceHints({ isMapLibre, config, apiBaseUrl, tokenUrlExpr, bakedToken }) {
|
||||
const engine = engineFor({ isMapLibre, config, tokenUrlExpr, bakedToken })
|
||||
const styleOrigin = engine === 'maplibre' ? MAPLIBRE_STYLE_ORIGIN : ENGINE_ORIGIN.mapbox
|
||||
const dataOrigin = ORIGIN(apiBaseUrl) // '' when same-origin (no build apiBaseUrl): nothing to preconnect
|
||||
const origins = [...new Set([ENGINE_ORIGIN[engine], styleOrigin, dataOrigin].filter(Boolean))]
|
||||
const lines = origins.map((o) => ` <link rel="preconnect" href="${o}" crossorigin />`)
|
||||
// 'auto' leaf only: it emits no engine <script>, so preload the engine (URL+integrity+crossorigin from cdn.js).
|
||||
const staticEngine = isMapLibre || (config && (config.provider === 'mapbox'))
|
||||
if (!staticEngine) {
|
||||
const gl = engine === 'maplibre' ? CDN.maplibreGlJs : CDN.mapboxGlJs
|
||||
lines.push(` <link rel="preload" as="script" href="${gl.url}" integrity="${gl.integrity}" crossorigin="anonymous" />`)
|
||||
}
|
||||
return lines.length ? ` <!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->\n${lines.join('\n')}\n` : ''
|
||||
}
|
||||
|
||||
function mapPageHtml(opts) {
|
||||
const { title, tag, config, jsSrc, apiBaseUrl, tokenUrlExpr, bakedToken, integrity, shellTokenFree, isMap, scrollPage, isComposite } = opts
|
||||
const apiScript = apiBaseUrl
|
||||
|
|
@ -876,6 +919,12 @@ function mapPageHtml(opts) {
|
|||
// EVERY non-map leaf (cap-4 composites + cap-1/2/3 non-map leaves), not just cap-5 shells.
|
||||
const shellOnly = !!shellTokenFree || notAMap
|
||||
const tokenFree = isMapLibre || shellOnly
|
||||
// A9 leaf hints (dx-base/a9-leaf-hints): give the browser the map's origins BEFORE the bundle
|
||||
// parses. Engine-aware, derived from the SAME inputs the runtime ladder reads (below), never
|
||||
// hardcoded: preconnect the token-implied engine + the style host + the data origin, and — only
|
||||
// where the leaf emits no engine <script> today (the 'auto' leaf) — preload the engine, its URL,
|
||||
// integrity and crossorigin from library/constants/cdn.js so it cannot drift from the runtime tag.
|
||||
const hintBlock = shellOnly ? '' : resourceHints({ isMapLibre, config, apiBaseUrl, tokenUrlExpr, bakedToken })
|
||||
const peerBlock = shellOnly
|
||||
? `<!-- NON-MAP leaf (app-shell / composite / grid / card / chart-table): NO map peer.
|
||||
This element draws no map tiles, so it needs no Mapbox/MapLibre engine and MUST NOT
|
||||
|
|
@ -908,7 +957,7 @@ function mapPageHtml(opts) {
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>${esc(title)}</title>
|
||||
<link rel="icon" href="data:,">
|
||||
${peerBlock}
|
||||
${hintBlock} ${peerBlock}
|
||||
<style>
|
||||
${scrollPage
|
||||
? `/* SCROLL-PAGE leaf (cap-4 nested-elements-mfe composite: a StackLayout scroll-stack). The DOCUMENT
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@
|
|||
"check:language-tree-layout": "node internal/check-language-tree-layout.mjs",
|
||||
"check:layout-key-namespaced": "node plugin-designs/research-dashboard/scripts/check-layout-key-namespaced.mjs",
|
||||
"check:leaf-engine-per-provider": "node internal/check-leaf-engine-per-provider.mjs",
|
||||
"check:leaf-hints": "node internal/check-leaf-hints.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",
|
||||
"check:leaves-mount": "node internal/check-gospel-leaves-mount.mjs",
|
||||
|
|
@ -332,7 +333,7 @@
|
|||
"dev": "bun x vite",
|
||||
"fix:sri": "node internal/fix-sri.mjs",
|
||||
"gallery": "node internal/generate-gallery.mjs",
|
||||
"gates:post": "node internal/run-parallel.mjs --label=post -- check:capability-derived check:drop check:parse verify check:sri check:public-hygiene check:label-joins check:facet-cascade check:facet-one-field check:heartbeat check:kpi-unit check:composite-reg check:descriptions check:no-abs-paths check:no-codename check:dep-names check:composite-srcs check:embed-targets check:nested-token check:i18n-parity check:tabs-localized check:packets-all check:packet-strings-parity check:zone-census check:zoning-declared check:share-policy check:library-index check:csv-shape check:capability-citations check:catalog-identity check:no-orphan-gates check:quoted-scripts check:done-evidence check:script-flags check:backlog-status check:capability-exemplars check:packet-fixture check:packet-browser check:provider-switch check:locale-reachable check:url-resolver check:manifest-covers check:one-palette check:pin-dim-slider check:legend-source check:backlog-refs check:clustering-modes check:composite-embed-knobs check:composite-locale-leaks check:linked-vocabulary check:wp-embed check:dashboard-geocoder-provider check:leaf-engine-per-provider check:auto-engine check:engine-contract check:map-props-unit check:composites-mount check:composite-interop check:no-free-identifiers check:map-fly-reduced-motion check:mst-clustering check:list-prop-unit check:profiles-mount check:cdn-pins check:no-eval check:popup-escaping check:i18n-treeshake check:pinned-umd check:one-palette:self-test check:no-cross-plugin-imports check:no-cross-plugin-imports:self-test check:map-attribution check:studio-rail check:approx-pin-note check:embedder-keys check:provider-for check:legend-logical-insets check:legend-logical-insets:self-test check:optional-t-equivalence check:text-highlight check:religion-label-not-value check:i18n-stopped-scope check:no-silent-engine check:no-silent-engine:self-test check:regions-uses-library check:shadow-css-parses check:square-map-controls check:preset-config-merge check:instance-config-keys check:frozen-labels check:plural-forms check:region-fill-repaint check:region-paint-single-source check:poster-print-fallback check:posters-exportable check:country-names check:reduced-motion check:no-dead-library check:universal-props check:readme-size check:tree-relative check:snippet-engine check:snippet-engine:self-test check:embed-base check:link-coverage check:no-public-binds check:shared-reached check:tree-weight",
|
||||
"gates:post": "node internal/run-parallel.mjs --label=post -- check:capability-derived check:drop check:parse verify check:sri check:public-hygiene check:label-joins check:facet-cascade check:facet-one-field check:heartbeat check:kpi-unit check:composite-reg check:descriptions check:no-abs-paths check:no-codename check:dep-names check:composite-srcs check:embed-targets check:nested-token check:i18n-parity check:tabs-localized check:packets-all check:packet-strings-parity check:zone-census check:zoning-declared check:share-policy check:library-index check:csv-shape check:capability-citations check:catalog-identity check:no-orphan-gates check:quoted-scripts check:done-evidence check:script-flags check:backlog-status check:capability-exemplars check:packet-fixture check:packet-browser check:provider-switch check:locale-reachable check:url-resolver check:manifest-covers check:one-palette check:pin-dim-slider check:legend-source check:backlog-refs check:clustering-modes check:composite-embed-knobs check:composite-locale-leaks check:linked-vocabulary check:wp-embed check:dashboard-geocoder-provider check:leaf-engine-per-provider check:auto-engine check:engine-contract check:map-props-unit check:composites-mount check:composite-interop check:no-free-identifiers check:map-fly-reduced-motion check:mst-clustering check:list-prop-unit check:profiles-mount check:cdn-pins check:no-eval check:popup-escaping check:i18n-treeshake check:pinned-umd check:one-palette:self-test check:no-cross-plugin-imports check:no-cross-plugin-imports:self-test check:map-attribution check:studio-rail check:approx-pin-note check:embedder-keys check:provider-for check:legend-logical-insets check:legend-logical-insets:self-test check:optional-t-equivalence check:text-highlight check:religion-label-not-value check:i18n-stopped-scope check:no-silent-engine check:no-silent-engine:self-test check:regions-uses-library check:shadow-css-parses check:square-map-controls check:preset-config-merge check:instance-config-keys check:frozen-labels check:plural-forms check:region-fill-repaint check:region-paint-single-source check:poster-print-fallback check:posters-exportable check:country-names check:reduced-motion check:no-dead-library check:universal-props check:readme-size check:tree-relative check:leaf-hints check:snippet-engine check:snippet-engine:self-test check:embed-base check:link-coverage check:no-public-binds check:shared-reached check:tree-weight",
|
||||
"gates:pre": "node internal/run-parallel.mjs --label=pre -- check:template-literal check:mjs-parse check:sfc-parse check:tab-radius check:synced-css check:doc-scripts check:setup-order check:package-json-unique-keys check:no-repo-pb-hooks check:no-credentials-omit check:no-credentials-omit:self-test check:shadow-reduced-motion check:poster-action-print check:targets check:targets:self-test check:browser-gates-guarded check:pin-selection check:facet-shape check:hardcoded-english:self-test check:list-selection check:selector-fields check:upg-zone-joins check:gospel-set-charts check:gospel-set-fit check:describe-group check:one-scroll-container check:packet-charts check:composite-token-url check:language-tree-layout check:i18n-keys-exist check:i18n-never-translated check:packet-variants check:profile-table check:element-bootstrap check:embed-url-absolute check:frame-target check:language-tree-model check:map-menu-anchor check:selection-kinds check:tiered-points check:whiteboard-projection check:mercator-slice check:ring-vocabulary check:map-props-unit check:mobile-gating check:provide-shadowing check:legend-top-offset check:cdn-cache check:plural-forms check:select-zone-race check:script-registry check:map-control-overlap check:poster-attribution check:board-map-options check:gospel-whiteboard check:packet-map-missing-loud check:poster-layout-optin check:ported-globals-identical check:ring-bands check:packet-a1-structure check:zone-title-tier-a check:evangelical-share check:map-labels check:packet-offline check:help-reachable check:gated-not-in-tree check:window-globals-released check:legend-data-contract check:no-new-driver-references check:poster-fetch-guard check:people-group-records check:sentence-slots check:popup-href-escaped check:popup-pan-controls check:viewport-meta check:viewport-meta:self-test check:label-key-coverage check:poster-browser-equiv check:poster-render-pinned check:host-locale-fetch check:print-frame-reclaim check:click-sheet check:coverage-consistent:chained check:coverage-consistent:poison check:dashboard-filter-a11y check:filter-multivalue check:hover-channel check:kit-options-reachable check:layout-key-namespaced check:legend-mirrors check:map-unmount-race check:no-conflict-markers check:series-isolation check:snapshot-guard check:stale-sweep-claim check:surfaces-read-the-tier check:translator-contacts check:dxlife check:wall-wysiwyg check:wall-print-watch check:wall-no-bg-photos check:template-i18n",
|
||||
"gen:iso3-to-alpha2": "node library/scripts/generate-iso3-to-alpha2.mjs",
|
||||
"internet:adm1": "node plugin-designs/cities-internet/scripts/build-adm1-internet.mjs",
|
||||
|
|
@ -480,6 +481,7 @@
|
|||
"check:language-tree-layout": "the library language-tree layout builder (library/scripts): families packed without overlap, every roster language reachable. Headless; in gates:pre.",
|
||||
"check:layout-key-namespaced": "two dashboards on one page must not share a saved layout. useDashboardLayout persists the four divider positions to localStorage, and until kit landing 2 the key was a single constant — invisible while there was exactly one dashboard, and SHARING THE ENGINE IS WHAT MAKES A SECOND ONE POSSIBLE, so SPEC-DASHBOARD-KIT section 8 named it as that landing's risk. The failure is quiet rather than loud: drag a divider in one dashboard, reload, and the other has moved. Asserts the shell passes no bare literal, EVALUATES the real expression with two different dashboard ids to prove the key varies (never a retyped copy of the rule), and that the pre-namespacing key is READ and never written — namespacing must not silently discard a reader's layout, and a migration that also deletes cannot be rolled back. Static; no DOM, no browser.",
|
||||
"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:leaf-hints": "a map leaf gives the browser its origins early; a non-map leaf carries no map hint. generate-tree emits, per map leaf, a preconnect for the engine + style + data origins and (on the auto leaf) an engine preload from library/constants/cdn.js, so DNS/TLS and the engine start with the bundle instead of after it (A9). Two-sided: a map leaf without hints fails, a non-map leaf with an engine hint fails; a hint origin must be one the code uses. Reads the built tree; no server.",
|
||||
"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-data-contract": "nobody may read a key off useLegendData that it does not return. It returns items, never rows; two plugins read legend.rows anyway and JavaScript answered undefined, so the same mistake surfaced as a THROWN Export poster in countries-map (exp NE-17) and as a silently BLANK poster legend in research-map. The returned key set is read from the composable rather than restated. NOT in gates:pre yet: it still reports countries-map, which is another owner's file (exp's d6916e05e covers .rows but not the dead .build/.refresh calls). Run it directly.",
|
||||
"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.",
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>all-people-groups · all-people-groups</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>connectivity-map · cities-internet</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>country-map · country-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>countries-map · country-posters</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>country-posters-mfe · country-posters</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>default · dashboard-plus-grid</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>dashboard-plus-grid · dashboard-plus-grid</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>demo-map · demo-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,10 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Demo map — MapLibre (token-free) · demo-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<!-- MapLibre peer (token-free engine) loaded ONCE here; the custom element
|
||||
uses window.maplibregl directly (same versions as @map/composables/useMapInstance). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>research-map · doxa-research-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,10 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Research map — MapLibre (token-free, no search bar) · doxa-research-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<!-- MapLibre peer (token-free engine) loaded ONCE here; the custom element
|
||||
uses window.maplibregl directly (same versions as @map/composables/useMapInstance). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Adoption Map · doxa-simple-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Engagement Map · doxa-simple-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>doxa-simple-map · doxa-simple-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Prayer Map · doxa-simple-map</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Gospel x Internet — the board · gospel-internet</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>board · gospel-internet</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>India and China by state and province · gospel-internet</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Language tree — which languages have the gospel, family by family · gospel-internet</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Platforms — which apps would carry a resource there · gospel-internet</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Project 700 — the list as a partner embed · gospel-internet</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Nothing in their own language — the front door · gospel-internet</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>gospel-dashboard · gospel-resources</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>resources-map · gospel-resources</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>upg-100-list · my-upg-100-list</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>upg-100-mfe · my-upg-100-list</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>pplr-data-maps · pplr-data-maps</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>prayer-walk-planner · prayer-walk-planner</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>region-dashboards · regions-dashboard</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>research-dashboard · research-dashboard</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Mobilize near neighbors · upg-neighbor</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Mobilize near neighbors · upg-neighbor</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>upg-neighbor · upg-neighbor</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Bridge-language campaigns · upg-neighbor</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>Mobilize near neighbors · upg-neighbor</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@
|
|||
<script>window.MAP_OWNS_PAGE = true;</script>
|
||||
<title>UPG Neighbors: mobilize · upg-neighbor</title>
|
||||
<link rel="icon" href="data:,">
|
||||
<!-- A9 hints: the map's origins, so DNS/TLS + the engine start with the bundle, not after it (dx-base/a9-leaf-hints; engine derived from the token ladder). -->
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
||||
<link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
|
||||
<link rel="preconnect" href="https://pray.doxa.life" crossorigin />
|
||||
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js" integrity="sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp" crossorigin="anonymous" />
|
||||
<!-- NO STATIC ENGINE TAGS (2026-09-25). This leaf used to hard-link mapbox-gl.css, the
|
||||
geocoder css, mapbox-gl.js and the geocoder js from Mapbox's CDN, chosen at BUILD time —
|
||||
so a partner embedding it with ?provider=maplibre still sent every visitor's IP to Mapbox
|
||||
|
|
|
|||
Loading…
Reference in a new issue