Commit graph

1162 commits

Author SHA1 Message Date
Doxa Maps
63cef78455 Packet print: the prayer themes at 21px (~8.6pt on letter), the credit and privacy lines 0.28in above the sheet's edge, and a Hindi font stack beyond the vendored face
The fine print (the Metacamp credit on the wheel and points pages, the privacy line) sat 22px (0.14in) from the
edge on letter, inside the band printers cannot ink; it now sits at 50px. The points page gives back the room:
point text 18.5 → 18px, 6 → 5px between points, the Mark 5 passage 17 → 16px, the body 14px higher. Measured in
all 11 languages: the tightest (fr, hi) keep 46px under the last point (check:packet-render's pointsOver gates it).
Hindi (and Marathi, Nepali) name Noto Sans Devanagari, Mangal, Nirmala UI and Kohinoor Devanagari after the
vendored Noto Serif Devanagari, so a print without the inlined face still lands on a Devanagari font.
2026-10-02 22:24:43 +00:00
Doxa Maps
26f9177083 Merge the pilot (development 1ca13f60a, packet v2 landing 1) into the Full detail branch 2026-10-02 22:21:57 +00:00
Doxa Maps
bd85830f1c check:packet-render measures the prayer-points page against its sheet, and counts the points by their headings
The points page fits ONE sheet only because its sizes are tuned to the longest language (studio's ask): pointsOver
fails a page whose content outgrows its box (two-sided: 26px text fails; all 11 languages PASS at 18.5px).
Each point's heading carries class pt-h, and the gate counts those: counting every line that starts 'N. ' read
German's '1. Petrus 5:6–11' (its name for 1 Peter, point 11's reference) as a thirteenth point.
2026-10-02 22:13:32 +00:00
Doxa Maps
56278cabfe Packet print readability (rega's read of landing 1): Full detail's tally heads at 15px over wider cells, the prayer themes at 19px
Full detail: tally columns 96 → 116px, the once-per-page question heads 12 → 15px in a 62px head row (three short
lines), so they read on paper; the first page holds 11 rows. Points page: the themes and scenes 15 → 19px (~7.7pt
on letter), the twelve points 19 → 18.5px to make room. Measured in all 11 languages: every first list page,
Full detail's reserved block (612 of 640px) and the points page (the tightest, fr, keeps 43px) still fit.
2026-10-02 22:08:08 +00:00
Doxa Maps
d1851b0e75 The ring legend says what a ring grades: shared language and culture with the nearest believers who could reach them, and ring 9 differs in culture too, x11 (gospel's correction) 2026-10-02 22:03:23 +00:00
Doxa Maps
0a407907d5 Full detail pages: the centered set reads upward to the cross with a legend that says what a ring is; the life in weeks and the reached grid are one light SVG each, the same shape, x11
Centered set: the ring numbers ride the axis BELOW the cross, 9 at the bottom, so the eye climbs 9 → 1 to it;
the dots turn half a circle to keep the number lane clear. The ring legend opens with what a ring means in
plain words (sets_rings_lede x11) before listing the rings that hold someone.
Life in weeks + the reached grid: each grid is ONE inline SVG, two paths of square subpaths (empty, shaded),
hairlines between decades, small week and year numbers; measured on the two pages together: 10,553 page nodes
→ 86, load 474 → 214 ms, print 641 → 320 ms. The reached grid now has the life grid's exact shape (same
geometry, no week or year numbers, centred), shaded from the top by this list's share.
Gates: variants and render decode each grid's subpaths back to box indexes in reading order (5,200 distinct,
Jesus' 33 years = the first 1,716, the share from the top, the same viewBox for both); two-sided: shading
the LAST 33 years fails both. Gospel's three optional nits folded in (it un’altra, example_note x5, ru чёрточка).
2026-10-02 22:01:16 +00:00
Doxa Maps
1ca13f60ae Rebuild every bundle for the packet v2 (the renamed catalogues are shared areas): poster-render and packet-strings re-pinned, the tree and SRI regenerated 2026-10-02 21:56:58 +00:00
Doxa Maps
7e18948698 Prayer points page: the seven prayer themes and three prayer scenes head the twelve points, x11; point 12 is the John 17 blessing ladder
Themes (bless the nations, perfect unity, protection from evil, hearing God's voice, true identity in Christ,
deep relational health, the priesthood of believers) to weave into the wheel's five-minute blocks, then the
scenes treasure, mountain and sea, each with its two references from the Wall of People Groups' poster
(Haggai 2:7 · Matthew 13:44, Isaiah 2:2 · Matthew 21:21, Habakkuk 2:14 · Matthew 8:26). Point 12: the blessing,
the great, the greater and one of the greatest blessings of John 17, unity and protection, beyond all we ask
or think (John 17:3 · John 17:11–23 · Ephesians 3:20). Words drafted by the gospel lane x11; books Haggai,
Isaiah, Habakkuk, Ephesians x11. The page still fits one sheet in every language (19px text, 6px between points).
Gates: parity fails a point whose references are not English's (ten languages kept point 12's old ones) and
needs 7 themes + 3 scenes per language; variants checks the themes block and point 12 in both packets.
2026-10-02 21:51:18 +00:00
Doxa Maps
db3ef22481 The plugin is 'UPG100 Posters', x11 (the series stays 'UPG100 List'), and every spaced 'UPG 100' label becomes 'UPG100'
The tab label in both shells (doxa-maps-spa, posterverse) x11 in each language's own grammar (de 'UPG100-Poster',
es 'Carteles UPG100', zh 'UPG100 海报', …), upgMap displayName and wallHeading x11, the three meta labels, the
nav item and the dev title; the spa's default tab label, the posterverse description, the UPG-100 legend's
count column and the poster-sections noun. Values only: ids, keys, paths and file names stay.
2026-10-02 21:48:33 +00:00
Doxa Maps
7de63201bf The UI names the series UPG100, one term, x11: the tab and wall titles ('UPG100 List Posters'), 'My UPG100 List', 'UPG100 Lists', the search hint, the export label and the help text
Values only: keys, ids, paths and file names stay (my-upg-100-list, tab.upg-100). Catalogues legend, mapStrategy,
messages, search, tabs and upgMap in all 11 languages (13 keys); the shells' tab label in doxa-maps-spa and
posterverse x11 (German 'Poster der UPG100-Liste'); the three meta labels, the dev page title and the nav
label. poster-render's last-resort literals (used only by a series with no name of its own) follow:
'UPG100 List', 'What is a UPG100 List?'.
2026-10-02 21:44:57 +00:00
Doxa Maps
3c1d38bdc8 Packet lists: the three questions head each page ONCE over one grid of tally cells, and both packets open their list with the explanation band, x11
Full detail: the question no longer repeats under every tally cell; the heads stand once per page over the
cells' own columns, and each cell is all tally room (96px columns, taller boxes). The worksheet's boxes
get a little more room too.
Both lists' first page: the intro and the blessing (Numbers 6:24-26, its credit, one line of references, the
wheel pointer) at full width, then ONE band like the poster's (ruled above and below, three columns between
short rules): the pace table (strongest to slower, weekly marked, each load computed from the list), what the
three columns ask, and an EXAMPLE row of tally cells under the table's own heads, exactly as wide as the
tally block and directly over it. One code path (explainTop, explainBand) for both packets.
Measured with a 100-group list in all 11 languages: the worksheet's first page holds 10 rows (the tallest,
ru, keeps 67px), Full detail's 12 under a 640px block (the tallest uses 612); the example sits over the real
cells to the pixel. Gates: packet-variants checks the band in BOTH packets (once, before the first row,
computed paces, one example row, heads once per page); packet-render reads the page sizes from the
renderer, fails a clipped first-page block, and measures text direction against the content box (a padded
cell is still pinned left). New strings x11: howto_bless_col, example_title, example_note.
2026-10-02 21:43:24 +00:00
Doxa Maps
9d1d1aa272 The series is the UPG100 List, one term: the posters' series line and side box ('What is a UPG100 List?'), and the packet's series line and funnel, x11
series.json upg100: seriesName 'UPG100 List', sideBoxHeading 'What is a UPG100 List?', label 'UPG100 — …'.
packet-strings: every 'UPG 100' / 'UPG-100' in the four strings that name the series, in all 11 languages
(map_page_series, funnel_kicker, funnel_packets, funnel_tip; 44 values). The structure gate's literals follow.
2026-10-02 21:35:04 +00:00
Doxa Maps
af6c013bed Rebuild the sheet generator's pin carriers and series.json's importers on the merged pilot: poster-render re-pinned, the tree and SRI regenerated 2026-10-02 20:09:47 +00:00
Doxa Maps
4386b4e5bf Arabic scripture in the packet uses plain alef: U+0671 alef wasla becomes U+0627 in the stored ar strings (the blessing and Mark 5, 13 letters), display only, words and vowels unchanged
A device whose fonts lack U+0671 printed it as a box. Only those 13 code points change (0671: 13 -> 0, 0627:
+13); the bold verse is still a substring of the passage. check:packet-strings-parity fails on any U+0671 in
an ar value (it fails on the previous file). The Arabic scripture blocks also name Arabic faces before serif.
2026-10-02 20:04:41 +00:00
Doxa Maps
2d01e80002 Merge the pilot (development 3184b58c8, the packet's tally columns, description and pace table) into the poster header branch 2026-10-02 20:03:09 +00:00
Doxa Maps
3184b58c8c Rebuild the packet text's pin carriers on the merged pilot: packet-strings re-pinned, its importers rebuilt, the tree and SRI regenerated 2026-10-02 19:47:03 +00:00
Doxa Maps
75e581019e UPG-100 packet page 1 is the full UPG-100 poster: the letter sheet with its title, scripture banner, three-column header and footer, generated at the click
generateSheet gains `sparse` (default: every format but 'packet', so every existing caller is unchanged);
the UPG-100 zone sheet answers the packet's 'packet' request with the full letter poster, the same
1500x1941 page. check:poster-browser-equiv compares that sheet with Node's letter format without SPARSE.
2026-10-02 19:44:34 +00:00
Doxa Maps
381abd0623 Merge the pilot (development 9222c7f36) into the poster header branch 2026-10-02 19:42:57 +00:00
Doxa Maps
36eb0cc66a Merge the pilot (development 9222c7f36, the pinned-file cache fix) into the packet pace branch 2026-10-02 19:41:57 +00:00
Doxa Maps
9222c7f36b Merge origin/development into studio/pinned-fresh 2026-10-02 19:35:39 +00:00
Doxa Maps
550a69b8b9 check-circular-layout: use globalThis.gc, not the free identifier global
check:no-free-identifiers (gates:post) flagged `global` at the budget
arm's optional gc() call. globalThis is the portable form. Script only.
2026-10-02 19:30:09 +00:00
Doxa Maps
536989a3d5 UPG-100 posters: the scripture banner sits under the title, then one three-column band like the footer's (the facts | Jesus' strategy | What is a UPG-100 List?), the text a size larger; the series is named UPG-100 List
Opt-in per series (series.json poster.headColumns, on for upg100 only), so every other series' sheet is
unchanged. The band is laid out by ONE function that both measureHeader() and the renderer call, so the
predicted header height is the drawn one. Each block is centred in an equal column between short rules,
with the inset the first column lacked. The footer's three blocks are drawn at the 13.5px they are wrapped
and spaced for (they were drawn at 12px), so the text grows with no change to the lines or the band's
height, and they are centred for that size.
SOURCE ONLY: the served copies, the integrity pin and its bundles are regenerated at landing.
2026-10-02 19:14:35 +00:00
Doxa Maps
b391988a0f Print files: a transient failure to load the places table is retried on the next print
loadPlaces memoised an empty table on ANY failure, so one network error meant no
city dots for the rest of the session, while the other pinned loaders retry. A
table that is not served (or a reader offline) is now forgotten, so a later print
tries again; wrong bytes, refused after the fresh refetch, stay refused for the
session.
2026-10-02 19:07:51 +00:00
Doxa Maps
ef439a5d8e Print files: a stale cached copy of a pinned file is fetched once more, fresh
The print-time files are pinned (poster-render.js and its classic copy,
packet-strings.json, ne-places.json, india-states.json) and were fetched with
cache: 'force-cache', which returns any cached copy, however old. After a
re-pin, a reader who had printed before kept the previous copy: it failed its
pin on every print and the print fell back without a word. Page 1 became the
stored poster, a non-English packet would print in English, and India's state
cards would be lost.

sha384.js fetchPinned fetches force-cache first (fast, and offline once
cached) and, when the copy is not served or fails its pin, once more with
cache: 'reload', which skips and refreshes the HTTP cache; only that answer
decides. posterSheets (the generator and the places table), packetStrings and
indiaStates all fetch through it. The classic-script path refreshes the cache
the same way and retries a refused tag once.

check:pinned-fetch-fresh models the HTTP cache with stale copies: page 1 still
draws, the packet keeps every language, India keeps its 36 states; a matching
cached copy is used with one request; wrong bytes are refused. The previous
loaders fail it. Self-test poisons: no fresh refetch, never the cache, a
mismatch accepted, a loader fetching its pinned file directly.
2026-10-02 19:05:37 +00:00
Doxa Maps
8dcbba6dbe Packet list wording, after the scripture read: the pace note ties daily prayer to praying for every group on the list, x11; the blessing credits all name ebible.org with an en dash; Russian column questions without a gendered past tense 2026-10-02 19:01:28 +00:00
Doxa Maps
db5cd42841 Packet list: the first page explains the list before it lists anyone, with a prayer-pace table, x11
What the three columns ask; the blessing to pray over each group, Numbers 6:24-26 in full with its credit
(the public-domain text per language, compared verse by verse with its source; ro and hi print the English,
as the packet's other scripture does); one line of further blessing references (the Synodal's own Psalm
numbers in Russian); the prayer wheel at the end; and a pace table, daily (strongest) to every three months
(slower), weekly marked as the healthiest, each pace's daily load computed from the list's size.
The first page holds 11 rows (16 before); later pages keep 18. Measured with a 100-group list in all 11
languages: the longest first pages (ru, hi) keep 77px under their last row, the references fit one line.
check:packet-variants asserts the description, once, before the first row, and the computed pace; the
render gate follows the new pagination.
2026-10-02 18:54:44 +00:00
Doxa Maps
bba4c0c79f Packet list: three tally columns headed by the questions asked of Jesus (Did I bless them? / What do you want me to know? / What do you want me to do?), x11
The tick boxes become tally cells, on the lightweight worksheet and on the full packet's profile rows, so a
list prayed through again and again counts every time. The headings are the questions themselves, broken
into balanced lines; the worksheet's tally columns widen to 160px so English heads take two lines. The
worksheet's note no longer says there is no pace to keep. Measured in all 11 languages: every worksheet
sheet and every profile row still fits (16 + 18 rows a sheet unchanged).
2026-10-02 18:48:17 +00:00
Doxa Maps
ad63cd56d8 Merge remote-tracking branch 'origin/development' into cities-plugin/circular-layout
# Conflicts:
#	package.json
2026-10-02 18:46:19 +00:00
Doxa Maps
fc946bd5fe Merge development into repo/p2-neutral (built files from development; rebuilt next) 2026-10-02 18:13:27 +00:00
Doxa Maps
f89c353548 Merge origin/development (a57ecb2aa) into studio/phone-print-keep 2026-10-02 17:46:38 +00:00
Doxa Maps
540e9ee04a Merge origin/development (8845347f8) into studio/phone-print-keep 2026-10-02 17:44:16 +00:00
Doxa Maps
db1c1da808 Localize the poster header per locale (phrase, not scripture)
The poster sheet's own header 'Bless India in Jesus' name' printed in
English for every reader. It's a phrase, so add a posterHeader key x11
and pass the reader's-locale header to the generator. The footer verse
stays the English PD blessing until the strict-PD per-locale sourcing
lands. Verified: ar poster header = باركوا الهند باسم يسوع.
2026-10-02 17:33:17 +00:00
Doxa Maps
6cd0a8b73c Localize Bless India plugin UI in all 11 locales + RTL
The plugin's own page chrome (title, intro, buttons, stats, notes) was
English in every locale, and in RTL shells its full stops jumped to the
start. Add the page strings to blessIndiaPosters.json x11, look them up
from the reader's locale (profile-config from the shells; ?lang / <html
lang> on the standalone leaf), set dir=rtl for ar/he/fa/ur, and format
counts via the locale. Verified: ar leaf draws dir=rtl with the Arabic
title; en draws dir=ltr.
2026-10-02 17:22:33 +00:00
Doxa Maps
967457f65e Phone print: going away again cancels a pending drop; a 60 s grace; no early touch
A second read measured a hole in the phone print keep: a touch after print()
started the grace, and if the print UI then opened (the page hidden, or the
window blurred), nothing cancelled it, so the document could go while the
reader was still choosing Save as PDF. Now:

- going away again during the grace cancels the pending drop, and the next
  "back" counts;
- BACK_GRACE_MS is 60 s (was 5 s): a slow phone can still be writing an
  11-page packet after its dialog closes, and the kept document is invisible
  on screen and replaced by the next print;
- a touch in the first TOUCH_SETTLE_MS (2 s) after print() is not "back" (a
  double tap while the preview builds).

check:phone-print-keep gains arm H (a touch, then the print UI, by hiding and
by blur: still mounted past the grace, released after the next back) and arm I
(a touch in the settle window), with the poisons "no cancel when away again"
and "no touch settle window"; arm C now taps Print a few seconds after the
document is ready and stays in the dialog past the grace. The first cut fails
H and I; the pilot's file fails A to H. Desktop stays byte-identical.
2026-10-02 17:15:56 +00:00
Doxa Maps
0b1fcde1db Phone print: keep the in-page document until the reader is back, so a saved PDF is the preview
On a phone, printDocument mounts the document into the page (#dxm-print-root and
a print-only style) and calls window.print(). It dropped both at afterprint. But
Android Chrome's print() does not block: afterprint fires once the preview is
built, and the file "Save as PDF" writes is rendered later, after the reader
taps Save, from the page as it is then. The preview showed a packet's 11 pages
and the saved PDF was the bare host page.

The document now stays until the reader is back on the page: shown again after
being hidden, focused again after losing focus, or touched after print(), then
BACK_GRACE_MS more for a job still rendering. A new print replaces it, a
cancelled one drops it, and the ten-minute ceiling stays. Listening starts at
print(), so the Print tap of a late print does not count. printImageBlob's
object URL now follows the document (onRelease) instead of afterprint. On
screen the document is display:none, as before. Desktop prints through the
frame exactly as before.

check:phone-print-keep runs the phone timeline on fake timers and a stub DOM
with an Android user agent; the previous file fails it (gone after afterprint,
image revoked). Its self-test poisons the old drop at afterprint, no release
when back, listeners armed at mount, no grace, printImageBlob revoking at
afterprint, and no ceiling.
2026-10-02 17:10:09 +00:00
Doxa Maps
bffde832f5 Merge remote-tracking branch 'origin/development' into reg-post/bless-india-posters
# Conflicts:
#	public/README.md
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
2026-10-02 16:25:55 +00:00
Doxa Maps
c25bcf4f5c Add Bless India Posters plugin (generative, experimental)
A public preview plugin for the whole-India poster: every India people
group on one printable sheet, generated live from the current data
(nothing stored) and shown as its printable sheets with the glue strips.
Each poster carries the blessing — header "Bless India in Jesus' name"
and the Aaronic blessing (Numbers 6:24-26), switchable.

Generates with the plugin's own copy of the renderer; shows the sheets
via the shared PanelSheets and prints as a document at true size.
Public and experimental; a phone sees the preview but Print is blocked
(desktop only) until a design is proven phone-safe. Registers the
blessIndia poster type for the catalogue; label translated in 11
locales. Replaces the earlier India Posters review draft (not landed).
Element <bless-india-posters>.
2026-10-02 16:22:30 +00:00
Doxa Maps
8bb4e7a8e6 circularLayout: static-import forkRoute + register gate after merge
Switch forkRoute/placePinsInState to static imports from their sibling
library modules (now on development) and delete the vendored forkRoute
fallback; opts may still override for a Worker. Re-register
check:circular-layout (script + gates:pre + description) after the merge
took development's package.json.
2026-10-02 15:59:38 +00:00
Doxa Maps
d6be5806a6 Merge remote-tracking branch 'origin/development' into cities-plugin/circular-layout
# Conflicts:
#	package.json
2026-10-02 15:57:21 +00:00
Doxa Maps
66d6b12a17 Merge commit '6d89e6b8c' into cities-plugin/fork-leaders
# Conflicts:
#	package.json
2026-10-02 15:51:24 +00:00
Doxa Maps
77125daf9d fork-leaders: neutral wording in the MODES comment
Drop the fleet role name from the JSDoc MODES header, keeping the design
labels. Comment-only; behaviour unchanged.
2026-10-02 15:50:55 +00:00
Doxa Maps
ebbee89eea Merge development into repo/p2-neutral 2026-10-02 15:49:50 +00:00
Doxa Maps
6d89e6b8ce Merge commit '85c27e94f7d349722e1ade77fc17b71baf450aab' into poster-design-plugin/catalogue 2026-10-02 13:17:10 +00:00
Doxa Maps
c9a494024b Merge commit '3cb185da1f299194b8c9940abc9e81503d855d77' into poster-design-plugin/catalogue 2026-10-02 13:00:56 +00:00
Doxa Maps
18d1d389be Poster section element: card-action="dashboard" turns each card's sticker into Show dashboard and dispatches dxm-poster-dashboard for the host (absent keeps Show on map) 2026-10-02 12:43:50 +00:00
Doxa Maps
7f272a4cd4 circularLayout gate: close two tautological checks (5B P2/P3)
P2: test fourSides numbering against GEOMETRY per side (L cy↓, R y↑,
T x↑, B x↓) with a de-overlap drift tolerance, not label-emission order
(which numbering walks, so it could never fail). P3: assert every
pairedRows leader carries polys.length===2. Both mutation-tested: a
reversed side sort and a dropped polys each make the gate FAIL.
2026-10-02 12:35:00 +00:00
Doxa Maps
00db24ed0c circularLayout: fix 5B findings
Clear check:no-fleet-names (neutral wording for the classic4 reference,
the vendored-fork note, the browser-budget comment, the gate's format
comment and the package.json description). Fix pairedRows leaders[].polys
(was null on every leader — store fork.polys; drop dead polysForCount).
Tie-break ids by code unit (cmpId), not localeCompare, for byte-identity
across runtimes/locales. Harden the gate: assert the fourSides side
sequence L<T<R<B and monotone numbering within each side (by label
emission order), and recount pins-outside-state and pairedRows crossings
from the OUTPUT, not from stats.
2026-10-02 12:27:56 +00:00
Doxa Maps
6e593f2ae9 packet: circularLayout — poster circular logic as one pure module
New library/packet/circularLayout.js: ring order, leader routing,
numbered four-sides and paired-row forks as a single pure, Worker-safe
module (geometry in, geometry out; no SVG, no DOM, deterministic). Modes
sideLanes (today's L/R), fourSides (numbered, no leaders) and pairedRows
(two leaders per row). measure/slotOf and placePinsInState/forkRoute are
injected; forkRoute falls back to a vendored copy until fork-leaders is
on this tree. Adds check:circular-layout (frozen 855-pin 60x96 fixture:
ring order, 0 dupes, 0 pins-outside-state, 0 crossings on paired rows,
determinism, a poison, and a node time/heap budget).
2026-10-02 12:16:39 +00:00
Doxa Maps
2f4cabf85f Poster Design: the 66x66 and 36x60 side-lane cards get a real sample
India, the one large-sheet country, now prints at 5 x 8 ft only, so the
5.5 x 5.5 ft and 3 x 5 ft side-lane cards would have drawn India's 60x96 sheet
under their own label. They now sample the largest drawable countries (China
at 66x66, Sudan at 36x60) through the same shared sheet path, and their
details say that no country prints at this size today
(posterDesign.missing.noCountryAtSize, 11 locales). The 60x96 card keeps
India and stays withheld. check:poster-design-catalogue now checks every
sample: drawable, or withheld by countrySheet.js.
2026-10-02 12:12:18 +00:00
Doxa Maps
0b47851a41 Merge commit '8fe8603ca2c5d42a252d3f372c9770046e924727' into poster-design-plugin/catalogue
# Conflicts:
#	package.json
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/poster-design/poster-design-mfe/index.html
#	public/dx-maps/poster-design/poster-design.js
#	public/dx-maps/poster-design/poster-sizes/index.html
#	public/dx-maps/poster-design/poster-styles/index.html
2026-10-02 12:07:13 +00:00