Wall of People Groups: the cornerstone line stays on the poster, as a dedication under the title

The footer is scripture only (the journey and Numbers 6:24). The poster's one line of its own words, "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.", now sits in
the header, in small italic under the DOXA line, translated as before (wall.posterClosing). The header
gains one line; the title and the DOXA line keep their size. Measured on the print at every size in en
and ar: 0 overflowing blocks, the dedication included.
This commit is contained in:
Doxa Maps 2026-10-01 07:47:28 +00:00
parent 699d77167d
commit 2bcf371f72
6 changed files with 62 additions and 54 deletions

View file

@ -55,11 +55,12 @@ 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 + DOXA line, then the prayer-themes table. Bottom of the last sheet: the
// 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.
// 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).
const headH = W * 0.075, tableH = W * 0.17, gapH = W * 0.012
// 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 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
@ -104,7 +105,7 @@ export function planPoster(presetId, n) {
return {
preset: P, presetId: PRESETS[presetId] ? presetId : DEFAULT_PRESET, n, cols, rowsPer, cw, ch, bands, cards,
layout: stripLayout ? 'strip' : 'cards', strips,
bannerH, footerH, headH, tableH, gapH, contentW: W,
bannerH, footerH, headH, titleH, tableH, gapH, contentW: W,
posterW: panels.finished.w, posterH: panels.finished.h, // after gluing: 60 × 96 for 5x8ft
text: { versePt: +versePt.toFixed(1), namePt: +(versePt * 1.25).toFixed(1), readable: !stripLayout, stripPt: STRIP_PT },
}
@ -142,6 +143,9 @@ function footerHeight(W, fill) {
}
// 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.
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' }
// Three simple line icons for the prayer themes (stroke = currentColor).
@ -291,7 +295,8 @@ 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>` : '') + `</div>`
+ (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>` : ''
const foot = bd.footerY != null
? `<footer class="ftr" dir="${dir}" style="top:${f(bd.footerY)};height:${f(plan.footerH)}">`
@ -318,8 +323,9 @@ body,.poster{font-family:Georgia,'Times New Roman',serif;color:${INK};-webkit-pr
.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 h1{margin:0;font-size:${f(plan.headH * 0.44)};line-height:1.15;font-weight:700;letter-spacing:-.02em;color:#1c1c17}
.hd .subt{margin:${f(plan.headH * 0.06)} 0 0;font:${f(plan.headH * 0.085)}/1.35 ${SANS};color:#7E7562;letter-spacing:.01em}
.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 > 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}

View file

@ -246,6 +246,7 @@ export default {
theme_treasure: this.$t('wall.themeTreasure'),
theme_mountain: this.$t('wall.themeMountain'),
theme_sea: this.$t('wall.themeSea'),
closing: this.$t('wall.posterClosing'),
journey_called: this.$t('wall.journeyCalled'),
journey_promised: this.$t('wall.journeyPromised'),
journey_redeemed: this.$t('wall.journeyRedeemed'),

View file

@ -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-SB7w9OCvAtWHoYpfO8b41Uci7vYwQoKg5Jggry5nM/zm2S/qHfnIiYgWiSCBzF2M",
"integrity": "sha384-SpdM9eAXMWPQb0WXzO2hiK0eEe5Zw6OI3quFguCegMgjQB+Sr4ucCxLsRAPklT7I",
"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-SB7w9OCvAtWHoYpfO8b41Uci7vYwQoKg5Jggry5nM/zm2S/qHfnIiYgWiSCBzF2M\" 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-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>"
},
"bundle": "wall-of-people-groups"
}

View file

@ -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-SB7w9OCvAtWHoYpfO8b41Uci7vYwQoKg5Jggry5nM/zm2S/qHfnIiYgWiSCBzF2M",
"integrity": "sha384-SpdM9eAXMWPQb0WXzO2hiK0eEe5Zw6OI3quFguCegMgjQB+Sr4ucCxLsRAPklT7I",
"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-SB7w9OCvAtWHoYpfO8b41Uci7vYwQoKg5Jggry5nM/zm2S/qHfnIiYgWiSCBzF2M\" 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-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>"
},
"bundle": "wall-of-people-groups"
}

File diff suppressed because one or more lines are too long

View file

@ -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-SB7w9OCvAtWHoYpfO8b41Uci7vYwQoKg5Jggry5nM/zm2S/qHfnIiYgWiSCBzF2M" crossorigin="anonymous"></script>
<script src="../wall-of-people-groups.js" integrity="sha384-SpdM9eAXMWPQb0WXzO2hiK0eEe5Zw6OI3quFguCegMgjQB+Sr4ucCxLsRAPklT7I" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: