doxa-maps/library/scripts/posters
Doxa Maps 3c1d513cc3 The packet gets its bounded and centered sets page
Brief A1 back matter: after the profiles, before the wheel, full detail
only. The lightweight packet is map, triangle, profiles, wheel, points --
these two figures are the part a reader sits with rather than carries.

The layouts are regions' library/components/charts modules, imported
rather than injected: unlike describeGroup's country resolver they have
zero imports and run under plain node, and packet-render already imports
scatterCells from that directory. Verified by importing and CALLING them,
not by reading them. They return data, so the SVG is ours.

Gospel's non-negotiable is carried through and checked rather than
trusted: the bounded set keeps a deliberate gap either side of the
boundary because a dot ON the line is the one thing a bounded set cannot
express, and print has no hover to disambiguate it. Measured on the real
module with 40 groups -- inside max 85.3 of 92 allowed, outside min 119.8
of 112 required. The figure scales through the viewBox, so the gap lives
in coordinates the scaling cannot touch; shrink the figure, never the gap.

UNKNOWN POINTS ARE STATED, NOT PLOTTED. layoutBoundedSet gives them no
x/y, which is the module being right: `reached` undefined means we do not
know which side they belong on, so there is no honest place to draw them.
My first version mapped them through the same dot() helper and crashed on
p.x.toFixed -- a better outcome than silently drawing them at (0,0), which
would have put "we don't know" inside the circle. They go in the tally,
because on a printed page a category the reader cannot see reads as zero.

check-packet-variants' sheet delta goes 2 -> 3, updated in this commit
rather than relaxed into a range. It also now SUPPLIES the sets fixture:
setsPage returns '' without data, so a build() that omitted `sets`
exercised the filter for every page except the newest one, and the gate
sat green through the whole rewrite while asserting a delta that had
become wrong. A fixture missing an input silently narrows what the whole
file covers.

Seven strings x eleven locales; packet-strings-parity green. Gospel's own
ring names live in gospelInternet.json, a plugin catalogue, so there is no
collision with these.
2026-09-28 17:53:37 +00:00
..
data feat(posters): capitals and major cities on the country maps 2026-09-24 02:21:03 +00:00
fixtures packet fixtures carry the description's two fields 2026-09-28 15:01:20 +00:00
snapshots Complete app-profiles->plugin-designs sweep across comments/docs; build green; layouts kept at root (load-bearing) 2026-09-17 18:18:19 +00:00
build-gallery.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
build-hd-gallery.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
emit-countries.mjs Regions: expand a region to its country posters, reusing the shared wall 2026-09-24 04:26:29 +00:00
export-public.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
generate.mjs posters: SERIES is the one switch; header wording joins it; country mode fixed 2026-09-28 04:57:44 +00:00
make-previews.py public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
osm-basemap.mjs Prepare repo to the vision: BLUF vision-cast README, library warning, SRI injection, term scrub 2026-09-15 22:58:19 +00:00
packet-strings.json The packet gets its bounded and centered sets page 2026-09-28 17:53:37 +00:00
packet.mjs The table row is a border-box, and the offline packet gets its description 2026-09-28 16:49:01 +00:00
poster-regions.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
publish-html.mjs The poster print preview rasterises too, and a deployment can ship sources without rasters 2026-09-24 08:07:22 +00:00
README.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
series.json posters: SERIES is the one switch; header wording joins it; country mode fixed 2026-09-28 04:57:44 +00:00
serve-persist.sh doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
serve.sh doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
shoot.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
verify-posters.mjs Simple Research + Big Picture: the host's style stops at the box, and the last English goes 2026-09-25 08:19:56 +00:00

library/scripts/posters/ — UPG-100 poster generator

Renders one 3ft × 3ft print poster per zone (28 today) for the my-upg-100-list profile, from the profile's own data. It ships inside the repo alongside that data on purpose — reaching for the data via an env var once silently rendered stale posters (Nepal, Bangladesh, Bhutan vanished).

  bun run posters  ->  posters:shoot  ->  (WebP previews)  ->  bun run build
   HTML per zone       PNG @3000²        assets/previews/     app shows them
  • generate.mjs is the template; shoot.mjs screenshots to PNG (Firefox only — privacy-first policy).
  • A template change is not visible in the app until previews are regenerated and the app rebuilt.
  • Exported PNGs go to a sibling folder (../../../upg-100-posters/), never public/ — Capacitor packages public/ wholesale.
  • snapshots/ holds frozen template versions (v5 is the approved current); each has its own README.

Full reference — files, env vars, gotchas, measurement discipline: ../../../documentation/architecture/poster-generation.md.