Commit graph

4284 commits

Author SHA1 Message Date
Doxa Maps
d446298bc7 PosterWall: sectionItemCountKey, so one section can be counted in its own words
The Country Posters India section headed "855 people groups · 37
countries", which is untrue: its cards are India's own and one per state
and union territory. sectionItemCountKey (default null: every section
counted with item-count-key, as before) lets a wall answer, per section,
an i18n plural key, or { key, n } to count n rather than the section's
card count, or null to keep the default.

Walls that do not pass it render byte-identical trees before and after
(a differential render of an upg100-style and a country-posters-style
wall). check:poster-wall-host-seams arm K: a named section counts in its
own key and number, an unnamed one keeps the default; it fails with the
prop ignored.
2026-10-01 05:03:50 +00:00
Doxa Maps
7bf579b763 Poster Design: Styles counts its sections in templates
The Styles wall passes item-count-key="posterDesign.templateCount", so a
section head reads "4 templates" where it read "0 people groups · 4
lists".
2026-10-01 00:57:27 +00:00
Doxa Maps
c5077538b6 i18n posterDesign: templateCount, the plural for a section of poster templates
"{n} template | {n} templates" in each locale's own plural forms (the
same form counts and order as regions.countryCount), so Poster Design's
section heads count templates rather than lists. check:plural-forms
passes.
2026-10-01 00:57:27 +00:00
Doxa Maps
c51bc8bf44 PosterWall: a section head names its people-group total only when there is one
A section head read "<n> people groups · <items>" always, so a wall whose
cards count no people (Poster Design's gallery of templates) showed
"0 people groups · 4 lists" on every head. The total and its " · " now
leave together when the total is 0, the rule the cards already follow with
v-if="item.count". The head is still one string in one interpolation, so a
section with a total renders exactly the text it always did, whitespace
included: a differential render of an upg100-style wall and a
country-posters-style wall, before and after, gives identical trees.

check:poster-wall-host-seams gains arm J (a head with people keeps its
total; one without reads its items alone); the old head line fails it.
2026-10-01 00:57:26 +00:00
Doxa Maps
eb5cf55d06 Country Posters: previews for the 34 India state and union territory posters
Each state's sheet drawn from live records with the browser's own inputs (SPARSE 3x3, the indiaState series, the
served boundaries and places), shot in the shared browser at 3000 px, and reduced by make-previews.py to the 560 px
card thumbnail and the 1500 px download, as the country previews are. Every record pinned; every layout octilinear.
2026-10-01 00:48:53 +00:00
Doxa Maps
5b33914614 Country Posters: India is its own section, first, above Asia, counted once
India's country card, its 34 state and union territory posters and the two with none listed now share one section,
headed by India's name and counted once (855, through PosterWall's sectionTotal), which puts it above every regional
section. One line at the top of the wall says why India is set apart. Asia keeps every other Asian country.
check:country-sheet-one-path ARM E: the wall passes sectionTotal, India's card is in the India section, PosterWall's
default is still the card sum, and over the real data India comes first with 855 (India 855 > Asia 454 > Africa 314).
2026-10-01 00:48:52 +00:00
Doxa Maps
0415324cbc i18n: the Country Posters India note in all 11 locales; the unused India heading key removed
countryPosters.indiaNote: India has its own section, first, because it has far more unreached people groups than any
other country (the count is filled from the data). ru and ar are phrased so the number needs no case agreement.
countryPosters.indiaStatesHeading is gone: the section is now headed by the country's own name.
2026-10-01 00:48:52 +00:00
Doxa Maps
78b2f108f2 PosterWall: an optional sectionTotal, so a section whose cards overlap counts its people groups once
A section's total (its header count, and what orders the sections) defaults to the sum of its cards' counts,
unchanged for every wall that does not pass the prop. The Country Posters India section holds India's own card
and one card per state and union territory (the same 855 groups twice), so it passes India's count instead.
2026-10-01 00:48:51 +00:00
Doxa Maps
01c390a929 Rebuild country-posters, my-upg-100-list, regions-dashboard and poster-design (India state posters: the indiaState series, the countryPosters area) 2026-10-01 00:24:41 +00:00
Doxa Maps
1e300309c8 Country Posters: one poster for each of India's states and union territories
The unfiltered wall gains an "India — states and union territories" section: 34 cards, one per state or union
territory with people groups listed (from the shared india-states table, fetched and sha-checked only when the
section is shown), each with its poster, prayer packet and cards. Nagaland and Mizoram get a card saying no
unreached people groups are listed there, so no division silently disappears. A host's filtered wall
(countries/region) is unchanged and never loads the table.

src/indiaStateSheet.js draws a state's sheet through ONE path: its records by slug, its outline from the
ADM1 boundaries the renderer already loads (matched on shapeName; the shared collection is copied, never
mutated), India's hue, and the indiaState series ("India State Maps", map N of 34). Show on map for a state
frames India, since the countries map draws countries.

check:country-sheet-one-path grows the state arms: inside this plugin only the helper calls generateSheet,
the wall must use makeIndiaStateSheet, and over the served table + ADM1 file: 36 divisions, the 34 with groups
numbered 1..34 each with an outline, the rest named, the ADM1 collection unmutated. Self-test 10/10.
Rendered headlessly through poster-render for Gujarat (90 pins), Lakshadweep (1), Andaman and Nicobar (9):
the state's name as title, "India State Maps", its series position, no country-series text, no "Province".
2026-09-30 23:33:34 +00:00
Doxa Maps
c58c7a7baf i18n: a countryPosters area, with the India states section's heading and no-people-groups line, in all 11 locales
countryPosters.indiaStatesHeading ("India — states and union territories") and countryPosters.indiaStateNoGroups
("No unreached people groups are listed here."), for the Country Posters wall's India section. A NEW AREA that only
country-posters names, not the shared `messages` area: that one reaches 20 built bundles, so two strings only this
wall shows would have rebuilt nearly the whole tree. Each locale reuses its catalogue's term for unreached people
groups (lists.unreached) and its standard name for India's states and union territories; never "provinces".
2026-09-30 23:33:34 +00:00
Doxa Maps
51524b7897 A poster series for India's states and union territories; series-isolation sees shared wording and poster text correctly
series.json: a new `indiaState` series, modelled on `country`, so a state poster names itself honestly
("India State Maps", "What is a State Prayer Map?", one sheet for each state and union territory of India,
"which state God has put on their heart"). The country series' text would have called Gujarāt one of the
~170 Country Maps. Approved as the default wording; shown as editable.

check:series-isolation, two blind spots found by adding a third series:
- Shared wording was dropped from only the EARLIER series (sets were mutated while still being compared),
  so the later one kept it as a fingerprint and the earlier failed for carrying it. The shared set is now
  found on the original sets. Self-test: three series in any order; the old loop fails it.
- The contamination scan never read a series' `poster` block, where a country poster once printed the
  UPG-100 side box. It does now. The phrases that NAME country and indiaState are hand-listed, so a
  verbatim copy of one's framing into the other is caught even though symmetric dropping treats it as shared.
  Self-test 9/9, including both directions of a country/state copy.

countrySheet.js: the seriesFor comment no longer says "map 1 of 0" was printed; it was latent (the map-only
packet page prints no series line, and the India poster is gated), as a rendered check showed.
2026-09-30 23:33:34 +00:00
Doxa Maps
3f7d489409 Merge remote-tracking branch 'origin/development' into poster-design-plugin/land 2026-09-30 23:12:35 +00:00
Doxa Maps
d58ffb6a71 Rebuild poster-design from the merged source (the shared country-sheet path) 2026-09-30 22:54:57 +00:00
Doxa Maps
1f2dc22cbd composite-interop: Poster Design has no cross-pane links, by design
Its two panes, Styles and Sizes, are independent views of the poster
templates; neither drives the other, so it gets a NO_LINKS entry with
that reason rather than invented links.
2026-09-30 22:54:56 +00:00
Doxa Maps
111c17d499 Poster Design: draw the sample country sheet through makeCountrySheet
The Styles tab called generateCountrySheet directly and built the country
without its region, so the sample would have printed in the old flat teal
while the Country Posters wall prints it region-hued. It now draws through
the one shared path (library/packet/countrySheet.js), which carries the
region and computes the series the way the wall does; the inline series
arithmetic is gone. check:country-sheet-one-path passes.
2026-09-30 22:54:56 +00:00
Doxa Maps
28cb482c79 Merge remote-tracking branch 'origin/development' into wall-of-people-groups-plugin/work 2026-09-30 22:49:32 +00:00
Doxa Maps
4129ad4bfd Build poster-design, regenerate the tree, SRI and the capability-exemplars table on the merged source
The composites both shells now name (doxa-maps-spa's Prayer Mobilization
row, posterverse's composes) resolve once poster-design exists, so the
tree is generated here, once, on the merged tree.
2026-09-30 22:42:56 +00:00
Doxa Maps
c8e02f70ff Rebuild posterverse for the confirmed Poster Design row
BUNDLE=posterverse vite build only. The tree (manifest, leaf pages, SRI) is NOT
regenerated here: generate-tree refuses the new composes ref until the
poster-design bundle is in the same tree, so the lander regenerates it once,
on the merged tree (bun run tree, then fix:sri).
2026-09-30 22:42:05 +00:00
Doxa Maps
0e069e5aaf Posterverse: Poster Design's ids are confirmed, and composes declares it
poster-design/poster-design-mfe is the id poster-design-plugin ships, so its row
is no longer provisional, and posterverse.meta.json composes it. This commit
must land in the SAME push as the poster-design bundle: without the bundle the
ref is unresolved (check:capability-derived) and check:posterverse-shelf fails
arm D; with the bundle and without this commit, arm D fails the other way.
2026-09-30 22:42:05 +00:00
Doxa Maps
7d3e744917 Rebuild doxa-maps-spa for the Poster Design row (the tree is regenerated once on the merged tree, where poster-design exists) 2026-09-30 22:42:05 +00:00
Doxa Maps
c394533fc8 Research Gallery: Poster Design joins Prayer Mobilization
Prayer Mobilization now reads Prayer Progress, UPG 100 List Posters, Country Posters, then Poster Design.
The row mounts the Styles + Sizes composite (bundle poster-design, profile poster-design-mfe), uses the same
tab id as the Posterverse shell, and carries the same label and subtitle in all 11 languages. As a curated
row it never appears on the Experimental shelf.
2026-09-30 22:42:05 +00:00
Doxa Maps
855e89db65 Poster Design: a new plugin with Styles and Sizes tabs
Every poster template the library prints, in one place, so the designs
can be compared side by side and handed to an agent by name.

- poster-design-mfe: the two-tab element (capability 4), the same shape
  as country-posters-mfe: the shared ViewSelect over Styles and Sizes,
  each tab its own element, one ShareButton for the composite.
- poster-styles: the library's PosterWall, one card per configuration
  (src/templates.js: country map sheets at each format, the packet page,
  the packet variants, every card stock, the Bless wall panels, the map
  print). Through PosterWall's host seams the header sticker reads "Show
  full details" and opens a dialog with the configuration name, size,
  file size, settings, sample and renderer, and each thumbnail is drawn
  from the library with sample data (Nepal) when it comes into view.
  Templates the gallery cannot draw yet say which part is missing. The
  dialog fits a phone (border-box), and in Arabic its file size and the
  configuration name stay whole (LRI…PDI isolates).
- poster-sizes: waits for the shared size table rather than keeping a
  second list of sizes.

check:poster-design-catalogue (gates:pre) keeps the catalogue true: its
sheet formats match poster-render FORMATS, names are unique, the card
entries are card-render STOCK, its keys exist, the sample can be drawn.
2026-09-30 22:42:05 +00:00
Doxa Maps
4500133abc i18n: the posterDesign area, in all 11 locales
The Poster Design plugin's own words: its two tabs, "Show full details"
(the label its cards' header sticker reads), the template families and
names, the notes for templates the gallery cannot draw yet, and the
details dialog. A new area file, so only a bundle that names
posterDesign carries it; every other bundle's output is unchanged.
2026-09-30 22:41:20 +00:00
Doxa Maps
7303483fd2 Rebuild posterverse and regenerate the tree
BUNDLE=posterverse vite build, then bun run tree and fix:sri. Only the
posterverse entry changes in the manifest (its composes drop to three).
2026-09-30 22:35:34 +00:00
Doxa Maps
68ba3b3402 Posterverse: poster plugins only
UPG Neighbor and All People Groups leave the Experimental folder: they are
research maps, and Posterverse holds the plugins whose purpose is posters.
Experimental is now Wall of People Groups (and Bible Posters once it exists).
Their labels, composes refs and heavy-tag entry go with them; the shelf gate's
allow-list and its self-test follow. The Research Gallery is unchanged.
2026-09-30 22:35:34 +00:00
Doxa Maps
7f2dec8600 Wall of People Groups: the Bless poster takes the house poster style, full width, with nothing clipped
The poster now reads like the UPG 100 List posters (poster-render's approved template):
- warm paper, hairline rules instead of black boxes and sidebars, Georgia for the title and the scripture;
- the sans for names and labels, tracked capitals for the small labels, and the purple ink for every
  scripture reference;
- a quiet boxed centrepiece in the journey.
The screen canvas draws the same paper and ink, so the wall still shows what prints.

Layout:
- The header, the chart, the grid and the footer share ONE full content width and ONE inner padding, so
  text edges and rules line up. The subtitle, the blessing's intro lines and the closing line no longer
  wrap inside an 80% column.
- The grid's spare height is shared equally above and below it (it pooled as one gap above the footer),
  and a gap now separates the chart from the first row.

Fixed, measured on the print in en and ar at every size (0 clipped text blocks, was 12-15):
- the Old/New Testament rail labels overran their rows;
- the longest verse cell overran its row (the chart's verse size now fits its longest cell);
- the title's descenders were clipped;
- two real names were cut by the line clamp (0 of the live 2,107 now): a name's lines are counted by
  whole words, and a long name may take four lines at the floor size.
2026-09-30 22:32:56 +00:00
Doxa Maps
3060619d93 Merge origin/development into studio/fake-token 2026-09-30 22:29:31 +00:00
Doxa Maps
ce93047669 Rebuild the PosterWall carriers and the wall (country-posters, my-upg-100-list, regions-dashboard, wall-of-people-groups) from the merged source, and regenerate the tree and SRI 2026-09-30 22:25:46 +00:00
Doxa Maps
1d2b29d6b5 Merge origin/development into studio/land-pd-seam 2026-09-30 22:23:58 +00:00
Doxa Maps
ca9d210d8c Universal-props gate: the planted token sample is assembled at runtime, not committed as a literal
The TOK-LITERAL self-test planted a string shaped like a real Mapbox token,
which is itself what the rule forbids and reads as a leaked credential to any
secret scan. The sample is now built at runtime from plainly fake parts
('example', 'not-a-token') in the same pk. + base64url + tail shape, so the
self-test still proves the rule fires, and no token-shaped literal is left in
the tree.
2026-09-30 22:22:09 +00:00
Doxa Maps
d81a6ab924 Merge remote-tracking branch 'origin/development' into upg100/india-states 2026-09-30 22:19:42 +00:00
Doxa Maps
85c435be06 PanelSheets: a plain style id, and the library index lists the new poster files
The shadow-styles id must be a plain lowercase identifier (check:shadow-css-parses
reads anything else as a CSS rule concatenated onto the id), so 'PanelSheets'
becomes 'panel-sheets'; nothing imports the component yet. The derived library
index gains panelSheets.js and PanelSheets.vue.
2026-09-30 22:18:46 +00:00
Doxa Maps
323283a43c Merge origin/development (32715a5cc) into upg100/india-states; package.json keeps both sides' gates; rebuild my-upg-100-list from the merged source, and regenerate the tree and SRI 2026-09-30 22:17:44 +00:00
Doxa Maps
4267689211 Rebuild the PosterWall carriers and the wall from the combined source, and regenerate the tree and SRI 2026-09-30 22:13:07 +00:00
Doxa Maps
e4b2bbb47d Capability exemplars: list posterverse (26 bundles)
bun run capability-exemplars on the current tree. The posterverse bundle landed
without regenerating this table, so check:capability-exemplars (gates:post)
reported that the table disagrees with the manifest. Doc only; no bundle.
2026-09-30 22:11:45 +00:00
Doxa Maps
3f23274a30 Merge origin/development (f8de00edf) into upg100/india-states; package.json keeps both sides' gates; rebuild my-upg-100-list from the merged source, and regenerate the tree and SRI 2026-09-30 22:11:30 +00:00
Doxa Maps
356e1063dd Merge PanelSheets (wall-of-people-groups-plugin/work, 3ee5ed9fd..f5ec4a180) with the PosterWall host seams, for one capture 2026-09-30 22:09:52 +00:00
Doxa Maps
f5ec4a1809 PanelSheets: say that sheets are numbered from 0, in the docs and in sliceFor's error 2026-09-30 22:08:23 +00:00
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
32715a5cc4 Rebuild country-posters + regions-dashboard (one country-sheet path) 2026-09-30 22:00:39 +00:00
Doxa Maps
b0d0fcaf91 seriesFor: state that every no-sheet country shares one series, and gate it
A second country without a sheet size would silently join India's oversized
series and print India as "map 1 of 2". The comment now says so, and
check:country-sheet-one-path fails when more than one country has no sheet,
naming them, so that change is a decision rather than drift. Its self-test
plants a second one (China) and requires the arm to fail.
2026-09-30 21:57:25 +00:00
Doxa Maps
ffbb07e4a4 Country Posters wall draws its sheets through makeCountrySheet
The wall had its own inline wrapper around generateCountrySheet, a second
copy of @map/packet/countrySheet.js, which the Regions tab uses. Two copies
of one wrapper drifted twice (a teal Regions print, then India's series). The
wall now calls makeCountrySheet with the same country list, still handing it
the data's own English record rather than the localized card.

Behaviour: identical sheets for every country with records; a country whose
records come back empty now yields no sheet (the wall falls through to its
stored preview), as the Regions tab already did.

check:country-sheet-one-path (in gates:pre, with a self-test) parses every
plugin source: a direct generateCountrySheet call fails, every
makeCountrySheet call must pass the series list, both known callers must be
found, and seriesFor gives named answers over the real data (India 1 of 1,
each 3x3 country N of 173, an absent code no series). It fails on
development c4655072a for all three defects.
2026-09-30 21:57:25 +00:00
Doxa Maps
ea9211a5f9 seriesFor: India (sheet null) is its own 1-of-1 series
seriesFor skipped any country without a sheet size, so India's packet page 1
from the Regions tab printed "map 1 of 0", while the Country Posters wall's
own inline copy printed "map 1 of 1". A null sheet is now a tier like any
other. A country absent from the list (a host's code with no poster) still
gets no series, so the renderer keeps its default rather than a made-up
position.
2026-09-30 21:56:56 +00:00
Doxa Maps
47a856c144 Merge origin/development (939db5b6c: P0 landed, posterverse, csv-guard) into upg100/india-states; 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:49:47 +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
e4265b213f Rebuild my-upg-100-list from the merged source (India's states in batch selection), and regenerate the tree and SRI 2026-09-30 21:35:13 +00:00
Doxa Maps
ba8dfad628 UPG-100 batch selection: an India state or union territory now finds its people groups, from the served states table (fetched only once a state is selected, warmed on selection); China's provinces stay named as missing until they have a table. The gate asserts the wiring 2026-09-30 21:33:43 +00:00