Wall of People Groups: UPG-style section dividers, the cornerstone line as the call to action, and the priestly blessing as the footer
The Bless poster follows the UPG 100 List posters' structure:
- the header and the prayer-themes chart close on dividers that run the page's width (to a quarter of the
border from the sheet's edge), while the text stays in the content column;
- at the foot: the call to action in a band ruled across the page ("Jesus Christ is the cornerstone, and we
are living stones. ... bless them in his name, and join the global family in prayer.", moved down from the
header), then the journey's table, a page-wide rule, and the footer: the whole priestly blessing,
Numbers 6:24-26 (World English Bible British Edition, public domain, verbatim), in two lines that fill
the width, with its reference and the credit line.
Measured on the print at 3 x 4, 2 x 3 and 5 x 8 ft, en and ar: the blessing fills 99.2% of the text width
(49 pt at 3 x 4, 74 pt at 5 x 8); the call to action is one line, 97.6% of its band in English; no text
overflows (the only overflow is the dividers' intended reach past the column). Both em constants come from
those measurements. Cards: 3 x 4 0.49 in, 2 x 3 0.35 in, 5 x 8 0.92 in (one verse per row).
This commit is contained in:
parent
2bcf371f72
commit
e380ab8cbb
6 changed files with 108 additions and 86 deletions
|
|
@ -55,12 +55,11 @@ export function planPoster(presetId, n) {
|
|||
const P = PRESETS[presetId] || PRESETS[DEFAULT_PRESET]
|
||||
const b = P.border
|
||||
const W = P.sheetW - 2 * b
|
||||
// Top of sheet 1: the title, the DOXA line and the dedication, then the prayer-themes table. Bottom of the last sheet: the
|
||||
// journey from Abraham to the church, a rule, and the benediction (Numbers 6:24). All scale with the width.
|
||||
// Top of sheet 1: the title and the DOXA line, then the prayer-themes table. Bottom of the last sheet: the
|
||||
// call to action (a ruled band), the journey's table, a rule, and the benediction (Numbers 6:24-26). All scale with the width.
|
||||
// gapH: air between the chart and the first row of cards, and between the last row and the footer (the grid
|
||||
// used to butt against the chart's border).
|
||||
// titleH sizes the title and subtitle; the header block adds one line under them for the dedication.
|
||||
const titleH = W * 0.075, headH = titleH + W * 0.012, tableH = W * 0.17, gapH = W * 0.012
|
||||
const titleH = W * 0.075, headH = titleH, tableH = W * 0.17, gapH = W * 0.012
|
||||
const bannerH = headH + tableH + gapH, footerH = footerHeight(W, BENEDICTION_FILL[PRESETS[presetId] ? presetId : DEFAULT_PRESET] ?? 1)
|
||||
// Each sheet's content band, in the sheet's own coordinates: y0..y1. The panels give each sheet's content box:
|
||||
// sheet 1 starts below its outer border, the others below their glue band; only the last has a bottom border
|
||||
|
|
@ -125,11 +124,16 @@ const padOf = (W) => W * 0.008
|
|||
// 2,107 groups: at 1 the footer is 17.3 in deep and the cards 0.87 in, one verse per ROW; at 0.3 the cards
|
||||
// keep a verse UNDER EVERY CARD (1.04 in). Change a size's number here to choose; nothing else needs to move.
|
||||
export const BENEDICTION_FILL = { '3x4ft': 1, '2x3ft': 1, '5x8ft': 1 }
|
||||
// Georgia bold italic, em per character of the longer clause, MEASURED on the rendered print: 0.55 rendered it at
|
||||
// 1.091 of the width (it overflowed the footer), so ≈ 0.60; 0.61 leaves a hair of the padding clear.
|
||||
const BENEDICTION_EM = 0.61
|
||||
// Georgia bold italic, em per character of the longer line, MEASURED on the rendered print of these two lines:
|
||||
// 0.61 filled 0.911 of the width, so ≈ 0.555; 0.56 fills ~0.99 and leaves a hair of the padding clear.
|
||||
const BENEDICTION_EM = 0.56
|
||||
// MEASURED: at 0.47 the English line needed 1.057 of its band (it wrapped), so ≈ 0.50; 0.51 keeps it on one line
|
||||
const CTA_EM = 0.51
|
||||
export const FOOTER_FONTS = (W, fill = 1) => ({
|
||||
ref: W * 0.0075, name: W * 0.0062, station: Math.max(6 / 72, W * 0.0034), credit: Math.max(6 / 72, W * 0.0042),
|
||||
// the call to action fills its band on one line in English (CTA_EM, Georgia italic); a longer
|
||||
// translation wraps to a second line, which footerHeight() budgets for
|
||||
cta: (W - 2 * padOf(W)) / (CLOSING_EN.length * CTA_EM),
|
||||
verse: (fill * (W - 2 * padOf(W))) / (Math.max(...POSTER.benediction.lines.map((l) => l.length)) * BENEDICTION_EM),
|
||||
})
|
||||
function footerHeight(W, fill) {
|
||||
|
|
@ -137,14 +141,16 @@ function footerHeight(W, fill) {
|
|||
const lines = (text, width, fs) => Math.max(1, Math.ceil((String(text).length * 0.5 * fs * 1.12) / width))
|
||||
const colW = (W - 6 * gap) / 7 - W * 0.008
|
||||
const stationH = Math.max(...POSTER.journey.map((v) => lines(v.text, colW, F.station) * F.station * 1.3)) + F.name * 1.6 + F.ref * 1.6 + W * 0.006
|
||||
// the seven stations, the rule, the benediction's two lines, its reference and the credit line
|
||||
// the call to action's band (two lines budgeted), the seven stations, the rule, the benediction's two lines,
|
||||
// its reference and the credit line
|
||||
const ctaH = 2 * F.cta * 1.3 + W * 0.02
|
||||
const verseH = POSTER.benediction.lines.length * F.verse * 1.12 + F.ref * 1.8 + F.credit * 1.6
|
||||
return (stationH + verseH + W * 0.04) * 1.05
|
||||
return (ctaH + stationH + verseH + W * 0.04) * 1.05
|
||||
}
|
||||
|
||||
// The journey's station names (agent-written); translated via texts.labels.journey_<id> when available.
|
||||
// The dedication under the title (agent-written; translated via texts.labels.closing): the poster's one line of its
|
||||
// own words, kept on the poster in the header while the footer is scripture only.
|
||||
// The call to action above the journey (agent-written; translated via texts.labels.closing): the poster's one line
|
||||
// of its own words, in a ruled band as the UPG 100 List posters set theirs, while the footer itself is scripture.
|
||||
const CLOSING_EN = 'Jesus Christ is the cornerstone, and we are living stones. These people groups are the reward of his suffering. Take up our priestly calling: bless them in his name, and join the global family in prayer.'
|
||||
const JOURNEY_EN = { called: 'Called', promised: 'Promised', redeemed: 'Redeemed', cornerstone: 'The cornerstone', children: 'Children of Abraham', priesthood: 'A royal priesthood', sent: 'Sent to the lost' }
|
||||
const THEME_EN = { treasure: 'Treasure', mountain: 'Mountain', sea: 'Sea' }
|
||||
|
|
@ -295,11 +301,11 @@ function posterParts(groups, presetId, texts, withCards = true) {
|
|||
const head = bd.bannerY != null
|
||||
? `<header class="ban" dir="${dir}" style="top:${f(bd.bannerY)};height:${f(plan.bannerH)}">`
|
||||
+ `<div class="hd" style="height:${f(plan.headH)}"><h1>${esc(banner)}</h1>`
|
||||
+ (subtitle ? `<p class="subt">${esc(subtitle)}</p>` : '')
|
||||
+ `<p class="dedic" dir="auto">${esc(lab('closing', CLOSING_EN))}</p></div>`
|
||||
+ `<div style="height:${f(plan.tableH)}">${table}</div></header>` : ''
|
||||
+ (subtitle ? `<p class="subt">${esc(subtitle)}</p>` : '') + `</div>`
|
||||
+ `<div class="tblw" style="height:${f(plan.tableH)}">${table}</div></header>` : ''
|
||||
const foot = bd.footerY != null
|
||||
? `<footer class="ftr" dir="${dir}" style="top:${f(bd.footerY)};height:${f(plan.footerH)}">`
|
||||
+ `<div class="cta"><p class="ctal" dir="auto">${esc(lab('closing', CLOSING_EN))}</p></div>`
|
||||
+ `<div class="jny">${POSTER.journey.map((v) => `<div class="st${v.centre ? ' ctr' : ''}"><p class="sn" dir="auto">${esc(lab('journey_' + v.id, JOURNEY_EN[v.id]))}</p><p class="sv" dir="auto">${esc(v.text)}</p><p class="sr" dir="auto">${esc(v.ref)}</p></div>`).join('')}</div>`
|
||||
+ `<div class="frule"></div>`
|
||||
+ `<p class="fv" dir="ltr" lang="en">${POSTER.benediction.lines.map(esc).join('<br>')}</p>`
|
||||
|
|
@ -315,6 +321,9 @@ function posterParts(groups, presetId, texts, withCards = true) {
|
|||
// warm paper, rules instead of boxes, Georgia for titles and scripture, the sans for labels and names,
|
||||
// tracked capitals for the small labels, and the purple ink for references and emphasis.
|
||||
const PAD = padOf(W)
|
||||
// SECTION DIVIDERS run the page's width, as on the UPG 100 List posters: XR past the content column on each
|
||||
// side, stopping a quarter of the border short of the sheet's edge. The text stays in the content column.
|
||||
const XR = b * 0.75
|
||||
const SANS = "Lato,-apple-system,'Segoe UI',system-ui,Arial,sans-serif"
|
||||
const css = `@page{size:${P.sheetW}in ${P.sheetH}in;margin:0}
|
||||
*{box-sizing:border-box}html,body{margin:0;padding:0}
|
||||
|
|
@ -322,11 +331,13 @@ body,.poster{font-family:Georgia,'Times New Roman',serif;color:${INK};-webkit-pr
|
|||
.sheet{position:relative;width:${P.sheetW}in;height:${P.sheetH}in;overflow:hidden;page-break-after:always;break-after:page;background:${PAPER}}
|
||||
.ban{position:absolute;left:${f(b)};width:${f(W)};text-align:center}
|
||||
.hd{padding:0 ${f(PAD)}}
|
||||
.hd{display:flex;flex-direction:column;justify-content:center;align-items:center;border-bottom:.015in solid #C9BFA4}
|
||||
.hd{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center}
|
||||
.hd::after,.tblw::after,.cta::before,.cta::after{content:'';position:absolute;border-top:.015in solid #C9BFA4}
|
||||
.hd::after{left:${f(-XR)};right:${f(-XR)};bottom:0}
|
||||
.tblw{position:relative}.tblw::after{left:${f(-XR)};right:${f(-XR)};bottom:0;border-top-width:.02in}
|
||||
.hd h1{margin:0;font-size:${f(plan.titleH * 0.44)};line-height:1.15;font-weight:700;letter-spacing:-.02em;color:#1c1c17}
|
||||
.hd .subt{margin:${f(plan.titleH * 0.06)} 0 0;font:${f(plan.titleH * 0.085)}/1.35 ${SANS};color:#7E7562;letter-spacing:.01em}
|
||||
.hd .dedic{margin:${f(plan.titleH * 0.05)} 0 0;font:italic 600 ${f(plan.titleH * 0.1)}/1.3 Georgia,'Times New Roman',serif;color:#4a4636}
|
||||
.themes{display:grid;grid-template-columns:${f(W * 0.06)} repeat(3,1fr);grid-template-rows:34% 33% 33%;height:100%;border-bottom:.02in solid #C9BFA4;overflow:hidden}
|
||||
.themes{display:grid;grid-template-columns:${f(W * 0.06)} repeat(3,1fr);grid-template-rows:34% 33% 33%;height:100%;overflow:hidden}
|
||||
.themes > div{padding:${f(W * 0.006)} ${f(PAD)};overflow:hidden;border-inline-start:.01in solid #D6CCB4}
|
||||
.themes > .rl{display:flex;align-items:center;justify-content:center;color:#8a8470;padding:${f(W * 0.002)};border-inline-start:0}
|
||||
.themes > .td,.themes > .rl:not(.rl-h){border-top:.01in solid #D6CCB4}
|
||||
|
|
@ -337,7 +348,11 @@ body,.poster{font-family:Georgia,'Times New Roman',serif;color:${INK};-webkit-pr
|
|||
.td{display:flex;flex-direction:column;justify-content:center;text-align:center}
|
||||
.td .tv{margin:0;font-size:${f(tvFs)};line-height:1.3;font-style:italic;color:#3a362c}
|
||||
.td .tr{margin:${f(W * 0.002)} 0 0;font:700 ${f(W * 0.0055)} ${SANS};letter-spacing:.12em;text-transform:uppercase;color:${ACCENT}}
|
||||
.ftr{position:absolute;left:${f(b)};width:${f(W)};padding:0 ${f(PAD)};display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;border-top:.02in solid #C9BFA4}
|
||||
.ftr{position:absolute;left:${f(b)};width:${f(W)};padding:0 ${f(PAD)};display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}
|
||||
/* The call to action, in a band ruled across the page (the UPG posters' goal line), above the journey's table. */
|
||||
.cta{position:relative;width:100%;padding:${f(W * 0.009)} 0}
|
||||
.cta::before{left:${f(-PAD - XR)};right:${f(-PAD - XR)};top:0}.cta::after{left:${f(-PAD - XR)};right:${f(-PAD - XR)};bottom:0}
|
||||
.ctal{margin:0;font:italic ${f(FF.cta)}/1.3 Georgia,'Times New Roman',serif;color:#4a4636}
|
||||
/* Rules run the full content width, like the chart's; the padding belongs to the text. */
|
||||
.jny{display:grid;grid-template-columns:repeat(7,1fr);gap:${f(W * 0.006)};margin:${f(W * 0.01)} ${f(-PAD)} 0;width:${f(W)};align-items:stretch}
|
||||
.st{display:flex;flex-direction:column;justify-content:flex-start;padding:${f(W * 0.003)} ${f(W * 0.004)}}
|
||||
|
|
@ -346,7 +361,7 @@ body,.poster{font-family:Georgia,'Times New Roman',serif;color:${INK};-webkit-pr
|
|||
.st .sv{margin:0;font-size:${f(FF.station)};font-style:italic;line-height:1.3;color:#4a4636}
|
||||
.st .sr{margin:${f(W * 0.002)} 0 0;font:700 ${f(Math.max(6 / 72, W * 0.0048))} ${SANS};letter-spacing:.1em;text-transform:uppercase;color:${ACCENT}}
|
||||
.st.ctr{background:#F2EFE6;border:.02in solid #cdbf9e}.st.ctr + .st{border-inline-start:0}.st.ctr .sv{font-weight:600;color:#2A2721}.st.ctr .sn{color:${ACCENT}}
|
||||
.frule{width:${f(W)};margin:${f(W * 0.012)} ${f(-PAD)} ${f(W * 0.01)};border-top:.015in solid #C9BFA4}
|
||||
.frule{width:${f(W + 2 * XR)};margin:${f(W * 0.012)} ${f(-PAD - XR)} ${f(W * 0.01)};border-top:.015in solid #C9BFA4}
|
||||
.fv{margin:0;font:italic 700 ${f(FF.verse)}/1.12 Georgia,'Times New Roman',serif;color:#2A2721;letter-spacing:-.01em;white-space:nowrap}
|
||||
.fvref{margin:${f(W * 0.004)} 0 0;font:700 ${f(FF.ref)} ${SANS};letter-spacing:.14em;text-transform:uppercase;color:${ACCENT}}
|
||||
.fcredit{margin:${f(W * 0.004)} 0 0;font:${f(FF.credit)}/1.3 ${SANS};color:#8a8470}
|
||||
|
|
|
|||
|
|
@ -64,14 +64,15 @@ export const THEMES = THEMES_RAW.map((t) => ({ id: t.id, ot: verse(t.ot), nt: ve
|
|||
|
||||
export const POSTER = {
|
||||
banner: 'Bless the nations in Jesus’ name',
|
||||
// The closing benediction, set large across the foot of the poster: Numbers 6:24 in the World English Bible
|
||||
// British Edition (public domain, ebible.org/eng-webbe; read 2026-10-01 via bible.helloao.org eng_webpb),
|
||||
// verbatim "The LORD bless you, and keep you." set as its two clauses. The British Edition reads "the LORD"
|
||||
// where the WEB used elsewhere on the poster reads "Yahweh"; the credit line names both.
|
||||
// The closing benediction, the poster's footer across its full width: the priestly blessing, Numbers 6:24-26,
|
||||
// in the World English Bible British Edition (public domain, ebible.org/eng-webbe; read via bible.helloao.org
|
||||
// eng_webpb), verbatim, set as two lines broken at verse 25's comma. The British Edition reads "the LORD" where
|
||||
// the WEB used elsewhere on the poster reads "Yahweh"; the credit line names both.
|
||||
benediction: {
|
||||
lines: ['The LORD bless you,', 'and keep you.'],
|
||||
ref: 'Numbers 6:24',
|
||||
credit: 'Scripture: Numbers 6:24 from the World English Bible British Edition; all other verses from the World English Bible. Both are in the public domain.',
|
||||
lines: ['The LORD bless you, and keep you. The LORD make his face to shine on you,',
|
||||
'and be gracious to you. The LORD lift up his face towards you, and give you peace.'],
|
||||
ref: 'Numbers 6:24–26',
|
||||
credit: 'Scripture: Numbers 6:24–26 from the World English Bible British Edition; all other verses from the World English Bible. Both are in the public domain.',
|
||||
},
|
||||
// The second footer: the calling to bless the nations as a journey, Abraham to the church, with Christ
|
||||
// the cornerstone at its centre (the `centre` station). Each station quotes its WHOLE passage, from the
|
||||
|
|
|
|||
|
|
@ -1537,7 +1537,7 @@
|
|||
"bundle": "wall-of-people-groups",
|
||||
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
|
||||
"output": "dx-maps/wall-of-people-groups/wall-of-people-groups.js",
|
||||
"integrity": "sha384-SpdM9eAXMWPQb0WXzO2hiK0eEe5Zw6OI3quFguCegMgjQB+Sr4ucCxLsRAPklT7I",
|
||||
"integrity": "sha384-n8HsGUPVmiBh8tj1yBUdKE6ToS+g0tW19dpxZErTzh6vc1XXNnmJcOebRk0NZ43Z",
|
||||
"elements": [
|
||||
"wall-of-people-groups"
|
||||
],
|
||||
|
|
@ -1557,7 +1557,7 @@
|
|||
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./wall-of-people-groups/wall-of-people-groups/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-SpdM9eAXMWPQb0WXzO2hiK0eEe5Zw6OI3quFguCegMgjQB+Sr4ucCxLsRAPklT7I\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-n8HsGUPVmiBh8tj1yBUdKE6ToS+g0tW19dpxZErTzh6vc1XXNnmJcOebRk0NZ43Z\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
|
||||
},
|
||||
"bundle": "wall-of-people-groups"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1537,7 +1537,7 @@
|
|||
"bundle": "wall-of-people-groups",
|
||||
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
|
||||
"output": "dx-maps/wall-of-people-groups/wall-of-people-groups.js",
|
||||
"integrity": "sha384-SpdM9eAXMWPQb0WXzO2hiK0eEe5Zw6OI3quFguCegMgjQB+Sr4ucCxLsRAPklT7I",
|
||||
"integrity": "sha384-n8HsGUPVmiBh8tj1yBUdKE6ToS+g0tW19dpxZErTzh6vc1XXNnmJcOebRk0NZ43Z",
|
||||
"elements": [
|
||||
"wall-of-people-groups"
|
||||
],
|
||||
|
|
@ -1557,7 +1557,7 @@
|
|||
"scriptUrl": "./wall-of-people-groups/wall-of-people-groups.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./wall-of-people-groups/wall-of-people-groups/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-SpdM9eAXMWPQb0WXzO2hiK0eEe5Zw6OI3quFguCegMgjQB+Sr4ucCxLsRAPklT7I\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./wall-of-people-groups/wall-of-people-groups.js\" integrity=\"sha384-n8HsGUPVmiBh8tj1yBUdKE6ToS+g0tW19dpxZErTzh6vc1XXNnmJcOebRk0NZ43Z\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<wall-of-people-groups profile-config='{\"profile\":\"wall-of-people-groups\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></wall-of-people-groups>"
|
||||
},
|
||||
"bundle": "wall-of-people-groups"
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -67,7 +67,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <wall-of-people-groups> custom element. -->
|
||||
<script src="../wall-of-people-groups.js" integrity="sha384-SpdM9eAXMWPQb0WXzO2hiK0eEe5Zw6OI3quFguCegMgjQB+Sr4ucCxLsRAPklT7I" crossorigin="anonymous"></script>
|
||||
<script src="../wall-of-people-groups.js" integrity="sha384-n8HsGUPVmiBh8tj1yBUdKE6ToS+g0tW19dpxZErTzh6vc1XXNnmJcOebRk0NZ43Z" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
Loading…
Reference in a new issue