Commit graph

4231 commits

Author SHA1 Message Date
Doxa Maps
332aa002f8 Wall of People Groups: the Bless poster takes its sheets, glue bands and marks from PanelSheets, byte for byte
blessPoster.js now plans its 5 x 8 ft sheets, finished size, screen layout, glue band, trim line and sheet
tags through library panelSheets.js instead of its own copy. The print HTML, the screen layout and the plan
are unchanged: hashed for 3 presets and the default in all 11 locales (44 cases), before and after, all
identical; a 0.001 in change to the glue label moves all 44.

check:panel-sheets (gates:pre, headless) pins both geometries (60x96 stacked, 66x66 side by side, one
sheet; glue and bleed):
- the sheets tile the finished poster;
- glue slices tile it, and bleed slices repeat exactly the join;
- a bleed join prints a guide, not a solid band, and a screen preview always shows the red band;
- the Bless 5x8ft takes its bands and marks from the module.
It is two-sided: 4 planted defects are caught, and the Bless arm fails on the old private copy.
2026-09-30 22:03:40 +00:00
Doxa Maps
3ee5ed9fde PanelSheets: one shared geometry for posters printed on several sheets, and a preview that shows how they join
A poster too big for one sheet prints as several, each trimmed edge laid over the next sheet's join band:
60x96 is three 60 x 36 in sheets stacked with 6 in joins (the Bless 5 x 8 ft wall), 66x66 two 36 x 66 in
sheets side by side with a 6 in join (India). library/components/poster/panelSheets.js is pure:
- planPanels(sheets) takes the size table's sheets object as is (sheetW, sheetH, count, direction, joinIn),
  plus the renderer's borderIn and joinFill;
- sliceFor(plan, s) gives the part of the finished poster that sheet s prints, one page per sheet;
- screenLayout, panelChromeHtml and panelCss give the sheets pulled apart and the marks.
A 'glue' join leaves the band blank and marked red; a 'bleed' join lets a map continue under it, so a
trim a few millimetres off shows map, never a white seam, and only a guide is printed there.

PanelSheets.vue previews it for Vue surfaces:
- a src (the finished poster as one image) sliced per sheet with CSS, or a #sheet slot;
- it fills its container's width, takes no pointer events, and emits one load or error per src;
- it always draws the red glue band and the gap, even for a print that bleeds.
Its label is poster.glue_here, new in all 11 catalogues.
2026-09-30 22:03:40 +00:00
Doxa Maps
f8de00edf7 Merge remote-tracking branch 'origin/development' into wall-of-people-groups-plugin/work
# Conflicts:
#	package.json
2026-09-30 21:47:28 +00:00
Doxa Maps
939db5b6c7 Merge origin/development (e9805a5c8: csv-guard, posterverse) into upg100/batch-select; package.json keeps both sides' gates; rebuild my-upg-100-list from the merged source, and regenerate the tree and SRI 2026-09-30 21:42:50 +00:00
Doxa Maps
e9805a5c87 Build posterverse and regenerate the tree
BUNDLE=posterverse vite build, then bun run tree and fix:sri. The manifest
gains the posterverse bundle only (plus the bundle and profile counts); the
Research Gallery's CORS-readable copy stays byte-identical to it.
2026-09-30 21:32:51 +00:00
Doxa Maps
5a6b226a19 Posterverse: a capability-5 app shell for every poster plugin
<posterverse-app> is a vertical-tab rail of whole poster plugins, each mounted
as its real element from the manifest: UPG 100 List Posters (upg-100-mfe),
Country Posters (country-posters-mfe), Poster Design, and an Experimental
folder of Wall of People Groups, All People Groups, UPG Neighbor and Bible
Posters. It reuses VerticalTabsLayout, loadScriptOnce/whenTagDefined and the
Research Gallery's profile-config contract (urlSync:false, mapTitle, token
ladder, treeBase, assetsBase).

The whole rail is an allow-list (src/tabs.js), so a gated plugin such as
key-cities can never appear. Rows whose bundle is not in the tree are pruned;
Poster Design and Bible Posters carry provisional ids until their bundles land.
meta.json declares nested-mfe-spa and composes the five rows that exist, so
the Plugin Studio lists it under capability 5.

check:posterverse-shelf (in gates:pre) asserts the allow-list, the key-cities
exclusion, composite-not-leaf resolution, composes/rail agreement and
11-locale string parity; --self-test plants one defect per arm.
2026-09-30 21:32:51 +00:00
Doxa Maps
db1e6c978f Wall of People Groups: the wall pans and zooms with the pointer, 1:1
d3-zoom on a canvas reports its transform in the canvas's own CSS px, but the renderer applied it inside
the "meet" fit (a leftover from the SVG, whose viewBox made it world units). Every pan therefore moved
the wall by only the fit scale: a 200 px mouse drag panned 34 px at 1440, a 120 x 200 px finger drag
14 x 23 px on a phone, and a wheel zoom drifted about 90 px off the pointer. The transform now applies
after the fit, in Bless and Social mode alike.

Also: a trackpad pinch (ctrl-wheel) zooms the wall instead of falling through to a browser page zoom,
with a capped step; and a fling can no longer leave an empty table (the wall always covers the centre
of the view). check:wall-pan (gates:pre) runs the real WallCanvas methods with d3's transform
arithmetic and catches the old formulas.
2026-09-30 21:29:56 +00:00
Doxa Maps
2bf2607fca Rebuild my-upg-100-list for Copy's machine-name line, and regenerate the tree and SRI 2026-09-30 21:19:36 +00:00
Doxa Maps
56b53c2a92 Rebuild the CSV exporters' composites (dashboard-plus-grid, research-dashboard), and regenerate the tree and SRI 2026-09-30 21:19:19 +00:00
Doxa Maps
307feab55c UPG-100 batch selection Copy: line 1 is a machine contract, so it carries the names apply-grouping resolves in every UI language (a country as its ISO3, a state as its shape name); the reader's names stay on line 2, in the HUD and the CSV. The gate runs apply-grouping's own dry run on an Arabic selection, with a negative control 2026-09-30 21:19:02 +00:00
Doxa Maps
bc3a5029a6 Tab-radius gate: find Collapse's rule inside a selector list
The home link joined Collapse's rule (.vtl-collapse, .vtl-home { … }) so the
two share one box, and the gate only recognised a rule that named
.vtl-collapse alone, so it found no reference and failed on development. It
now reads the reference from any rule whose selector list names
.vtl-collapse as a whole selector (not :hover, -tx or a descendant), and its
self-test gains a poison that moves only that rule's radius.
2026-09-30 21:17:42 +00:00
Doxa Maps
b138c876d5 CSV exports: a value starting with TAB or CR is neutralised too, and the gate asserts it
esc() prefixed a single quote to a value starting with = + - @, but OWASP's
formula triggers also include a leading TAB and CR, which a spreadsheet can
strip before reading the = behind them. Every map's CSV export shares this
escaper. The shape gate carried a formula probe but never checked it came
back neutralised; it now does, for =, TAB and CR, by slug.
2026-09-30 21:09:29 +00:00
Doxa Maps
e7fe0504ef Rebuild my-upg-100-list for the CSV guard, and regenerate the tree and SRI 2026-09-30 21:05:38 +00:00
Doxa Maps
ee955bac5a UPG-100 batch selection CSV: also neutralise a leading TAB or CR (OWASP's full list of formula triggers), asserted by the gate 2026-09-30 21:04:51 +00:00
Doxa Maps
6e1a335343 Merge origin/development into studio/legend-baseline 2026-09-30 21:02:17 +00:00
Doxa Maps
03af1d87b5 Merge origin/development (8d968ed0d, slot 2) into upg100/batch-select; rebuild my-upg-100-list from the merged source, and regenerate the tree and SRI 2026-09-30 20:55:38 +00:00
Doxa Maps
0f824f24cf UPG-100 batch selection: release Copy / Export CSV's last-text hooks with the map's other window hooks on unmount 2026-09-30 20:54:55 +00:00
Doxa Maps
8c75220222 Legend-source gate: the baseline follows the live corpus again (2078 unengaged, 29 engaged)
One more people group moved from Unengaged to Engaged upstream; the total is
still 2107. The maps compute from the live rows and already show the new
split (read on Prayer Progress's engagement legend), no shipping code
hardcodes the totals, and the live endpoint was read independently, so only
this baseline lagged.
2026-09-30 20:54:22 +00:00
Doxa Maps
c4655072ab Merge remote-tracking branch 'origin/development' into deep-research-plugin/hostslot 2026-09-30 20:53:36 +00:00
Doxa Maps
76f9b6419f Rebuild my-upg-100-list for the batch selection's recolour, Copy and Export CSV, and regenerate the tree and SRI 2026-09-30 20:53:19 +00:00
Doxa Maps
dd913f7269 UPG-100 batch selection: recolour, Copy and Export CSV are back. The colour swatches return; Copy puts the territory line apply-grouping parses first, then the selection's people groups as CSV; Export CSV downloads the same CSV. One detection feeds every action, prefetched when batch mode opens so a tap copies from cache. New gate check:batch-selection-export (gates:pre) 2026-09-30 20:53:19 +00:00
Doxa Maps
8d968ed0d0 Rebuild the phone-placement bundles from the merged source, and regenerate the tree 2026-09-30 20:47:21 +00:00
Doxa Maps
9f1135a86f Regenerate the tree and SRI after merging development 2026-09-30 20:42:58 +00:00
Doxa Maps
ca162fff89 Merge origin/development into studio/lm-fold-lip 2026-09-30 20:42:46 +00:00
Doxa Maps
2ec8a3cb3e Merge remote-tracking branch 'origin/development' into deep-research-plugin/hostslot 2026-09-30 20:41:34 +00:00
Doxa Maps
a9893fedb3 Rebuild regions-dashboard country-posters from the merged source in the lock 2026-09-30 20:38:30 +00:00
Doxa Maps
05e0dfbdfc Merge remote-tracking branch 'origin/development' into regions/slot5
# Conflicts:
#	public/dx-maps/country-posters/countries-map/index.html
#	public/dx-maps/country-posters/country-poster-wall/index.html
#	public/dx-maps/country-posters/country-posters-mfe/index.html
#	public/dx-maps/country-posters/country-posters.js
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/regions-dashboard/region-dashboards/index.html
#	public/dx-maps/regions-dashboard/regions-dashboard.js
#	public/dx-maps/regions-dashboard/regions-list/index.html
#	public/dx-maps/regions-dashboard/regions-mfe/index.html
2026-09-30 20:37:28 +00:00
Doxa Maps
b63a918db1 Merge remote-tracking branch 'origin/development' into upg100/wall-menus 2026-09-30 20:32:59 +00:00
Doxa Maps
18e4c6d7c5 Rebuild regions-dashboard and country-posters from the merged source 2026-09-30 20:26:33 +00:00
Doxa Maps
e21798b6b3 Merge remote-tracking branch 'origin/development' into regions/slot5
# Conflicts:
#	public/dx-maps/country-posters/countries-map/index.html
#	public/dx-maps/country-posters/country-poster-wall/index.html
#	public/dx-maps/country-posters/country-posters-mfe/index.html
#	public/dx-maps/country-posters/country-posters.js
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/regions-dashboard/region-dashboards/index.html
#	public/dx-maps/regions-dashboard/regions-dashboard.js
#	public/dx-maps/regions-dashboard/regions-list/index.html
#	public/dx-maps/regions-dashboard/regions-mfe/index.html
2026-09-30 20:25:36 +00:00
Doxa Maps
b8ef93a416 Merge remote-tracking branch 'origin/regions/embed-popup' into regions/slot5
# Conflicts:
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/regions-dashboard/region-dashboards/index.html
#	public/dx-maps/regions-dashboard/regions-dashboard.js
#	public/dx-maps/regions-dashboard/regions-list/index.html
#	public/dx-maps/regions-dashboard/regions-mfe/index.html
2026-09-30 20:25:33 +00:00
Doxa Maps
8a96eee231 Merge origin/development into gospel/legend-over-controls 2026-09-30 20:22:13 +00:00
Doxa Maps
dc6fa1fcca Rebuild doxa-maps-spa and plugin-studio for the rail's home link, and regenerate the tree 2026-09-30 20:17:02 +00:00
Doxa Maps
f18aff662b Research Gallery: a "Back to homepage" link above Collapse, and the poster rows in Prayer Mobilization
The tab layout takes an optional homeHref and homeLabel from its host. When a URL is given it draws a
link directly above the rail's Collapse button, in the same box, and a phone shows it at the top of the
drawer. It mirrors in Arabic and slims with the rail. With no URL nothing changes, so the Plugin Studio
and every other host look exactly as before. A javascript:, data: or vbscript: URL is ignored.

The gallery accepts home-href and home-label (or profile-config homeHref and homeLabel) and passes them
on; its own "Back to homepage" is the fallback label in all 11 languages.

Prayer Mobilization now reads Prayer Progress, UPG 100 List Posters (renamed in all 11 languages), then
Country Posters, which mounts its composite view and leaves the Experimental shelf. Posterverse, the
second shell, is kept off this shelf so a shell never opens inside a shell.
2026-09-30 20:16:15 +00:00
Doxa Maps
6c1371789d Rebuild country-posters, my-upg-100-list and regions-dashboard from 2b2661c47 (the poster wall's section stacking), and regenerate the tree and SRI 2026-09-30 12:47:40 +00:00
Doxa Maps
2b2661c475 Poster wall: each section stacks above the ones after it, so the last poster's open Prayer-List or Card-deck menu sits over the next section's header instead of under it 2026-09-30 12:45:26 +00:00
Doxa Maps
fb11f1310d Rebuild gospel-resources for the province sheet's layer, and regenerate the tree 2026-09-30 12:42:55 +00:00
Doxa Maps
b4dd84c1b5 Rebuild the legend batch's bundles (LegendMobile + PinHint) from the merged source, and regenerate the tree and SRI 2026-09-30 12:42:41 +00:00
Doxa Maps
5b074c1b43 Gospel Resources: an open province sheet also counts as an open sheet 2026-09-30 12:39:29 +00:00
Doxa Maps
9b85b1c36d Region Dashboards: the country's poster card sits centred under its toggle, and its Show on map brings the country map back into view 2026-09-30 12:34:25 +00:00
Doxa Maps
01eaf09784 Merge the hint pill's touch-action (exp-shepherd/nine-pill) into the legend batch 2026-09-30 12:33:40 +00:00
Doxa Maps
04a97f604c Phones: the legend's credit folds on every map, and the open sheet has a grab lip
The credit fold was guarded by uiStore.isMobile, which only uiStore.init()
sets; a host that never calls it (UPG-100's map) kept the credit expanded.
The fold now tests the phone breakpoint itself, with the phone CSS block's
own query.

A finger aimed at the open sheet's top edge often landed on the hint pill
just above it, and a drag there scrolled the pane instead of resizing the
sheet. A transparent 12px lip above the open sheet takes that gesture with
the sheet's own handlers (their grab zone is measured from the sheet's top),
above the pill; it exists only while the sheet is open.
2026-09-30 12:33:39 +00:00
Doxa Maps
07915b5115 Region Dashboards: a country's view offers View country posters under its map, the Country Posters wall filtered to that one country, loaded on first open
Rebuilt regions-dashboard and country-posters (the wall's countries filter), then the tree and SRI.
2026-09-30 12:28:37 +00:00
Doxa Maps
6c9b844b8e Country Posters: the wall shows a host's countries, or one region, flat, on request
profile-config gains two optional keys for the country-poster-wall profile: `countries` (ISO-3 codes, or
{code, name, count} records, in the host's order) and `region` (one WAGF region as the data names it).
With either, the wall is flat: one section, nothing collapsed, two columns unless `columns` says otherwise,
no heading unless `heading` is given, because it sits under the host's own region heading. A requested
country with no poster keeps its card and says so in the regions catalogue's words. With neither key,
every binding is what it was, so the plain wall is unchanged. PosterWall itself is untouched; only the
country-posters bundle rebuilds. The usage lines in index.js and the profile's meta note name the keys.
2026-09-30 12:17:39 +00:00
Doxa Maps
4a1ca9eecb Rebuild cities-internet and gospel-resources for the legend's layer, and regenerate the tree 2026-09-30 12:16:40 +00:00
Doxa Maps
27ce3fe8db Gospel Resources and Cities with Internet: the legend sits above its map controls, and under an open sheet 2026-09-30 12:15:27 +00:00
Doxa Maps
eca1ecb4af Rebuild the five packet bundles from f963d90bc (the lightweight worksheet's photos and descriptions), and regenerate the tree and SRI 2026-09-30 12:06:08 +00:00
Doxa Maps
f963d90bc3 Packet: the lightweight worksheet shows every group's photo and short description too (a photo cell and a two-line description per row, 16 + 18 rows a page); the variant gate asserts both headless, the render gate counts the rows' photos and follows the new pagination 2026-09-30 12:04:20 +00:00
Doxa Maps
1ec43f2ece Pin hint: a drag that starts on the pill no longer scrolls the page
The pill takes touch-action:none. With the legend open it sits just above
the sheet's top edge, so a drag meant to resize the sheet often began on the
pill's lower edge and scrolled the pane instead. Taps still fire, so its
dismiss button keeps working.
2026-09-30 12:03:20 +00:00
Doxa Maps
fc463c82be Region Dashboards on phones: the people-group popup's card fills its compact box instead of overhanging it by 40px, and the name keeps clear of the close button 2026-09-30 12:03:07 +00:00