Commit graph

1889 commits

Author SHA1 Message Date
Doxa Maps
09d884ce3a Posterverse: on the dev server, read the built tree from its root, not /public/
On a staging page the manifest fallback was /public/<tree>/manifest.json, which
made /public/<tree>/ the base for every child script. The dev server treats a
/public/… request as source and injects an import into the built IIFE, so the
child failed as a classic script ("Cannot use import statement outside a
module"). The fallback is now /<tree>/manifest.json, where the dev server serves
the built tree unchanged. Built trees are unaffected (they resolve the manifest
before this fallback).
2026-10-03 07:18:00 +00:00
Doxa Maps
8c05f6207a Posterverse: a nested plugin's view inside a tab reaches the address
The shell owns the address for the views inside its tabs too: a nested
composite's ?pane= / ?place= choice is recorded through the shared helper, only
while this page owns its address, never as a tab switch, and the event stops at
the shell.
2026-10-03 06:29:51 +00:00
Doxa Maps
c963a2a9fa P2: studio's 5B notes. A nested element cannot switch the owner's tab, a kept-alive pane or place is claimed back when its tab is shown again, and scrollTo takes null
- ownAddress records only pane and place. tab is the owner's own key, so a nested announcement cannot switch it.
- A shell keeps Regions (and UPG100) alive when another tab is open. Switching back dropped ?pane= and ?place=
  (the tab change), while the screen still showed them. pane-wrapper and region-dashboards now watch for being
  shown again (a ResizeObserver: no height, then height) and claim their pane / place back with a replace. An
  address that names one wins, because Back to an entry of this tab is applied while the column has no layout.
- scrollTo(id, null) behaves as scrollTo(id).

check:view-address covers each of these (34 poisons, each caught). The slow pane-wrapper arm runs only for
pane-wrapper poisons, so the self-test takes 16 s.
2026-10-03 06:26:53 +00:00
Doxa Maps
003af1caa8 Shareable pages P2: a composite's open pane and Regions' subject are in the page address
The address gets its second and third keys:
- ?pane= is the open view of a composite;
- ?place= is Regions' subject.
Both keep the ONE-writer rule:
- On its own leaf the composite owns the address and writes.
- Nested in a shell it announces, and the shell writes.
- On a partner's page nothing is written; a link is still read.

useViewAddress:
- claimView() is the one call for a reader's choice: the owner writes it, any other element announces it.
- ownAddress() lets an owner record its nested elements' announcements, and stops them there.
- An announcement carries only the view keys, one event per action.
- pane and place are siblings: a tab change drops both, but a pane change keeps the place, because Regions keeps
  its region while the reader is on the list.

pane-wrapper (buildPaneColumn) takes an opt-in `address`:
- a link opens its pane without writing;
- a click is a push, and a selection made by the same click rides in the same push (one Back step);
- where the reader's scroll settles is a replace;
- Back/Forward scroll and never write;
- the first pane is the default and is never written.

Regions:
- regions-mfe opts its column in and records its panes' announcements on its own leaf. A list click opens the
  dashboard with its place in one write.
- region-dashboards claims ?place= instead of writing its #slug with its own pushState (replace at first paint,
  push on a choice, re-applied on Back). An old #slug link still opens, and on its own leaf it is rewritten to
  ?place=.
- urlSync:false now guards only the tab title.

check:view-address adds:
- E: nested claims and the owner;
- F: pane-wrapper on a simulated column;
- G: the Regions wiring.
The census drops region-dashboards (5 writers now). Self-test: 29 poisons, each caught. Real-source mutations are
caught too.
2026-10-03 06:09:51 +00:00
Doxa Maps
ceb7168bf3 Merge remote-tracking branch 'origin/development' into regions-plugin/view-address
# Conflicts:
#	package.json
2026-10-03 05:43:09 +00:00
Doxa Maps
5c03996dbb Merge the Research Gallery staging page's address ownership (shareable pages P1) 2026-10-03 05:42:23 +00:00
Doxa Maps
7285fda93d Merge the dev server's address ownership for Plugin Studio and the leaf pages (shareable pages P1) 2026-10-03 05:41:25 +00:00
Doxa Maps
d65747a300 Merge the Posterverse staging page's address ownership (shareable pages P1) 2026-10-03 05:41:25 +00:00
Doxa Maps
fba3187cd4 Dev server: Plugin Studio and the leaf pages own the address too
The dev pages passed no urlOwner, so on the dev server a shell read ?tab=
but never wrote it: a clicked tab was lost on reload and a copied link
opened the first tab. The root page, every /__leaf/ page and the Studio
staging page now own the address, as the built leaves do. A framed leaf
(Studio iframes its map rows) stays unowned, so it never adds entries
to the top page's Back stack.
2026-10-03 05:39:23 +00:00
Doxa Maps
dc32000bfe Research Gallery dev page: it owns its address (urlOwner 'app'), so a tab pick writes ?tab=
The dev server serves plugin-designs/doxa-maps-spa/index.html as-is, with no
profile-config, so the shell read ?tab= there but never wrote it. The page is
ours: it now passes urlOwner 'app'. A partner's page still leaves it out.
2026-10-03 05:36:47 +00:00
Doxa Maps
ce1d3b6a46 Posterverse: the dev staging page owns its address
The staging page the dev server serves sets profile-config urlOwner 'app', so on
the dev server the shell writes the open tab to ?tab=: a reload keeps it and a
copied link opens it. Inside the Plugin Studio, Posterverse is nested and still
writes nothing (the Studio owns the address there).
2026-10-03 05:36:19 +00:00
Doxa Maps
789d90eb2f Merge commit '9c381b619e5596e3cc7c1909c242c4985c59712e' into poster-design-plugin/experimental 2026-10-03 05:33:11 +00:00
Doxa Maps
da14272f96 Merge remote-tracking branch 'origin/development' into regions-plugin/view-address 2026-10-03 05:33:02 +00:00
Doxa Maps
1118219bd5 Merge Plugin Studio's view address and the generated pages' urlOwner (shareable pages P1) 2026-10-03 05:27:34 +00:00
Doxa Maps
7d7ae092b3 Merge the Posterverse shell's view address (shareable pages P1) 2026-10-03 05:27:33 +00:00
Doxa Maps
8c674c0447 Posterverse: don't overwrite a link to a tab that arrives with the manifest
The first-paint write is skipped when the address names a tab the shell
doesn't know yet (a row that only resolves once the manifest is in). Writing
tab 0 there would replace the link before applyManifest could honour it;
applyManifest's own first-paint replace writes the honoured tab.
2026-10-03 05:26:59 +00:00
Doxa Maps
4241609572 Plugin Studio: the open tab is in the address, so a reload keeps it and a sent link opens it
Plugin Studio read its tab from #<bundle/profile> or from localStorage, and
never wrote it, so a reload worked for one reader but a sent link did not. It
now writes the view address through useViewAddress: ?tab=<bundle>__<profile>
(a row key's "/" is not a plain id; the double underscore keeps a sent link
meaning one row even if another bundle later adopts the profile's name). A
reader's tab click is a push, the first paint a replace, and Back/Forward
re-open the named tab without writing. route() reads ?tab= first (or a bare
profile name while it names exactly one row), then the old #bundle/profile
(rewritten to ?tab= on first paint, its hash dropped), then the remembered
tab, then the first row. The listener is removed before the hot-update return.

generate-tree bakes urlOwner 'app' into our own leaf pages only (never into an
embed snippet), and a framed leaf drops it at runtime, so a page embedded in a
partner's iframe reads its address but never adds entries to the partner's
Back button.
2026-10-03 05:26:13 +00:00
Doxa Maps
32cba5f8fe Posterverse: on a page it owns, the address's tab beats a baked config tab
When the shell owns the address, a reload or a shared ?tab= now wins over a
profile-config tab, so the first-paint replace can never overwrite a sent link
with the default. Elsewhere the order is unchanged (attribute, config, URL).
2026-10-03 05:25:36 +00:00
Doxa Maps
f0c97577e3 Research Gallery: the tab is in the page address (shareable pages P1)
A reader's pick in the rail writes ?tab= through useViewAddress as a push,
so a reload keeps the tab, a sent link opens it, and Back returns to the
previous tab. Only the address owner writes: urlOwner 'app' writes history,
'host' gets a dxm-address event for its router, and a partner's page is
never written. Programmatic switches (the manifest's re-select, the device
fallback, a host's tab attribute, Back/Forward) write nothing, and there is
no first-paint write. Back/Forward re-open the tab the address names on a
page that owns its address. ?tab= is read through readViewKeys.
2026-10-03 05:25:14 +00:00
Doxa Maps
86f1c1a463 Posterverse: the open tab is in the page address
The shell reads ?tab= through the shared view-address helper and writes the
open tab back through it: a reader's choice is a push, first paint a replace,
and Back / Forward re-apply the tab without writing. Only the address owner
writes (urlOwner 'app' on our own pages, 'host' hands the change to a host's
router, absent on a partner's page = read only), so a reload keeps the tab
and a sent link opens it.
2026-10-03 05:24:16 +00:00
Doxa Maps
8b30be2481 Merge commit '1d8f5f1cc' into poster-design-plugin/experimental 2026-10-03 05:10:30 +00:00
Doxa Maps
2717d0ffe7 Merge remote-tracking branch 'origin/development' into wall-of-people-groups-plugin/work 2026-10-03 05:07:07 +00:00
Doxa Maps
ffd85f0590 Wall of People Groups: every verse says "the LORD", from the World English Bible British Edition
Every verse now comes from one translation, the WEB British Edition (public domain), which reads "the LORD"
(the WEB reads "Yahweh"). Every text was re-checked verbatim against it (bible.helloao.org eng_webpb), 31 of
31 matching; the check found three mid-sentence names written with the sentence-start placeholder ("says the
LORD of Armies", "Now the LORD said", "as the LORD had told him") and the British spellings (towards, honour,
offence, amongst, marvellous). The credit line names the one translation.
2026-10-03 05:07:07 +00:00
Doxa Maps
1d8f5f1ccd Merge remote-tracking branch 'origin/development' into regions-plugin/no-country-posters-tab 2026-10-03 04:33:34 +00:00
Doxa Maps
1e53b531b0 Poster Design draws UPG100's zone posters, from a library copy of UPG100's zone code
UPG100's zone-poster code lived only inside its plugin, so Poster Design
(which draws from the library) could list UPG100's posters but never show
them. It is now COPIED, unchanged, into library/packet/upg100Zones/
(zone-sheet-print, zone-sheet, legend-tree, selector-evaluator,
zone-geometry, zones-for-list, clusters.json; only the library import paths
are shorter). UPG100's own files are untouched.

Poster Design adds a UPG100 zone posters family drawn from that copy with a
real zone (middle-east-core) and all the records, as UPG100's own wall
does: the letter, 3 x 3 and 3 x 4 zone posters under UPG100's own design
names (so the drawn card replaces the no-preview plugin card), and the
prayer packet's page 1 (the full letter zone poster). Keys in 11 locales.

check:upg100-zone-copy (in gates:pre) keeps the copy equal to UPG100's
originals beyond the import paths; once UPG100 switches to the library copy
and deletes its originals it becomes a one-path gate. Its self-test proves
a one-character edit, a changed clusters.json, a missing file, a half
switch and a re-definition each fail. check:poster-design-catalogue allows
a template to carry a plugin's design name only when it declares that
plugin (poisoned). Source only: poster-design is rebuilt when the heavy
slot reopens.
2026-10-03 04:26:50 +00:00
Doxa Maps
c6abc67706 Merge the pilot (development 1fa35309a) into wall-of-people-groups-plugin/work
The four Wall sources both sides changed (blessPoster.js, wall.css, wallCanvas.js, check-wall-no-bg-photos.mjs)
merged without conflict: the pilot's side is the comment-only privacy rewording of those files (c1a2f3698); both
sides are kept (no agent names; every branch change present). The generated files (the wall bundle, its leaf page
and the two manifests) were taken from the pilot and rebuilt from the merged source, then fix:sri and the tree.
2026-10-03 04:20:24 +00:00
Doxa Maps
e043402006 Poster Design: production designs first; experimental ones in a collapsed group
Styles now lists the production designs by family, and puts every
experimental design last, in one Experimental (in progress) group that
starts collapsed (a click opens it). Experimental: the side-lane country
sheets (66x66, 36x60, and 60x96, still being designed), the map print (no
preview: it prints the live map), and every other plugin's design (made by
its own plugin, so not drawn here). templates.js marks them experimental;
posterDesign.family.experimental is new in all 11 locales.
2026-10-03 04:19:37 +00:00
Doxa Maps
0777bd6d1c Regions dashboard: two views again, Regions List and Region Dashboards; the Country Posters view and its profile are removed (the list's per-region country posters stay) 2026-10-03 04:17:42 +00:00
Doxa Maps
e380ab8cbb 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).
2026-10-03 04:13:07 +00:00
Doxa Maps
547760b512 Re-add upg100's posterDesign block to its poster-wall meta, on the pilot's new label
The three upg100-territory-poster designs (2759ff493), unchanged, on top of
the pilot's renamed label. Tree and SRI regenerated.
2026-10-03 00:58:39 +00:00
Doxa Maps
69510aae86 Merge the pilot (development) 1fa35309a into poster-design-plugin/size-labels
Conflicts resolved by taking the pilot's side: upg100's
my-upg-100-list/poster-wall.meta.json (its new label) and the generated
files (regenerated). upg100's posterDesign block is re-added in the next
commit.
2026-10-03 00:58:33 +00:00
Doxa Maps
daa757d972 No India tab on the pilot by dev mode alone: the India preview (its tab and its whole-country poster) needs an explicit opt-in too, ?preview=india or localStorage 'dxm-preview', and every built bundle still compiles the whole read away. The gates hold the opt-in and that dev mode alone stays withheld. 2026-10-03 00:20:35 +00:00
Doxa Maps
424ef6f8a4 UPG-100 poster previews and stored posters regenerated with the UPG100 List name: the 28 card thumbnails, the 28 downloads and the 28 published poster sources
bun run posters (SPARSE 3x3, POSTER_DATE 2026-10-02, the offline records cache), posters:shoot, posters:previews,
publish-html. 'List of 100 UPG' left in the zone sources: 0; 'UPG100 List' in all 28.
2026-10-02 21:49:54 +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
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
d329a3a612 Posterverse: the Bless India Posters rail label is the plugin's own title
The rail row now uses the plugin's own title in all 11 locales, copied from its
catalogue (blessIndiaPosters.title), so the rail and the plugin name it the same
way. Copied rather than read at runtime: naming that catalogue area from the
shell would ship the plugin's whole catalogue inside posterverse.js.
check:posterverse-shelf arm F asserts the two stay equal in every locale; its
self-test plants a drifted label.
2026-10-02 19:08:38 +00:00
Doxa Maps
6e6afb1499 Research Gallery: a short rail name for Gospel × Internet in 11 languages
The Experimental row showed the titleized id ("Gospel Internet") in every
language: tabLabel() translates a discovered tab only when strings.js has
'tab.<id>', and the manifest carries no title. Add 'tab.gospel-internet'
after 'tab.bless-india-posters' in each locale, with the plugin's own
strings. Rebuilt the gallery bundle; it differs from the pilot's only by
these 11 strings.
2026-10-02 18:45:39 +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
d63951cf39 Merge remote-tracking branch 'refs/remotes/origin/development' into deep-research/bless-india-label 2026-10-02 18:08:26 +00:00
Doxa Maps
421a13edc8 Gallery: Bless India Posters' Experimental row takes the plugin's own title in every language 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
44ca332b65 Merge remote-tracking branch 'origin/development' into reg-post/bless-india-posters 2026-10-02 16:53:19 +00:00
Doxa Maps
824a7ef2c2 Fix Bless India asset base: resolveAssetsBase(profileConfig) not runtime deriveTreeBase
deriveTreeBase() called inside build() returned '' (document.currentScript is
null by then), so the India boundaries loaded from /assets (the host's HTML
page) and the poster failed with 'Unexpected token <'. Use the house helper
resolveAssetsBase(profileConfig): the shells pass an absolute assetsBase, and
the standalone leaf falls back to the bundle's own tree root (import.meta.url,
captured at load). Verified: the leaf draws the 3-sheet poster, 0 errors.
2026-10-02 16:52:55 +00:00
Doxa Maps
6d4ce5129b Posterverse: Bless India Posters is in the tree, so composes declares it
The bless-india-posters bundle is now on the pilot branch, so its Experimental
row is no longer provisional and posterverse.meta.json composes it.
2026-10-02 16:40:24 +00:00
Doxa Maps
00dbf9a79b Posterverse: a Bless India Posters row in Experimental, and unpinned mounting for scroll pages
The Experimental folder gains a bless-india-posters row, provisional until
its bundle is in the tree (a missing bundle prunes the row, so nothing shows
before it lands), with its label in all 11 locales. Its root is a
natural-height page of poster cards, so a row may set scroll: the element is
then mounted unpinned at its natural height and the pane scrolls it, instead
of being pinned to the pane, which would trap the page's own content.
check:posterverse-shelf expects the row and the scroll set by name; its
self-test drops the row and drops the flag.
2026-10-02 16:40:24 +00:00
Doxa Maps
01197e2121 Merge remote-tracking branch 'refs/remotes/origin/development' into deep-research/bless-india-shelf 2026-10-02 16:35:57 +00:00
Doxa Maps
174385d75e Gallery: Bless India Posters mounts at natural height when it joins Experimental 2026-10-02 16:27:53 +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