Assert the packet numbers that were only being printed, and run the gate on every locale
check-packet-render's own header states the law it exists for — "never print a number
without asserting on it" — and two of the nine numbers it printed were decoration.
PAGE SIZE. Printed "612 x 792 pt", never compared. The landscape check only catches
h <= w, so a wrong PORTRAIT size sailed through: A4 is 595x842, taller-than-wide like
Letter, and would have passed on a packet printing with wrong margins on every US
printer. Not hypothetical — @page{size:...} silently falls back in Chromium, which this
repo has already paid for once. Now asserts every page's MediaBox against Letter.
CARD COUNT. `if (!r.cards)` passed a packet carrying ONE card. Counts must stay relative
(a per-zone packet has its own group count), but relative does not mean unasserted:
sheets === 1 + ceil(cards/PER_PAGE) + 2 holds for any zone.
★ That was not enough, and the mutation test is what showed it. Deleting a whole list
sheet removed 15 cards AND one sheet, so the invariant still held — 80 cards / 7 sheets
is valid arithmetic — and the packet PASSED while missing 15 people groups. Internal
consistency is not completeness. So it now cross-checks an INDEPENDENT witness: the
{from}-{to} of {count} header the renderer prints on each list page, where count comes
from groups.length and does not move when a page is lost. It also requires the ranges to
TILE [1..count], which catches a missing MIDDLE page that the totals alone cannot see.
Those headers are TRANSLATED and the languages disagree on order — en/ar read "1-20 of
95" while hi reads "95 में से 1–20" and zh "95 之中的 1–20", total FIRST. A positional
regex would read those backwards. Parsed as digits with max() as the total instead, and
locale digit forms normalised to ASCII, so it is grammar-independent. Verified by
running the missing-middle-page mutation in Hindi as well as English.
MARK 5 WAS ASSERTED BY AN ENGLISH WORD. body.includes('Gadarenes') would go RED on a
correctly-translated packet, and passes today only because every locale falls back to
English for that key — the check and the bug were locked together. The renderer now
emits class="p4-passage"/"p4-credit" as test hooks (the block is styled inline and had
no selector at all), and the gate asserts length >= 1200, which holds in any language.
check:packets-all runs the gate over EVERY generated packet rather than one hand-named
file. The single-file gate SKIPs without an argument, so it was in package.json, passing
in all 11 locales, and in NEITHER gates:pre NOR gates:post — it ran only when someone
typed a filename. Now in gates:post (21/21, 11 packets through a real browser). SKIPs
when no packets are generated, so a clean checkout is unaffected.
Mutation-tested: A4 FAILs, a dropped sheet FAILs, a missing middle page FAILs in en and
hi, a truncated passage FAILs, a removed passage FAILs. i18n verified end to end by
adding a PARTIAL new language as a data block only — 3 of 23 keys — and confirming the
translated strings render, untranslated keys fall back to English, and nothing is blank.
This commit is contained in:
parent
6d29493e84
commit
e952e01e4c
20 changed files with 332 additions and 122 deletions
|
|
@ -98,6 +98,21 @@ const translated = lang !== 'en'
|
|||
? Object.keys(catalog.en).filter((k) => typeof catalog.en[k] === 'string'
|
||||
&& (catalog[lang] || {})[k] && catalog[lang][k] !== catalog.en[k]).length
|
||||
: null
|
||||
|
||||
// ── THE LARGEST BLOCK OF READER-FACING TEXT, REPORTED SEPARATELY ────────────
|
||||
// point4_passage is Mark 5:1-20 in full — 2,141 characters, by far the longest string
|
||||
// in the packet and the one the Driver singled out ("prayer point number four is
|
||||
// actually read the word"). It is ABSENT from all ten non-English blocks, so every
|
||||
// translated packet prints its longest passage in English. The per-locale "19 strings
|
||||
// translated" headline looked healthy while this was true, because 19 short keys and
|
||||
// one 2,141-character one count the same.
|
||||
// Reported, NOT failed: a Bible passage cannot be machine-translated or written from
|
||||
// memory — it must be an exact, correctly-licensed text, and the English here is
|
||||
// deliberately public-domain (World English Bible). Picking a translation per language
|
||||
// is a sourcing decision with licensing consequences, not a code change. Failing the
|
||||
// build over it would only pressure someone into pasting a copyrighted text.
|
||||
const scriptureIsEnglish = lang !== 'en'
|
||||
&& !(catalog[lang] || {}).point4_passage
|
||||
await page.evaluate((words) => { window.__EXPECTED_RHYTHMS = words }, expected)
|
||||
|
||||
const r = await page.evaluate(() => {
|
||||
|
|
@ -138,9 +153,27 @@ const r = await page.evaluate(() => {
|
|||
rhythms: RHYTHMS.filter((w) => body.includes(w)).length,
|
||||
rhythmsTotal: RHYTHMS.length,
|
||||
wheelSegs: document.querySelectorAll('svg path[fill^="hsl"]').length,
|
||||
hasMark5: body.includes('Gadarenes'), // a word unique to Mark 5:1-20
|
||||
// ⚠ NOT body.includes('Gadarenes'). That was an ENGLISH proper noun, so this
|
||||
// assertion would go RED on a correctly-translated packet and stays green today
|
||||
// only because every locale falls back to English for this key. The check and the
|
||||
// bug were locked together. Assert the STRUCTURE instead — the passage block exists
|
||||
// and carries a full passage's worth of text — which holds in any language.
|
||||
mark5Len: (document.querySelector('.p4-passage')?.textContent || '').trim().length,
|
||||
metacamp: (body.match(/metacamp\.org/g) || []).length,
|
||||
mapFaults,
|
||||
// The per-page "{from}-{to} of {count}" headers, as DIGIT TRIPLES rather than text.
|
||||
// Read from the rendered DOM (not the source template) so what is checked is what a
|
||||
// reader would see. Locale digits are normalised to ASCII first: several catalogs
|
||||
// render through toLocaleString, and Arabic-Indic digits would not match \d.
|
||||
ranges: [...document.querySelectorAll('.hd-r')].map((el) => {
|
||||
const ascii = el.textContent
|
||||
.replace(/[٠-٩]/g, (d) => String(d.charCodeAt(0) - 0x0660))
|
||||
.replace(/[۰-۹]/g, (d) => String(d.charCodeAt(0) - 0x06f0))
|
||||
.replace(/[०-९]/g, (d) => String(d.charCodeAt(0) - 0x0966))
|
||||
.replace(/[0-9]/g, (d) => String(d.charCodeAt(0) - 0xff10))
|
||||
.replace(/[,٬ ]/g, '') // thousands separators
|
||||
return (ascii.match(/\d+/g) || []).map(Number)
|
||||
}).filter((nums) => nums.length === 3),
|
||||
}
|
||||
})
|
||||
|
||||
|
|
@ -160,7 +193,17 @@ if (!r.cards) fails.push('no people-group cards')
|
|||
if (r.broken) fails.push(`${r.broken} broken photo(s)`)
|
||||
if (r.wheelSegs !== 12) fails.push(`prayer wheel has ${r.wheelSegs} segments, expected 12`)
|
||||
if (r.rhythms !== r.rhythmsTotal) fails.push(`only ${r.rhythms}/${r.rhythmsTotal} prayer rhythms present`)
|
||||
if (!r.hasMark5) fails.push('Mark 5:1-20 is NOT printed in full (Driver requirement for point 4)')
|
||||
// Mark 5:1-20 in full is a Driver requirement for point 4: "it actually lists out the
|
||||
// full scripture, because prayer point number four is actually read the word." The
|
||||
// English passage is 2,141 chars; 1,200 is a floor that no truncation or placeholder
|
||||
// survives while leaving room for languages that render the same text more compactly
|
||||
// (zh is typically ~40% shorter in characters).
|
||||
const MARK5_MIN = 1200
|
||||
if (r.mark5Len < MARK5_MIN) {
|
||||
fails.push(r.mark5Len === 0
|
||||
? 'Mark 5:1-20 is NOT printed in full (Driver requirement for point 4) — no .p4-passage block'
|
||||
: `Mark 5:1-20 looks truncated: ${r.mark5Len} chars, expected at least ${MARK5_MIN}`)
|
||||
}
|
||||
if (r.metacamp !== 2) fails.push(`${r.metacamp} metacamp.org attributions, expected exactly 2`)
|
||||
if (r.mapFaults.length) fails.push(`map: ${r.mapFaults.join('; ')}`)
|
||||
if (fontStatus.declared && fontStatus.loaded !== fontStatus.declared) {
|
||||
|
|
@ -177,13 +220,111 @@ if (errs.length) fails.push(`${errs.length} page error(s): ${errs[0]}`)
|
|||
if (landscape) fails.push(`${landscape} landscape page(s) — the packet must be portrait`)
|
||||
if (pages !== r.sheets) fails.push(`${pages} PDF pages for ${r.sheets} sheets — one sheet must be exactly one page`)
|
||||
|
||||
// ── THE PAGE SIZE WAS PRINTED BUT NEVER CHECKED ─────────────────────────────
|
||||
// `landscape` only catches h <= w, so a WRONG PORTRAIT size sailed through: A4 is
|
||||
// 595x842pt, taller-than-wide like Letter, and would have been reported as a clean
|
||||
// pass on a packet that prints with the wrong margins on every US printer.
|
||||
// That is not hypothetical here — this repo has already paid for it once. `@page
|
||||
// {size:...}` silently falls back to Letter in Chromium for any named size beyond
|
||||
// letter/A4, so the declared size and the produced size can disagree with no error
|
||||
// anywhere. The renderer declares `@page{size:letter portrait}` (packet-render.js:97);
|
||||
// this asserts the PDF actually came out that way.
|
||||
// Tolerance is 1pt for float formatting in the MediaBox, not for real drift.
|
||||
const LETTER = [612, 792]
|
||||
if (!boxes.length) {
|
||||
fails.push('the PDF declares no MediaBox — page geometry could not be read at all')
|
||||
} else {
|
||||
const wrong = boxes.filter(([w, h]) => Math.abs(w - LETTER[0]) > 1 || Math.abs(h - LETTER[1]) > 1)
|
||||
if (wrong.length) {
|
||||
fails.push(`${wrong.length}/${boxes.length} page(s) are not US Letter — got `
|
||||
+ `${wrong[0].join(' x ')}pt, expected ${LETTER.join(' x ')}pt `
|
||||
+ '(@page{size:letter portrait} did not take effect)')
|
||||
}
|
||||
}
|
||||
|
||||
// ── THE CARD COUNT WAS PRINTED BUT ONLY CHECKED FOR ZERO ────────────────────
|
||||
// `if (!r.cards)` passes a packet carrying ONE card. The existing comment is right
|
||||
// that counts must stay RELATIVE — a per-zone packet has a different group count, so
|
||||
// pinning 95 would make this gate zone-specific. But relative does not mean unasserted:
|
||||
// the renderer lays out PER_PAGE cards per list page (packet-render.js:59, COLS*ROWS),
|
||||
// and the packet is map + list pages + points + wheel. So the whole structure is
|
||||
// derivable from the card count alone, for ANY zone:
|
||||
//
|
||||
// sheets === 1 + ceil(cards / PER_PAGE) + 2
|
||||
//
|
||||
// That ties the printed number to the sheet count without pinning either. It catches
|
||||
// silently dropped groups (a selector that resolves 95 but renders 40 keeps the same
|
||||
// page arithmetic only if the pages drop too) and a mis-sized grid, which is the way
|
||||
// "20 per page WITH IMAGES" actually regresses. Verified against all 11 locale packets
|
||||
// of laos (95 cards -> 8 sheets) before being turned on.
|
||||
const PER_PAGE = 20
|
||||
const expectedSheets = 1 + Math.ceil(r.cards / PER_PAGE) + 2
|
||||
if (r.cards && r.sheets !== expectedSheets) {
|
||||
fails.push(`${r.cards} people cards should lay out as ${expectedSheets} sheets `
|
||||
+ `(1 map + ${Math.ceil(r.cards / PER_PAGE)} list + points + wheel), but the packet has ${r.sheets} — `
|
||||
+ `either groups were dropped from a page or the ${PER_PAGE}-per-page grid changed`)
|
||||
}
|
||||
|
||||
// ── ...AND THAT ALONE IS NOT ENOUGH: IT ONLY PROVES SELF-CONSISTENCY ────────
|
||||
// ⚠ MUTATION-TESTED, AND THE FIRST VERSION OF THIS GATE FAILED THE TEST. Deleting a
|
||||
// whole list sheet from a finished packet removed 15 cards AND one sheet, so
|
||||
// `sheets === 1 + ceil(cards/20) + 2` still held: 80 cards / 7 sheets is internally
|
||||
// valid arithmetic, and the packet PASSED while missing 15 people groups. A packet can
|
||||
// be perfectly self-consistent and still have lost content — exactly the shape of the
|
||||
// index.json "declares 16, 15 on disk" bug.
|
||||
// So compare against an INDEPENDENT WITNESS the renderer prints for the reader: each
|
||||
// list page's header carries {from}-{to} of {count} (packet-render.js:219). `count` is
|
||||
// the zone's TRUE group total, derived from groups.length rather than from the pages,
|
||||
// so it does not move when a page is lost.
|
||||
//
|
||||
// ⚠ PARSE THE NUMBERS, NEVER THE WORD ORDER. That header is TRANSLATED and the
|
||||
// languages disagree on order: en/ar read "1-20 of 95", hi reads "95 में से 1–20" and
|
||||
// zh reads "95 之中的 1–20" — the total comes FIRST. A positional regex would read hi
|
||||
// and zh backwards and assert against 1 instead of 95. Since count >= to >= from always,
|
||||
// max() recovers the total without knowing any locale's grammar.
|
||||
if (r.ranges.length) {
|
||||
const totals = [...new Set(r.ranges.map((t) => Math.max(...t)))]
|
||||
if (totals.length > 1) {
|
||||
fails.push(`list pages disagree on the zone total: ${totals.join(' vs ')}`)
|
||||
} else {
|
||||
const total = totals[0]
|
||||
if (r.cards !== total) {
|
||||
fails.push(`the packet's own page headers say this zone has ${total} people groups, `
|
||||
+ `but only ${r.cards} cards rendered — ${total - r.cards} were silently dropped`)
|
||||
}
|
||||
// The pages must TILE [1..total] with no gap and no overlap: a lost middle page
|
||||
// leaves a hole that the totals check above cannot see.
|
||||
const spans = r.ranges.map((t) => { const s = [...t].sort((a, b) => a - b); return [s[0], s[1]] })
|
||||
.sort((a, b) => a[0] - b[0])
|
||||
let cursor = 0
|
||||
for (const [from, to] of spans) {
|
||||
if (from !== cursor + 1) {
|
||||
fails.push(`list pages do not tile: expected a page starting at ${cursor + 1}, got ${from} — `
|
||||
+ 'a page is missing or duplicated')
|
||||
break
|
||||
}
|
||||
cursor = to
|
||||
}
|
||||
if (cursor !== total && !fails.some((f) => f.includes('do not tile'))) {
|
||||
fails.push(`list pages stop at ${cursor} but the zone has ${total} groups`)
|
||||
}
|
||||
}
|
||||
} else if (r.cards) {
|
||||
fails.push('no list-page range headers found — the "N of M" witness this gate '
|
||||
+ 'cross-checks the card count against is missing')
|
||||
}
|
||||
|
||||
console.log(` sheets/PDF pages : ${r.sheets} / ${pages}`)
|
||||
console.log(` people cards : ${r.cards} (${r.imgs} photos, ${r.nophoto} typographic)`)
|
||||
console.log(` wheel segments : ${r.wheelSegs}`)
|
||||
console.log(` Mark 5 in full : ${r.hasMark5}`)
|
||||
console.log(` Mark 5 in full : ${r.mark5Len} chars`
|
||||
+ `${scriptureIsEnglish ? ' ⚠ UNTRANSLATED (English fallback)' : ''}`)
|
||||
console.log(` metacamp.org : ${r.metacamp}`)
|
||||
console.log(` map : ${r.mapFaults.length ? r.mapFaults.join('; ') : 'palette resolves, not black'}`)
|
||||
console.log(` page size : ${boxes[0] ? boxes[0].join(' x ') : '?'} pt`)
|
||||
console.log(` page size : ${boxes[0] ? boxes[0].join(' x ') : '?'} pt`
|
||||
+ `${boxes.length ? ` (all ${boxes.length} pages, asserted US Letter)` : ''}`)
|
||||
console.log(` layout : ${r.cards} cards / ${PER_PAGE} per page `
|
||||
+ `= ${expectedSheets} sheets expected, ${r.sheets} rendered`)
|
||||
console.log(` script font : ${fontStatus.declared ? fontStatus.names.join(', ') : 'system stack'}`)
|
||||
console.log(` language : ${lang} (dir=${dir}) (${r.rhythms}/${r.rhythmsTotal} rhythms in ${lang}`
|
||||
+ `${translated === null ? '' : `, ${translated} strings translated`})`)
|
||||
|
|
|
|||
66
internal/check-packets-all.mjs
Normal file
66
internal/check-packets-all.mjs
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
#!/usr/bin/env node
|
||||
// check-packets-all — run check-packet-render over EVERY generated packet.
|
||||
//
|
||||
// ★ WHY THIS WRAPPER EXISTS. check-packet-render takes a path, and with no path it
|
||||
// SKIPs at exit 0 — deliberately, so a build is not failed on a file that may not have
|
||||
// been generated. The consequence, measured 2026-09-24: the gate was in package.json,
|
||||
// all 11 locale packets passed it, and it was in NEITHER gates:pre NOR gates:post. It
|
||||
// only ever ran when a human remembered to type a filename. A gate nobody invokes
|
||||
// protects nothing — the same "present but unwired" state the two i18n gates were in.
|
||||
//
|
||||
// So this sweeps the directory and gates the WHOLE SET. That matters beyond wiring:
|
||||
// checking one hand-named packet proves one locale. The packet ships in 11, and the
|
||||
// failures that actually occur are locale-specific — a script font that does not load,
|
||||
// an RTL document laid out LTR, a translated page header whose word order breaks a
|
||||
// parser. Those are invisible if the gate is pointed at laos.html and nothing else.
|
||||
//
|
||||
// SKIP (exit 0) only when the directory is genuinely absent or empty: packets are
|
||||
// generated on demand and a clean checkout has none. A skip says so out loud, with the
|
||||
// count, so "0 packets checked" can never read as "all packets passed".
|
||||
import { existsSync, readdirSync } from 'node:fs'
|
||||
import { resolve, dirname, join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { spawnSync } from 'node:child_process'
|
||||
|
||||
const HERE = dirname(fileURLToPath(import.meta.url))
|
||||
// Repo-relative, never an author's worktree: this gate lives in two repos and the
|
||||
// packets are generated in the one that owns the poster scripts.
|
||||
const REPO = process.env.DOXA_REPO || resolve(HERE, '..')
|
||||
const DIR = process.env.PACKET_DIR
|
||||
|| resolve(REPO, 'library/scripts/posters/out/packets')
|
||||
|
||||
if (!existsSync(DIR)) {
|
||||
console.log(`PACKETS-ALL: SKIP — no packet directory at ${DIR}`)
|
||||
console.log(' Packets are generated on demand (node library/scripts/posters/packet.mjs);')
|
||||
console.log(' a clean checkout has none, so this is not a failure.')
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
const files = readdirSync(DIR).filter((f) => f.endsWith('.html')).sort()
|
||||
if (!files.length) {
|
||||
console.log(`PACKETS-ALL: SKIP — ${DIR} contains no .html packets`)
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
const gate = join(HERE, 'check-packet-render.mjs')
|
||||
const failed = []
|
||||
for (const f of files) {
|
||||
const res = spawnSync(process.execPath, [gate, join(DIR, f)], { encoding: 'utf8' })
|
||||
const ok = res.status === 0
|
||||
console.log(` ${ok ? '✓' : '✗'} ${f}`)
|
||||
if (!ok) {
|
||||
failed.push(f)
|
||||
// Print the failing gate's own reasons rather than a generic "it failed" —
|
||||
// the detail is what makes a red build actionable.
|
||||
const detail = `${res.stdout || ''}${res.stderr || ''}`
|
||||
.split('\n').filter((l) => l.trim().startsWith('-') || l.includes('FAIL'))
|
||||
for (const line of detail) console.log(` ${line.trim()}`)
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\nPACKETS-ALL: ${files.length} packet(s) checked, ${files.length - failed.length} passed`)
|
||||
if (failed.length) {
|
||||
console.error(`PACKETS-ALL: FAIL — ${failed.length} packet(s): ${failed.join(', ')}`)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log('PACKETS-ALL: PASS — every generated packet renders, in every locale present.')
|
||||
|
|
@ -239,9 +239,12 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null })
|
|||
const passage = p.print_passage
|
||||
// Point 4 prints Mark 5:1-20 IN FULL. Driver: "it actually lists out the full
|
||||
// scripture, because prayer point number four is actually read the word."
|
||||
? `<div style="font:400 14px Georgia,serif;color:#4a4a45;line-height:1.5;margin-top:5px;
|
||||
// class="p4-passage" is a TEST HOOK, not styling — the block is styled inline.
|
||||
// Without it the only way to assert the passage rendered was to search for the
|
||||
// English word "Gadarenes", which would go red the moment this key is translated.
|
||||
? `<div class="p4-passage" style="font:400 14px Georgia,serif;color:#4a4a45;line-height:1.5;margin-top:5px;
|
||||
padding-left:10px;border-left:2px solid #d9d3c4">${esc(t('point4_passage'))}
|
||||
<div style="font:italic 12px Georgia,serif;color:#a89f8c;margin-top:3px">
|
||||
<div class="p4-credit" style="font:italic 12px Georgia,serif;color:#a89f8c;margin-top:3px">
|
||||
${esc(t('point4_passage_credit'))}</div></div>`
|
||||
: '';
|
||||
return `<div style="margin-bottom:${p.print_passage ? 10 : 13}px">
|
||||
|
|
|
|||
|
|
@ -141,11 +141,11 @@
|
|||
"check:doc-scripts:self-test": "node internal/check-doc-quotes-scripts.mjs --self-test",
|
||||
"check:legend-source": "node internal/check-legend-matches-source.mjs # the numbers the maps SHOW must match the numbers the live SOURCE has. Every other gate checks INTERNAL consistency — a page can agree with itself perfectly while its legend has stopped describing reality. Offline SKIPs (exit 0); only a reachable endpoint that disagrees fails.",
|
||||
"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:wp-embed check:doc-scripts",
|
||||
"gates:post": "node internal/run-parallel.mjs --label=post -- 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",
|
||||
"gates:post": "node internal/run-parallel.mjs --label=post -- 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",
|
||||
"build:bundles": "node internal/run-parallel.mjs --bundles",
|
||||
"check:maplibre-drops": "node internal/check-maplibre-layer-drops.mjs",
|
||||
"gates:post": "node internal/run-parallel.mjs --label=post -- 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:tabs-localized": "node internal/check-tabs-localized.mjs # a chosen locale must CHANGE the rendered tab text. check:i18n-parity compares catalogs to each OTHER, so it cannot tell a shipped translation from a dead one; tabs.json is reached only via a DYNAMIC key (SemanticTreeLegend.vue:40), invisible to any grep. Renders it and reads the result."
|
||||
"check:tabs-localized": "node internal/check-tabs-localized.mjs # a chosen locale must CHANGE the rendered tab text. check:i18n-parity compares catalogs to each OTHER, so it cannot tell a shipped translation from a dead one; tabs.json is reached only via a DYNAMIC key (SemanticTreeLegend.vue:40), invisible to any grep. Renders it and reads the result.",
|
||||
"check:packets-all": "node internal/check-packets-all.mjs # runs check:packet-render over EVERY generated packet, not one hand-named file. The single-file gate SKIPs with no argument, so it was in package.json, passing in all 11 locales, and in neither gates:pre nor gates:post — it only ran when someone typed a filename. SKIPs when no packets are generated."
|
||||
},
|
||||
"devDependencies": {
|
||||
"@capacitor/android": "^7.6.9",
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
|
||||
<script src="../country-posters.js" integrity="sha384-mk3L38FZ9gEiv/eRg89RXFkn0yzzOw3uSoxZ4NFr2UUEgVecyCe07hI0tgUQPMWY" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-5a7eHbJrOmwwGTDlhvBUGu2iXs7mujbuBUpY5fRC2vBmjByzaRzq05hQr502uMIj" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
|
||||
<script src="../country-posters.js" integrity="sha384-mk3L38FZ9gEiv/eRg89RXFkn0yzzOw3uSoxZ4NFr2UUEgVecyCe07hI0tgUQPMWY" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-5a7eHbJrOmwwGTDlhvBUGu2iXs7mujbuBUpY5fRC2vBmjByzaRzq05hQr502uMIj" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
|
||||
<script src="../country-posters.js" integrity="sha384-mk3L38FZ9gEiv/eRg89RXFkn0yzzOw3uSoxZ4NFr2UUEgVecyCe07hI0tgUQPMWY" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-5a7eHbJrOmwwGTDlhvBUGu2iXs7mujbuBUpY5fRC2vBmjByzaRzq05hQr502uMIj" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -1657,9 +1657,9 @@
|
|||
</div></div>`}).join("");X.push(A(`
|
||||
<div class="hd">${_(z.label||z.id)}</div>
|
||||
<div class="hd-r">${_(l(r("list_header"),{from:P(de+1),to:P(Math.min(de+d,ne.length)),count:P(ne.length)}))}</div>
|
||||
${ke}`))}return X}function N(){const z=i.map(ne=>{const U=(ne.refs||[]).map(ve=>`<span dir="ltr" style="unicode-bidi:isolate">${_(ve)}</span>`).join(" · "),X=ne.sub?` <span style="font:italic 17px Georgia,serif;color:#8c8170">— ${_(ne.sub)}</span>`:"",de=ne.print_passage?`<div style="font:400 14px Georgia,serif;color:#4a4a45;line-height:1.5;margin-top:5px;
|
||||
${ke}`))}return X}function N(){const z=i.map(ne=>{const U=(ne.refs||[]).map(ve=>`<span dir="ltr" style="unicode-bidi:isolate">${_(ve)}</span>`).join(" · "),X=ne.sub?` <span style="font:italic 17px Georgia,serif;color:#8c8170">— ${_(ne.sub)}</span>`:"",de=ne.print_passage?`<div class="p4-passage" style="font:400 14px Georgia,serif;color:#4a4a45;line-height:1.5;margin-top:5px;
|
||||
padding-left:10px;border-left:2px solid #d9d3c4">${_(r("point4_passage"))}
|
||||
<div style="font:italic 12px Georgia,serif;color:#a89f8c;margin-top:3px">
|
||||
<div class="p4-credit" style="font:italic 12px Georgia,serif;color:#a89f8c;margin-top:3px">
|
||||
${_(r("point4_passage_credit"))}</div></div>`:"";return`<div style="margin-bottom:${ne.print_passage?10:13}px">
|
||||
<div style="font:700 19px Georgia,serif;color:#1b1a17">
|
||||
${ne.n}. ${_(s(ne.rhythm))}${X}</div>
|
||||
|
|
|
|||
2
public/doxa-maps/index.html
generated
2
public/doxa-maps/index.html
generated
File diff suppressed because one or more lines are too long
4
public/doxa-maps/key-cities/key-cities.js
generated
4
public/doxa-maps/key-cities/key-cities.js
generated
|
|
@ -186,9 +186,9 @@
|
|||
</div></div>`}).join("");Se.push($(`
|
||||
<div class="hd">${L(te.label||te.id)}</div>
|
||||
<div class="hd-r">${L(l(s("list_header"),{from:P(be+1),to:P(Math.min(be+w,se.length)),count:P(se.length)}))}</div>
|
||||
${Re}`))}return Se}function oe(){const te=i.map(se=>{const le=(se.refs||[]).map(nt=>`<span dir="ltr" style="unicode-bidi:isolate">${L(nt)}</span>`).join(" · "),Se=se.sub?` <span style="font:italic 17px Georgia,serif;color:#8c8170">— ${L(se.sub)}</span>`:"",be=se.print_passage?`<div style="font:400 14px Georgia,serif;color:#4a4a45;line-height:1.5;margin-top:5px;
|
||||
${Re}`))}return Se}function oe(){const te=i.map(se=>{const le=(se.refs||[]).map(nt=>`<span dir="ltr" style="unicode-bidi:isolate">${L(nt)}</span>`).join(" · "),Se=se.sub?` <span style="font:italic 17px Georgia,serif;color:#8c8170">— ${L(se.sub)}</span>`:"",be=se.print_passage?`<div class="p4-passage" style="font:400 14px Georgia,serif;color:#4a4a45;line-height:1.5;margin-top:5px;
|
||||
padding-left:10px;border-left:2px solid #d9d3c4">${L(s("point4_passage"))}
|
||||
<div style="font:italic 12px Georgia,serif;color:#a89f8c;margin-top:3px">
|
||||
<div class="p4-credit" style="font:italic 12px Georgia,serif;color:#a89f8c;margin-top:3px">
|
||||
${L(s("point4_passage_credit"))}</div></div>`:"";return`<div style="margin-bottom:${se.print_passage?10:13}px">
|
||||
<div style="font:700 19px Georgia,serif;color:#1b1a17">
|
||||
${se.n}. ${L(a(se.rhythm))}${Se}</div>
|
||||
|
|
|
|||
28
public/doxa-maps/manifest.json
generated
28
public/doxa-maps/manifest.json
generated
|
|
@ -9,7 +9,7 @@
|
|||
"bundle": "all-people-groups",
|
||||
"scriptUrl": "./all-people-groups/all-people-groups.js",
|
||||
"output": "doxa-maps/all-people-groups/all-people-groups.js",
|
||||
"integrity": "sha384-xyaOMJJGpMsUFLHhSnQZrXPkFyPr+TKDt8jwjowVbozX2w9CZP437dyKFaH2AOB3",
|
||||
"integrity": "sha384-wRewQ3RMeMMt4aBtsLefcXPap77pkP0fomuLnBKvQMLRtcqOvlHlFRcAByztpXyt",
|
||||
"elements": [
|
||||
"all-people-groups"
|
||||
],
|
||||
|
|
@ -25,7 +25,7 @@
|
|||
"scriptUrl": "./all-people-groups/all-people-groups.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./all-people-groups/all-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=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-xyaOMJJGpMsUFLHhSnQZrXPkFyPr+TKDt8jwjowVbozX2w9CZP437dyKFaH2AOB3\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./all-people-groups/all-people-groups.js\" integrity=\"sha384-wRewQ3RMeMMt4aBtsLefcXPap77pkP0fomuLnBKvQMLRtcqOvlHlFRcAByztpXyt\" crossorigin=\"anonymous\"></script>\n<all-people-groups profile-config='{\"profile\":\"all-people-groups\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></all-people-groups>"
|
||||
},
|
||||
"bundle": "all-people-groups"
|
||||
}
|
||||
|
|
@ -154,7 +154,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "doxa-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-mk3L38FZ9gEiv/eRg89RXFkn0yzzOw3uSoxZ4NFr2UUEgVecyCe07hI0tgUQPMWY",
|
||||
"integrity": "sha384-5a7eHbJrOmwwGTDlhvBUGu2iXs7mujbuBUpY5fRC2vBmjByzaRzq05hQr502uMIj",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -174,7 +174,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/countries-map/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=\"./country-posters/country-posters.js\" integrity=\"sha384-mk3L38FZ9gEiv/eRg89RXFkn0yzzOw3uSoxZ4NFr2UUEgVecyCe07hI0tgUQPMWY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5a7eHbJrOmwwGTDlhvBUGu2iXs7mujbuBUpY5fRC2vBmjByzaRzq05hQr502uMIj\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -188,7 +188,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-mk3L38FZ9gEiv/eRg89RXFkn0yzzOw3uSoxZ4NFr2UUEgVecyCe07hI0tgUQPMWY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5a7eHbJrOmwwGTDlhvBUGu2iXs7mujbuBUpY5fRC2vBmjByzaRzq05hQr502uMIj\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -202,7 +202,7 @@
|
|||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/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=\"./country-posters/country-posters.js\" integrity=\"sha384-mk3L38FZ9gEiv/eRg89RXFkn0yzzOw3uSoxZ4NFr2UUEgVecyCe07hI0tgUQPMWY\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-5a7eHbJrOmwwGTDlhvBUGu2iXs7mujbuBUpY5fRC2vBmjByzaRzq05hQr502uMIj\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -658,7 +658,7 @@
|
|||
"bundle": "my-upg-100-list",
|
||||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"output": "doxa-maps/my-upg-100-list/my-upg-100-list.js",
|
||||
"integrity": "sha384-/g1IZXqStjHu34i4B12LQdGpK965qFY0vSThdph2gKrVqmtl4NTFdzh5IvJptHHV",
|
||||
"integrity": "sha384-DTQvsXU3C5sstv8K7pnmiFWMP23nSlwYzIHbwpVoqQzQc+7tGx9IQvPXbMqAPA5p",
|
||||
"elements": [
|
||||
"my-upg-100-list-map"
|
||||
],
|
||||
|
|
@ -678,7 +678,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-/g1IZXqStjHu34i4B12LQdGpK965qFY0vSThdph2gKrVqmtl4NTFdzh5IvJptHHV\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-DTQvsXU3C5sstv8K7pnmiFWMP23nSlwYzIHbwpVoqQzQc+7tGx9IQvPXbMqAPA5p\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -692,7 +692,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-/g1IZXqStjHu34i4B12LQdGpK965qFY0vSThdph2gKrVqmtl4NTFdzh5IvJptHHV\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-DTQvsXU3C5sstv8K7pnmiFWMP23nSlwYzIHbwpVoqQzQc+7tGx9IQvPXbMqAPA5p\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -706,7 +706,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-/g1IZXqStjHu34i4B12LQdGpK965qFY0vSThdph2gKrVqmtl4NTFdzh5IvJptHHV\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-DTQvsXU3C5sstv8K7pnmiFWMP23nSlwYzIHbwpVoqQzQc+7tGx9IQvPXbMqAPA5p\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -856,7 +856,7 @@
|
|||
"bundle": "regions-dashboard",
|
||||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
|
||||
"integrity": "sha384-/0xJsdPMt2izpGpElmMftHWA/ckwtU/VwVbrUrXMaSPeZ0EK86HfggXZmp/vHtGi",
|
||||
"integrity": "sha384-SAhmo3+ZWDwloVFre+NolH8j7QU9Cz8OgBzY7dQOA8jNUY9ITQnvIIiMrkzO+HuK",
|
||||
"elements": [
|
||||
"regions-dashboard"
|
||||
],
|
||||
|
|
@ -876,7 +876,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/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=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-/0xJsdPMt2izpGpElmMftHWA/ckwtU/VwVbrUrXMaSPeZ0EK86HfggXZmp/vHtGi\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-SAhmo3+ZWDwloVFre+NolH8j7QU9Cz8OgBzY7dQOA8jNUY9ITQnvIIiMrkzO+HuK\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -890,7 +890,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-list/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=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-/0xJsdPMt2izpGpElmMftHWA/ckwtU/VwVbrUrXMaSPeZ0EK86HfggXZmp/vHtGi\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-SAhmo3+ZWDwloVFre+NolH8j7QU9Cz8OgBzY7dQOA8jNUY9ITQnvIIiMrkzO+HuK\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -904,7 +904,7 @@
|
|||
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/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=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-/0xJsdPMt2izpGpElmMftHWA/ckwtU/VwVbrUrXMaSPeZ0EK86HfggXZmp/vHtGi\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-SAhmo3+ZWDwloVFre+NolH8j7QU9Cz8OgBzY7dQOA8jNUY9ITQnvIIiMrkzO+HuK\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1231,9 +1231,9 @@
|
|||
</div></div>`}).join("");ce.push(P(`
|
||||
<div class="hd">${A(L.label||L.id)}</div>
|
||||
<div class="hd-r">${A(l(r("list_header"),{from:C(we+1),to:C(Math.min(we+h,ae.length)),count:C(ae.length)}))}</div>
|
||||
${Re}`))}return ce}function I(){const L=i.map(ae=>{const ie=(ae.refs||[]).map(Me=>`<span dir="ltr" style="unicode-bidi:isolate">${A(Me)}</span>`).join(" · "),ce=ae.sub?` <span style="font:italic 17px Georgia,serif;color:#8c8170">— ${A(ae.sub)}</span>`:"",we=ae.print_passage?`<div style="font:400 14px Georgia,serif;color:#4a4a45;line-height:1.5;margin-top:5px;
|
||||
${Re}`))}return ce}function I(){const L=i.map(ae=>{const ie=(ae.refs||[]).map(Me=>`<span dir="ltr" style="unicode-bidi:isolate">${A(Me)}</span>`).join(" · "),ce=ae.sub?` <span style="font:italic 17px Georgia,serif;color:#8c8170">— ${A(ae.sub)}</span>`:"",we=ae.print_passage?`<div class="p4-passage" style="font:400 14px Georgia,serif;color:#4a4a45;line-height:1.5;margin-top:5px;
|
||||
padding-left:10px;border-left:2px solid #d9d3c4">${A(r("point4_passage"))}
|
||||
<div style="font:italic 12px Georgia,serif;color:#a89f8c;margin-top:3px">
|
||||
<div class="p4-credit" style="font:italic 12px Georgia,serif;color:#a89f8c;margin-top:3px">
|
||||
${A(r("point4_passage_credit"))}</div></div>`:"";return`<div style="margin-bottom:${ae.print_passage?10:13}px">
|
||||
<div style="font:700 19px Georgia,serif;color:#1b1a17">
|
||||
${ae.n}. ${A(s(ae.rhythm))}${ce}</div>
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-/g1IZXqStjHu34i4B12LQdGpK965qFY0vSThdph2gKrVqmtl4NTFdzh5IvJptHHV" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-DTQvsXU3C5sstv8K7pnmiFWMP23nSlwYzIHbwpVoqQzQc+7tGx9IQvPXbMqAPA5p" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-/g1IZXqStjHu34i4B12LQdGpK965qFY0vSThdph2gKrVqmtl4NTFdzh5IvJptHHV" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-DTQvsXU3C5sstv8K7pnmiFWMP23nSlwYzIHbwpVoqQzQc+7tGx9IQvPXbMqAPA5p" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-/g1IZXqStjHu34i4B12LQdGpK965qFY0vSThdph2gKrVqmtl4NTFdzh5IvJptHHV" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-DTQvsXU3C5sstv8K7pnmiFWMP23nSlwYzIHbwpVoqQzQc+7tGx9IQvPXbMqAPA5p" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
|
||||
<script src="../regions-dashboard.js" integrity="sha384-/0xJsdPMt2izpGpElmMftHWA/ckwtU/VwVbrUrXMaSPeZ0EK86HfggXZmp/vHtGi" crossorigin="anonymous"></script>
|
||||
<script src="../regions-dashboard.js" integrity="sha384-SAhmo3+ZWDwloVFre+NolH8j7QU9Cz8OgBzY7dQOA8jNUY9ITQnvIIiMrkzO+HuK" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
164
public/doxa-maps/regions-dashboard/regions-dashboard.js
generated
164
public/doxa-maps/regions-dashboard/regions-dashboard.js
generated
File diff suppressed because one or more lines are too long
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
|
||||
<script src="../regions-dashboard.js" integrity="sha384-/0xJsdPMt2izpGpElmMftHWA/ckwtU/VwVbrUrXMaSPeZ0EK86HfggXZmp/vHtGi" crossorigin="anonymous"></script>
|
||||
<script src="../regions-dashboard.js" integrity="sha384-SAhmo3+ZWDwloVFre+NolH8j7QU9Cz8OgBzY7dQOA8jNUY9ITQnvIIiMrkzO+HuK" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
|
||||
<script src="../regions-dashboard.js" integrity="sha384-/0xJsdPMt2izpGpElmMftHWA/ckwtU/VwVbrUrXMaSPeZ0EK86HfggXZmp/vHtGi" crossorigin="anonymous"></script>
|
||||
<script src="../regions-dashboard.js" integrity="sha384-SAhmo3+ZWDwloVFre+NolH8j7QU9Cz8OgBzY7dQOA8jNUY9ITQnvIIiMrkzO+HuK" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
Loading…
Reference in a new issue