From e380ab8cbb4a673f6621c3daec5c0f67e9c35161 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Sat, 3 Oct 2026 04:13:07 +0000 Subject: [PATCH] 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). --- .../wall-of-people-groups/src/blessPoster.js | 53 +++++--- .../wall-of-people-groups/src/blessings.js | 15 +-- public/dx-maps/doxa-maps-spa/manifest.json | 4 +- public/dx-maps/manifest.json | 4 +- .../wall-of-people-groups.js | 116 +++++++++--------- .../wall-of-people-groups/index.html | 2 +- 6 files changed, 108 insertions(+), 86 deletions(-) diff --git a/plugin-designs/wall-of-people-groups/src/blessPoster.js b/plugin-designs/wall-of-people-groups/src/blessPoster.js index c81b95007..edd29d198 100644 --- a/plugin-designs/wall-of-people-groups/src/blessPoster.js +++ b/plugin-designs/wall-of-people-groups/src/blessPoster.js @@ -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_ 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 ? `
` + `

${esc(banner)}

` - + (subtitle ? `

${esc(subtitle)}

` : '') - + `

${esc(lab('closing', CLOSING_EN))}

` - + `
${table}
` : '' + + (subtitle ? `

${esc(subtitle)}

` : '') + `` + + `
${table}
` : '' const foot = bd.footerY != null ? `