Commit graph

1757 commits

Author SHA1 Message Date
Doxa Maps
1fde892d4b UPG-100 batch selection: on a phone, a selection too big to print asks for a computer
Building a selection's Prayer list or Card deck is never the problem (the whole
selection is ready in under 30 s on a 4×-throttled phone). PRINTING it is: in a
browser capped at 2.5 GB, the print of 1,857 groups (101 sheets, a 138 MB PDF)
finished, and 2,209 groups (113 sheets) crashed the page at 1× and at 4×. A phone
tab has roughly half that memory, so above 1,000 groups (PHONE_GROUP_CEILING,
with the measurement beside it) a phone or tablet gets the house text
"This needs a desktop or laptop computer." (poster.phoneLimitAll, as Country
Posters shows for whole India) and nothing starts. India alone (905) still
prints on a phone. A desktop is never blocked. Copy and CSV stay allowed.

The device test is isPhonePrint(), the same platform test the print path uses.
check:batch-selection-export arm A7 tests the ceiling both ways. Arm C checks that
Prayer list, Card deck and Poster each ask BEFORE they print, and arm D checks
the string ×11. Four mutants each fail.
2026-10-01 12:08:38 +00:00
Doxa Maps
671295b5b1 Merge remote-tracking branch 'origin/development' into poster-design-plugin/b3-land 2026-10-01 11:07:05 +00:00
Doxa Maps
fd032702d2 Merge remote-tracking branch 'origin/development' into poster-design-plugin/b3-land 2026-10-01 10:53:34 +00:00
Doxa Maps
1df3f92d0d Merge origin/development (592397194) into studio/bible-push 2026-10-01 10:45:55 +00:00
Doxa Maps
65f3102ce4 Merge remote-tracking branch 'origin/development' into poster-design-plugin/b3-land 2026-10-01 10:38:55 +00:00
Doxa Maps
5923971946 Embed guide: the Nuxt form of the language listener, and carrying the open tab across a locale route 2026-10-01 10:34:51 +00:00
Doxa Maps
35742337fc Merge origin/development (6f9ab5498) into studio/bible-push 2026-10-01 10:26:54 +00:00
Doxa Maps
abdc5dfe61 Merge remote-tracking branch 'origin/development' into deep-research-plugin/lang-menu2 2026-10-01 10:22:23 +00:00
Doxa Maps
fd43836920 Poster Design: Styles draws the Bless wall panels from the shared panel geometry
wall.bless-panels drew nothing. It now draws the ladder's 5 x 8 ft size
(60x96: three 60 x 36 in sheets, 6 in joins) through panelSheets'
planPanels and screenLayout, the same plan the Bless print uses: the
sheets pulled apart, each join a red glue band with a dashed edge, a
banner on the first sheet, a footer on the last, and rows of portrait
cards inside each sheet's content box, never crossing a join.

The cards are a layout (src/panelsSvg.js): the Bless wall draws its real
cards in its own plugin, which the gallery cannot import. The card is not
offered for printing here.
2026-10-01 10:18:56 +00:00
Doxa Maps
6164cb6190 Poster Design: Styles draws the prayer packet and every card stock
The seven templates that showed 'preview unavailable' for the packet and
the cards now draw from the shared renderers with the Nepal sample:
- each card stock is the deck the wall prints (createCardRenderer with
  that stock, buildDeck), its first card the thumbnail;
- each packet variant is the packet renderer's page 1, its map page,
  built from the sample's map-only sheet as the wall's packet builds it.

src/pageThumb.js turns a document's first page into an image: it keeps
that page, re-serialises it as XHTML inside an SVG foreignObject and
returns it as an SVG image, which a plain <img> draws. Photos are inlined
only from the page's own origin; the people-group photo host sends no CORS
headers, so a card's photo frame stays empty in the thumbnail (the printed
deck still carries the photo), and no refused fetch reaches the console.

A card stock's print button prints its whole deck. A packet card is not
offered for printing here, since only its page 1 is built.
2026-10-01 10:18:55 +00:00
Doxa Maps
828fd22e86 Poster Design: the Sizes tab draws every ladder size to scale; the header's Share is a rounded square
Sizes reads the one shared ladder (POSTER_LADDER in POSTER_LADDER_ORDER)
and feeds each size's sheets straight into the library's PanelSheets, the
component the Wall uses for its 5 x 8 ft preview: multi-sheet sizes show
their sheets pulled apart with the red glue strip. A lineup draws every
size at one scale on one baseline, its scale fitted to the row's width so
a phone keeps every size in view. Each card also states the sheets, the
glued overlap, whether photos fit beside names, and how it prints.

The sheets carry the 3 x 3 ft country poster's layout at that size
(src/layoutSvg.js: header, map, names, table, scripture footer, no words),
labelled as a layout, since the renderer does not draw the large sizes
yet. Every size is sized from panelSheets' own screenLayout, so the fit
computed here is the box PanelSheets renders.

The composite header's Share button takes the header form
(shape="rounded-square"), as Big Picture's top bar does.
2026-10-01 10:18:32 +00:00
Doxa Maps
067979ae71 Posterverse: the shell language menu in the phone bar and at the bottom of the rail
Fills VerticalTabsLayout's #phone-end and #rail-end slots with the shared
ShellLanguageMenu. A pick first asks the host (doxa-language-request); only an
uncancelled pick reaches setLocale, which keeps the pick with the host language
value it was made over and saves it. The pick wins only while that value is
unchanged; a new value from the host takes over and drops the pick. The saved
choice is never read as a source, since it falls back to the browser's
language and would override the host page.
2026-10-01 10:17:26 +00:00
Doxa Maps
ccc3a038ea Bible Posters: the profile says what it is (its @description), and the capability exemplars list it 2026-10-01 10:08:05 +00:00
Doxa Maps
448ef0ac70 Merge development (a77a3280f: the shell header, the docs) into the whole-India landing
# Conflicts:
#	package.json
2026-10-01 10:02:25 +00:00
Doxa Maps
929d35f17f Research Gallery: the language menu in the phone bar and at the bottom of the rail
The gallery fills the tab layout's two new slots (the end of the phone bar, and the bottom of the desktop
rail) with the shared ShellLanguageMenu, showing the language in effect. The menu first asks the host with a
cancelable doxa-language-request. A host that takes it changes the language itself and sets `language`.
Otherwise the gallery switches on its own, and that pick holds over a `language` the host never updates, until
the host changes it. A saved choice never outranks the host page's own language. EMBED.md shows the listener.
2026-10-01 10:02:16 +00:00
Doxa Maps
56d9a111f6 Merge origin/development (a77a3280f) into studio/bible-push 2026-10-01 10:02:11 +00:00
Doxa Maps
88402cf272 Merge development (78a461588, Prayer Progress pin opacity) into the whole-India landing 2026-10-01 09:46:44 +00:00
Doxa Maps
d6950c0089 Merge remote-tracking branch 'origin/development' into repo/b13-docs 2026-10-01 09:46:43 +00:00
Doxa Maps
edda4017b3 Merge development (d6a53486f, UPG-100 wall count) into the whole-India landing
# Conflicts:
#	package.json
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/my-upg-100-list/my-upg-100-list.js
#	public/dx-maps/my-upg-100-list/poster-wall/index.html
#	public/dx-maps/my-upg-100-list/upg-100-list/index.html
#	public/dx-maps/my-upg-100-list/upg-100-mfe/index.html
2026-10-01 09:46:12 +00:00
Doxa Maps
838008b991 Desktop-only cards on a phone: the list, packet and cards say "This needs a desktop or laptop computer."
On a phone, India's Prayer List (Full detail, Lightweight) reported "that list has no people groups to print" on a
card of 855: its rows resolved [] and the print path read that as an empty list. Now, in the wall and the Regions
list alike, a desktop-only card's rows REJECT with the notice before any record is fetched, and the card shows the
same words: a new poster.phoneLimitAll ("This needs a desktop or laptop computer.", all eleven locales). The
existing "the largest sizes are off" stays for cards that are only partly blocked.
check:country-sheet-one-path arm F asserts it for both callers, with a poison for each.
2026-10-01 09:45:34 +00:00
Doxa Maps
2f163e04c1 Large side-lane sheets: photos print in the sheet's own document, and a raster never draws a broken image
Measured on the 60x96 print: every photo beside a name rasterised as the browser's broken-image glyph. An SVG
rasterised through <img> is an isolated document that fetches no external resource, and none of the people-group
photo hosts (media.joshuaproject.net, joshuaproject.net, images.peoplegroups.org and its resizer,
peoplegroupspublic.blob.core.windows.net, s3.doxa.life) sends CORS, so a photo cannot be inlined as data: in the
browser either.
- poster-raster.js: rasterPoster drops every <image> whose href is not data: (the basemap tiles are data: and stay),
  so a download shows the paper, never the glyph. hasExternalImages() says when a sheet carries such photos.
- PosterWall: printing a generated sheet that carries photos prints THE SHEET ITSELF through printDocument, where
  the photos load, on its own @page (60in 96in), instead of a raster shrunk onto letter. Same HUD steps.
- check:side-lanes: photo arms (0 external images reach the raster; the wall prints such a sheet as a document),
  each with a poison in its self-test.
- check:side-lane-photo-pixels: the pixel side, a browser gate (a data: photo draws red; 99/99 external slots stay
  flat; without the strip 0/99 do). Declared on-demand until its first browser-seat run.
2026-10-01 09:45:33 +00:00
Doxa Maps
78a461588d Merge remote-tracking branch 'origin/development' into prayer-progress-plugin/pin-opacity 2026-10-01 09:42:26 +00:00
Doxa Maps
b32ccdc832 Bible push: merge 0ab6ca169 2026-10-01 09:08:47 +00:00
Doxa Maps
245eea9cb7 Bible push: merge 12e2ebafa 2026-10-01 09:08:47 +00:00
Doxa Maps
0a4e539935 Bible Posters: consume the shared poster size table
Replace the temporary local size mirror with the shared ladder
(library/constants/posterSizes.js via resolvePosterSize): the plugin selects its
five keys (paper, 36x36, 36x60, 66x66, 60x96), mapping widthIn/heightIn from the
entry's inches and the panel count from its sheets, and keeps its own
locale-neutral dimension labels until the shared picker lands. One remaining
comment reference is neutralized.
2026-10-01 08:52:21 +00:00
Doxa Maps
2da7f15ec7 Bible Posters: neutral source comments + CSP note for the text host
- Reword source comments in agent-written, neutral terms and drop internal task-file
  paths, so shipped source cites no process documents or attributions (passes
  check:no-new-driver-references).
- documentation/how-to.md: note that Bible Posters needs https://bible.helloao.org in
  connect-src (text is fetched per book at render time; none is bundled), so a host
  under a strict CSP does not silently block it.
2026-10-01 08:44:14 +00:00
Doxa Maps
cdf0df268d Bible Posters: language-tagged columns, atomic book fetch, cleaner credits
Address studio's 5B nits (non-blocking, folded in before the first render):
- Tag each translation with a BCP-47 code and set lang on the poster (html + body)
  so hyphens:auto works in narrow justified columns — removes rivers on Latin text.
- Fetch a whole book atomically: a single chapter failure now aborts the sibling
  requests and surfaces the error, instead of leaving a half book.
- Drop the English word "via" from the per-poster credit lines (a bare separator).
- Correct the entry comment: defineMapElement installs i18n; the hook only adds provides.
2026-10-01 08:44:14 +00:00
Doxa Maps
5c44b3cdcd Add Bible Posters plugin: a whole book of the Bible on one poster
A new experimental generator (Posterverse) that renders an ENTIRE BOOK of the Bible
in justified, phone-width columns with a bold book-name header, in the languages of
the unreached people groups. Text is fetched at render time from public-domain
translations via the Free Use Bible API; no Bibles are stored in the repo or public/.

v1 offers strict public-domain texts only, with a per-poster credit line: the World
English Bible plus the prayer packet's Reina-Valera 1909, Ostervald, Luther 1912,
Synodal and Van Dyck (Arabic, right-to-left). Book, text-language and size pickers;
the generator reports which size fits a book at a readable type size, and standard
paper is honestly shown as too small for a whole book. Interface strings are
localized in all 11 locales. Starts from the 12 books the UPG-100 packet cites.
2026-10-01 08:44:14 +00:00
Doxa Maps
70ea389db3 Docs: "reusable by default" in the library guides, and Deep Research by its name
- library/components/WARNING.md, library/dashboards/README.md and
  documentation/contributing/README.md taught "graduate into the library at the second
  consumer". They now teach the plugin-designer skill's rule (section 3): a component that
  could serve more than one map is built once in library/, driven by props, and landed through
  the build owner; one-off or experimental pieces stay in a map's folder; a new pattern is a
  pilot, then approved, then rolled out. The contributing guide's "full reasoning" link pointed
  to an index without it; it now points to the skill.
- The app shell doxa-maps-spa is labelled Deep Research. Ten docs still called it the Research
  Gallery (15 mentions): DEPLOY.md, the desktop how-to, embeddability, develop-a-plugin,
  reference-universal-props, reference.md, the shell's EMBED.md, and the plugin-designer skill
  with two of its references. Identifiers (doxa-maps-spa, branch and route names) are unchanged;
  README.md is not touched.
2026-10-01 08:27:04 +00:00
Doxa Maps
8896ad2130 Merge remote-tracking branch 'origin/development' into upg100/wall-count
# Conflicts:
#	internal/check-batch-selection-export.mjs
#	package.json
#	plugin-designs/my-upg-100-list/data/selection-export.js
#	plugin-designs/my-upg-100-list/poster-wall.vue
#	plugin-designs/my-upg-100-list/upg-100-list.vue
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/my-upg-100-list/my-upg-100-list.js
#	public/dx-maps/my-upg-100-list/poster-wall/index.html
#	public/dx-maps/my-upg-100-list/upg-100-list/index.html
#	public/dx-maps/my-upg-100-list/upg-100-mfe/index.html
2026-10-01 08:24:48 +00:00
Doxa Maps
a1c74004a0 Merge development (353bf078c) into the whole-India landing: package.json gates unioned (check:side-lanes added), poster-render re-pinned on the merged file 2026-10-01 08:24:45 +00:00
Doxa Maps
8df007818f Merge remote-tracking branch 'origin/development' into prayer-progress-plugin/pin-opacity
# Conflicts:
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/doxa-simple-map/doxa-simple-map.js
#	public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html
#	public/dx-maps/manifest.json
2026-10-01 08:23:57 +00:00
Doxa Maps
d01087a9cc Country Posters: the header share button is a rounded square, like Big Picture's and UPG 100's 2026-10-01 07:32:43 +00:00
Doxa Maps
852437e981 Merge remote-tracking branch 'origin/development' into upg100/state-packet 2026-10-01 06:32:09 +00:00
Doxa Maps
8d63a0a04d Poster Design: draw India at 5.5 x 5.5 ft and 3 x 5 ft too
countrySheet.js now lets a requested side-lane format win over a large
country's default sheet, so the shared path draws India at 66x66 and
36x60 as well as 60x96. The two cards that were listed but not drawn now
draw the real whole-India poster at their own size, and the note that
said no country printed at those sizes (missing.largeFormat, 11 locales)
is removed: nothing refers to it.
2026-10-01 06:07:49 +00:00
Doxa Maps
6d0253d909 countrySheet: a requested large size wins; LARGE_SHEETS only supplies India's 60x96 default
India can print at 60x96 (the default), 66x66 or 36x60. makeCountrySheet used to map any non-packet request to the
default, so a 66x66 or 36x60 request drew the 60x96 sheet. sheetFormatFor(item, format) (exported, pure) now keeps
a requested size the country can print at, falls back to its default otherwise, keeps a packet page a page, and
returns exactly what was asked for every other country.
check:country-sheet-one-path asserts that table (India 66x66/36x60/60x96/letter/3x4/packet; Nepal 3x3/letter;
China 3x4), with two poisons: India ignoring a requested 66x66, and a packet page turned into a large sheet.
2026-10-01 06:07:48 +00:00
Doxa Maps
cb5200d296 Poster Design: the catalogue lists the large side-lane sheets, and draws India's 5 x 8 ft one
poster-render gains three side-lane formats (60x96, 66x66, 36x60), and
check:poster-design-catalogue requires SHEET_FORMATS to list exactly what
FORMATS defines, so it failed on those three. They are now listed, near
the top after the 3 x 3 sheet, with India as their sample: India is the
one country countrySheet.js prints on a large sheet (LARGE_SHEETS).

map-sheet.country.60x96 draws through makeCountrySheet, the one country
sheet path, so its card shows the real whole-India poster. 66x66 and
36x60 are listed but not drawn: no country prints at those sizes yet, and
the shared path would hand back India's 5 x 8 ft sheet under their label.
Their details say so (posterDesign.missing.largeFormat, 11 locales).

The check fails on the three formats without this commit and passes with
it.
2026-10-01 06:05:41 +00:00
Doxa Maps
1af359ac42 poster-render: side-lane CSS adds no byte to other formats; photos only from the known photo hosts
5B fixes on the side-lane mode:
- The side-lane styles' template slot sat on its own line, so every OTHER format's page gained one newline. It is
  now joined onto </style>, emitting nothing at all off side lanes.
- A photo is drawn only over https from the hosts that serve people-group photos (media.joshuaproject.net,
  joshuaproject.net, images.peoplegroups.org, peoplegroupspublic.blob.core.windows.net), never the generic
  placeholder; anything else is dropped. Re-pinned.
check:side-lanes' seeded data now also carries photos on a host that is NOT allowed; none may be drawn.
2026-10-01 06:03:48 +00:00
Doxa Maps
31e5c3e5f9 UPG-100 batch selection: a state-only selection prints its Prayer list and Card deck
The packet and card-deck title named the selection's zones and countries only.
Since India's states bring people, a selection of states alone had no names, and
reduce() threw "Reduce of empty array with no initial value" at the reader.
selectionTitleNames (data/selection-export.js, pure) adds the states and union
territories that brought people. A province with no table is not named. A
selection that brought nobody (Mizoram or Nagaland alone) gives the keyed
"no people groups to print" instead.

check:batch-selection-export arm A6 tests it on the real served table: Gujarāt
alone is titled "Gujarāt", a state + a country names both, a province beside it is
not named, and Mizoram alone reads the keyed text. Its negative control shows the
old naming is empty and reduce() throws. The call site is pinned in arm C. Four
mutants each fail.
2026-10-01 06:00:55 +00:00
Doxa Maps
269226318d Merge origin/development (863174825) into studio/p-assembly 2026-10-01 05:57:02 +00:00
Doxa Maps
386e269fe6 Regions list: India's card follows the large-sheet rule, printing the whole-India poster on a desktop and saying so on a phone 2026-10-01 05:56:49 +00:00
Doxa Maps
455fa8ab7d One rule for countries too large for paper: countrySheet.js's LARGE_SHEETS; whole-India list, packet and cards on a desktop
CORRECTS the previous commit's "no prayer list, packet or cards for whole India": the current direction is that
whole India's poster, list, packet and cards (about a thousand pages) are offered DESKTOP-ONLY, and a phone shows
the existing poster.phoneLimit sentence instead of failing.
countrySheet.js now exports LARGE_SHEETS ({ IND: 60x96, desktopOnly }) and largeSheet(item), and makeCountrySheet
itself prints such a country in its large format (a packet page stays a page) with its "Administrative Areas"
cell from the shared state table ("36 states and union territories"). So every caller gets the same sheet: the
Regions list's India no longer has to disagree with Country Posters (regions-list's own lines follow, from regions).
The wall drops its India-only code and follows the same rule.
2026-10-01 05:55:55 +00:00
Doxa Maps
1c61cbb926 Country Posters: the whole-India poster prints, every group named
India's card is no longer "too many to fit": it prints as the 60x96 side-lane sheet (all 855 groups named beside
the map, crossing-free leaders, real photos), whatever paper the wall asks for, until the shared size picker
offers 66x66 and 36x60 too. Its facts row reads "36 states and union territories" (English, from the wall
head's plural key). As ruled, the whole-India card offers no prayer list, packet or cards; the state cards keep
theirs. Its card preview is the real sheet.
check:side-lanes (+ :self-test, gates:pre): the three side-lane formats on a seeded worst case (855 groups,
stacked and clustered) through the real renderer: every name once, 0 crossings re-measured from the SVG, no
overflow, photos only where real; without the lane clamp the same data crosses 36 times, and the arm fails.
2026-10-01 05:52:47 +00:00
Doxa Maps
ac108b5117 Posterverse: Bible Posters' ids are confirmed, and composes declares it
bible-posters/bible-posters is the id the Bible Posters plugin ships, so its
Experimental row is no longer provisional, and posterverse.meta.json composes
it. Lands in the SAME push as the bible-posters bundle: without it the ref is
unresolved (check:capability-derived), and with the bundle but without this
commit check:posterverse-shelf fails arm D.
2026-10-01 05:47:24 +00:00
Doxa Maps
802d7b5b8a P assembly: the widened census, stated neutrally
The case-insensitive census with every plugin agent's name found 30 more lines: library (ProfileLoader,
useMapProvider, ApproxPinNote, listSelection, colocation), the gallery's embed-contract card id, the gospel
plugins' source notes and build scripts, a regions script note and one gate description. Comments and notes
only, except the Gospel x Internet CSV export's provenance line, which no longer names who screened the links.
2026-10-01 05:42:24 +00:00
Doxa Maps
42a444edb8 Posterverse: the home link's fallback label in the reader's language
With home-href but no home-label, VerticalTabsLayout falls back to labels.home,
which Posterverse did not pass, so every locale read the English default. The
shell now passes labels.home from its own strings in all 11 locales, the same
words the Research Gallery uses. A host's own home-label still wins.
2026-10-01 05:42:05 +00:00
Doxa Maps
32a9b41bc0 Posterverse: pass the host's homeHref / homeLabel to the layout
VerticalTabsLayout draws a host's "Back to homepage" link directly above
Collapse (the top of the drawer on a phone); the Research Gallery already
forwards it. Posterverse now accepts the same two props (or profile-config
homeHref / homeLabel). Both default to '', which draws no link, so every
existing embed is unchanged.
2026-10-01 05:42:05 +00:00
Doxa Maps
47c5c68c69 Merge origin/development into gospel/gi-csv-guard 2026-10-01 05:37:47 +00:00
Doxa Maps
77751ddcb6 Merge origin/development (53fcf6d09) into studio/p-assembly 2026-10-01 05:32:16 +00:00
Doxa Maps
315dc92a65 Merge remote-tracking branch 'origin/development' into wall-of-people-groups-plugin/work 2026-10-01 05:31:29 +00:00