Commit graph

1819 commits

Author SHA1 Message Date
Doxa Maps
aa97a5ac81 check:poster-section: add arm G's poison to the self-test
A type whose actions do not block a phone makes arm G fail — so the gate keeps
proving arm G can fire (was hand-proven only). Self-test now 10/10.
2026-10-02 16:11:36 +00:00
Doxa Maps
b98e6b096a check:poster-section: add arm G (a phone blocks a desktop-only large sheet via the type)
Renamed from F to avoid colliding with the pilot's show-header arm F. A phone +
a non-withheld desktop-only large sheet via countryPosterType rejects
poster.phoneLimitAll (records) and reads it (unsupported); poison-proven by
neutralising phoneBlocked.
2026-10-02 15:58:29 +00:00
Doxa Maps
6d89e6b8ce Merge commit '85c27e94f7d349722e1ade77fc17b71baf450aab' into poster-design-plugin/catalogue 2026-10-02 13:17:10 +00:00
Doxa Maps
86ade3356d Merge commit '56571a9bd72d6470514c34d71982f63e290125f3' into poster-design-plugin/catalogue 2026-10-02 13:11:33 +00:00
Doxa Maps
85c27e94f7 Merge remote-tracking branch 'origin/development' into regions/card-action 2026-10-02 13:04:01 +00:00
Doxa Maps
c9a494024b Merge commit '3cb185da1f299194b8c9940abc9e81503d855d77' into poster-design-plugin/catalogue 2026-10-02 13:00:56 +00:00
Doxa Maps
4e60f35ea9 Merge remote-tracking branch 'origin/development' into regions/card-action 2026-10-02 12:53:44 +00:00
Doxa Maps
8931f6a28c Merge remote-tracking branch 'refs/remotes/origin/development' into deep-research/manifest-revalidate
# Conflicts:
#	public/dx-maps/doxa-maps-spa/doxa-maps-spa.js
#	public/dx-maps/doxa-maps-spa/doxa-maps-spa/app/index.html
#	public/dx-maps/doxa-maps-spa/doxa-maps-spa/index.html
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
2026-10-02 12:47:06 +00:00
Doxa Maps
ea8a74b350 check:poster-section covers card-action, with poisons for an ignored attribute and an event that cannot leave the shadow root 2026-10-02 12:43:51 +00:00
Doxa Maps
3cb185da1f Merge remote-tracking branch 'refs/remotes/origin/development' into deep-research/poster-sections-not-experimental 2026-10-02 12:41:24 +00:00
Doxa Maps
f9a28bde47 Merge remote-tracking branch 'origin/development' into regions/poster-sections 2026-10-02 12:31:04 +00:00
Doxa Maps
544ffed652 Posterverse: the Experimental folder starts open
Closed, the folder sat mid-drawer under the one short Posters section with
empty space below, so it read as a caption with nothing under it and was easy
to miss on a phone. Open, its plugins show like any section's rows; a reader
can still collapse it. check:posterverse-shelf asserts the open default, and
its self-test plants a closed folder.
2026-10-02 12:26:16 +00:00
Doxa Maps
6ccbe827bc check:poster-design-catalogue: poison a sample that exists but cannot be drawn
The samples arm is now a function the self-test can poison: with withholding
switched off, India (no sheet tier, no outlines) must fail as a sample that
cannot be drawn. Closes the branch the arm had no poison for.
2026-10-02 12:20:40 +00:00
Doxa Maps
2f4cabf85f Poster Design: the 66x66 and 36x60 side-lane cards get a real sample
India, the one large-sheet country, now prints at 5 x 8 ft only, so the
5.5 x 5.5 ft and 3 x 5 ft side-lane cards would have drawn India's 60x96 sheet
under their own label. They now sample the largest drawable countries (China
at 66x66, Sudan at 36x60) through the same shared sheet path, and their
details say that no country prints at this size today
(posterDesign.missing.noCountryAtSize, 11 locales). The 60x96 card keeps
India and stays withheld. check:poster-design-catalogue now checks every
sample: drawable, or withheld by countrySheet.js.
2026-10-02 12:12:18 +00:00
Doxa Maps
a4b57256ab Gallery: Poster Sections stays out of Experimental (a template plugin other plugins and sites embed) 2026-10-02 12:09:37 +00:00
Doxa Maps
0b47851a41 Merge commit '8fe8603ca2c5d42a252d3f372c9770046e924727' into poster-design-plugin/catalogue
# Conflicts:
#	package.json
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/poster-design/poster-design-mfe/index.html
#	public/dx-maps/poster-design/poster-design.js
#	public/dx-maps/poster-design/poster-sizes/index.html
#	public/dx-maps/poster-design/poster-styles/index.html
2026-10-02 12:07:13 +00:00
Doxa Maps
2deff898c3 Merge remote-tracking branch 'origin/development' into regions/poster-sections
# Conflicts:
#	public/README.md
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
2026-10-02 12:06:01 +00:00
Doxa Maps
c590e9fef4 Gallery: after a deploy, a returning reader runs the new bundles, not stale cached copies
A host that serves the tree with Last-Modified and no Cache-Control lets a browser run its cached files for
hours. Measured: a typed-URL revisit after a deploy requested none of the gallery, the manifest or the bundles,
so a returning reader ran the old files, or an old manifest against a new bundle.

- The manifest is fetched with cache 'no-cache', so it is always revalidated (a 304 when unchanged).
- A fingerprint of the manifest (every bundle's integrity) is kept per tree. When it differs from the reader's
  last visit, every bundle the browser already holds gets one conditional request before any tab mounts:
  a 304 refreshes it, and a 200 is cancelled at its headers, which drops the stale copy. The plain <script>
  that follows, the gallery's own or a composite's for its children, then runs the new file at the same URL.
- A version query is not used: loadScriptOnce keys its registry by the full href, so X.js?v= next to a
  composite's plain X.js would run the bundle twice.
- A first visit with an empty cache costs nothing extra (only-if-cached finds nothing held), and so does an
  ordinary visit with an unchanged manifest. The mount waits at most 8 s for the check.
2026-10-02 11:39:17 +00:00
Doxa Maps
813dbb73d1 Merge commit '1bddf78a676b33782e5c7e54890497dc39f235f5' into poster-design-plugin/poster-sections 2026-10-02 11:34:59 +00:00
Doxa Maps
fc5b26ace9 check:country-sheet-one-path self-test: the Regions-list phone-block poison runs only while the list draws its own sheets 2026-10-02 11:31:18 +00:00
Doxa Maps
cd31ec1dfd Merge remote-tracking branch 'origin/development' into regions/poster-sections
# Conflicts:
#	plugin-designs/country-posters/scripts/check-poster-section.mjs
#	plugin-designs/regions-dashboard/regions-list.vue
#	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/country-posters/poster-section/index.html
#	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-10-02 11:19:59 +00:00
Doxa Maps
50266ad32e Merge development (2fc9b94f0) into the India tab
# 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/country-posters/poster-section/index.html
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/poster-design/poster-design-mfe/index.html
#	public/dx-maps/poster-design/poster-design.js
#	public/dx-maps/poster-design/poster-sizes/index.html
#	public/dx-maps/poster-design/poster-styles/index.html
#	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-10-02 11:05:14 +00:00
Doxa Maps
ed0a1a57b1 Poster Sections: country presets only until another poster type can load on the page
A preset page loads only poster-sections.js, so a preset of a poster type
registered by another plugin's script (upg100-list) could only say No
posters. The generator now gives no presets to a type whose file is not on
the tree, and check:poster-sections fails on any such preset: 9 presets
remain (7 regions, all regions, configure).

The tree generator writes a page per preset but never deletes one, so the
dropped presets' pages (the 10 upg100 ones and countries-other) are removed,
and a new arm holds the built preset pages to exactly the presets.
2026-10-02 10:56:43 +00:00
Doxa Maps
dc9014bb83 check:poster-section covers min-card-px and show-header, with poisons for a dropped attribute and an unwired view 2026-10-02 10:38:59 +00:00
Doxa Maps
7e3023d680 Poster Sections: presets regenerated on the corrected regions, countries-other gone
The pilot's country data now places every country in a real region, so the
country type has 7 regions. gen:poster-sections-presets regenerated the list
(19 presets); check:poster-sections had failed on the stale countries-other
preset and passes now. Bundle, tree and SRI rebuilt.
2026-10-02 10:36:06 +00:00
Doxa Maps
073ee575df Merge remote-tracking branch 'origin/development' into poster-design-plugin/poster-sections 2026-10-02 10:25:29 +00:00
Doxa Maps
823b2b603b Regions list: its poster sections keep two posters a row on a phone 2026-10-02 10:07:33 +00:00
Doxa Maps
4bde3d7c90 Regions list: each region's View country posters toggle embeds the shared poster section, and one Show on map handler serves the list and the Country Posters view 2026-10-02 10:02:30 +00:00
Doxa Maps
6932bebd2c check:country-sheet-one-path accepts a Regions list that delegates to <dxm-poster-section>: the list is checked like the wall only while it calls makeCountrySheet itself, and the library country type must withhold India's rows and poster either way (arm H). 2026-10-02 09:53:06 +00:00
Doxa Maps
446ed37d1c Poster Sections: generate the presets from each poster type's own regions
gen:poster-sections-presets writes poster-sections.instances.json from each
type's scopes() (all regions, then one preset per region titled by the type's
own section title in the site's English, then configure), the same list
check:poster-sections holds the file to. Today it reproduces the 20 presets
exactly, in the data's region order; when the data's regions change, running
it is the whole fix.
2026-10-02 09:50:33 +00:00
Doxa Maps
02b44a7343 No caller can open India's withheld poster: posterWithheld()/largeSheet() read the DEV-only preview themselves (no opener argument). The open preview is proved under Vite (check:poster-section C2, DEV true as on the pilot's dev server); check:country-sheet-one-path fails if an opener argument comes back. 2026-10-02 08:50:58 +00:00
Doxa Maps
9bd2177687 Poster Design lists every plugin's poster designs, declared in the plugin's own meta
A poster plugin now lists its designs in its own <profile>.meta.json under
posterDesign ({ family, name, size, mobileFriendly, labelKey?, instance? },
one or an array). internal/profile-meta.mjs carries the block into
manifest.json only when present, so every existing manifest keeps its bytes
(the built and the dev manifest share that function).

Poster Design's Styles reads the tree's manifest at runtime and gives each
declared design a card under From other plugins: the card says it is made by
its own plugin, and Show full details shows that plugin's page (or preset
page) live, with a link to open it. No plugin code is imported, and a plugin
adding its block does not rebuild Poster Design.

check:poster-design-catalogue now also validates every block, keeps names
unique across templates.js and all blocks, and keeps a names ledger
(src/catalogue-names.json): a shipped name that is renamed or removed fails.
Its new self-test (in gates:pre) proves an invalid block, a name clash, a
renamed ledger name and a missing preset each fail, and the documented
example passes.
2026-10-02 08:50:48 +00:00
Doxa Maps
f1b2cd34f4 Re-derive country-posters.json region fields from live wagf_region
Each country's region is set to the live wagf_region its groups carry (file
label spelling); only the region field changes (stats, bbox, count, India row
untouched). The stale 'Other' bucket (18 countries) empties out and each moves
to its real region: USA and the non-Spanish Caribbean + the Guianas to North
America & Non-Spanish Caribbean; Andorra/Monaco/San Marino to Europe; Cocos,
Christmas, Niue, Norfolk, Tokelau, Wallis & Futuna to Oceania. Europe goes
27 -> 30, matching the live Regions dashboard.

check:poster-section drops 'other' from its covering scopes (the bucket is now
empty, so the /regions/other scope resolves to zero countries); the seven real
regions still cover all 175 countries exactly once.

Region-only diff (18 region lines); B25 India withheld unchanged
(check:country-sheet-one-path, poster-section, poster-browser-equiv,
poster-design-catalogue all PASS).
2026-10-02 08:38:11 +00:00
Doxa Maps
6060694545 check:poster-sections: the presets must equal each poster type's own regions
The presets file now has to hold, per poster type, exactly an all-regions
preset plus one per region the type's adapter returns from scopes(). A region
the data drops (a stale "other") or gains then fails the check, instead of
lingering as a preset. 'country' is measured always; 'upg100-list' once its
type file is on the tree. Self-test: a preset for a region the type does not
have must fail.
2026-10-02 08:32:35 +00:00
Doxa Maps
c6425ed1cf Poster Sections: presets, one per region (capability 2), with Configure as one more
Poster Sections becomes a parameterized profile like doxa-simple-map: its
props (type, scope with 'all' = every region, locale, columns, collapsed)
choose the <dxm-poster-section> sections it renders, and
poster-sections.instances.json lists 20 presets, each built into its own page
and embed snippet in manifest.json:
- country posters: all regions + each of DX Life's /regions regions (8);
- UPG 100 posters: all regions + each of its 9 regions (they show once the
  upg100-list type is registered on the page);
- configure: the panel of choices and Copy embed, for making new presets.

The element's columns attribute now comes from the library (landing
separately), so this commit drops its library edits; check:poster-sections
reads columns back through that attribute and passes once it is on the pilot.
2026-10-02 08:30:54 +00:00
Doxa Maps
10c33affbf Regions: on a phone the three view tabs scroll between the corner buttons, and a poster card's Show on map opens that country's dashboard 2026-10-02 08:17:59 +00:00
Doxa Maps
790d7d2400 Poster Sections: a plugin page that sets up <dxm-poster-section> and hands out the tag to embed it
A new bundle, plugin-designs/poster-sections, with one profile, Poster Sections.
A panel of choices (poster type from the registry at runtime, region or All
regions, language, posters per row, start collapsed) drives the library's
<dxm-poster-section> elements shown live below it, and Copy embed gives the
bundle script plus the exact tags for those choices, with absolute URLs so they
work on another site. The bundle also registers <dxm-poster-section>, so a site
that loads only poster-sections.js can place the tags.

Library: the element takes a columns attribute (posters per row, 1-5), passed
to the wall's existing columns prop; absent keeps today's default, so existing
importers are unchanged. New catalogue area posterSections in all 11 locales.

check:poster-sections (in gates:pre) reads every panel choice back through the
element's own attribute reader; its self-test proves a builder that drops
columns, drops collapsed, or repeats a region under All regions fails.
2026-10-02 08:16:40 +00:00
Doxa Maps
665ef7608a Whole India prints at 5 x 8 ft (60x96) ONLY (the Driver); other countries' sizes are unchanged. check:country-sheet-one-path: every India request but a packet page gets 60x96; a poison offers 66x66 again. 2026-10-02 08:14:09 +00:00
Doxa Maps
0dc9765f77 The preview read is DEV-only: no built bundle can open India's withheld poster from a global
previewUnreleased() is import.meta.env && import.meta.env.DEV && globalThis.DXM_PREVIEW_UNRELEASED === true, and the
India tab uses the same expression inline, so every BUILT bundle compiles both away. A page, an embed or a reader's
console setting the global can no longer print the withheld poster from production; only the Vite dev server (the
pilot's Plugin Studio, whose element bootstrap sets it) previews it. posterWithheld()/largeSheet() take the preview
state as an optional argument, so a gate can test an open preview directly.
check:country-sheet-one-path arm G: a global alone does NOT open the preview outside DEV; withheld by default; an
open preview prints 66x66; the India tab is gated on the DEV read; and the built tree mentions the flag 0 times
(the stale ungated build failed this check, as it should). A poison for each.
2026-10-02 08:08:26 +00:00
Doxa Maps
edff06b96a Regions: a third view, Country Posters, with one collapsible poster section per region
The view places the library's <dxm-poster-section type="country"> once per region the poster data files its
countries under, in the dashboard's region order, starting shut, in the page's locale. Rebuilt regions-dashboard,
then the tree (the new leaf page) and SRI.
2026-10-02 08:02:55 +00:00
Doxa Maps
f804bd8bcc India's whole-country poster stays withheld everywhere except an explicit PREVIEW context
It is not released yet, and the pilot syncs to DX Life (and the partner handoff) within minutes. So WITHHELD.IND is
{ poster: true, rows: true, preview: true }: posterWithheld() is false ONLY when the host page sets
globalThis.DXM_PREVIEW_UNRELEASED === true (the Plugin Studio on the pilot, where it is reviewed); never by a URL
parameter. Every other host keeps the withheld sentence on India's card, and Country Posters' India tab exists only
under that flag. The rows (list, packet, cards) stay withheld everywhere.
check:country-sheet-one-path arm G proves (a) withheld by default and (b) printing at 66x66 with the flag (only
=== true opens it), rows withheld in both, the India tab gated, with a poison for each; check:poster-section arm C
expects the sentence by default.
2026-10-02 07:53:41 +00:00
Doxa Maps
2992f5b941 The whole-India poster ships on an India tab (66x66 by default); its list, packet and cards stay withheld
countrySheet.js WITHHELD now says WHAT of a whole country is withheld: { IND: { poster: false, rows: true } }, with
posterWithheld() and rowsWithheld() (sheetWithheld() keeps meaning the poster, the name Poster Design reads).
- India's whole-country POSTER prints again, 66x66 by default (60x96 and 36x60 on request); largeSheet() names it.
- Its ROWS (the prayer list, packet and cards: about a thousand pages) stay withheld with the same sentence, in the
  wall, the Regions list and the 'country' poster type. India's state posters are unchanged.
- Country Posters gains an INDIA tab: the same wall filtered to India, labelled with India's own name in the
  reader's language (Intl), between the posters and the map.
check:country-sheet-one-path arm G checks the split (poster live at 66x66, rows withheld, state cards never
withheld, both callers read the right half), with poisons for un-withheld rows and a wall that prints them;
check:poster-section arm C follows. The by-state, leaderless India layout follows as its own PR.
2026-10-02 07:51:10 +00:00
Doxa Maps
2cab21c5a9 Poster section page: its @description; the library index and capability exemplars regenerated; the tree rebuilt 2026-10-02 07:07:18 +00:00
Doxa Maps
a95b88ed65 <dxm-poster-section>: one poster section, any poster type, as a reusable element
The section the Country Posters tab draws (a collapsible region head + its poster cards) is now usable on its
own, for any poster set, by parameters:
- library/components/poster/posterTypes.js: a TYPE REGISTRY. A type is an adapter (items for a scope, the
  section's title, the print actions). The library registers 'country' (library data + the shared sheet path,
  so a withheld whole-country poster stays withheld); plugins register their own types from their own code
  (UPG 100 lists, regions, continents later). No plugin code in the library.
- 'country' scopes: a region key in any spelling. DX Life's /regions slug ('latin-america-and-caribbean'),
  the API's value, the wall's slug and the English name all reduce to one canonical key.
- PosterSectionView.vue: one section, drawn by a PosterWall in a new SECTION-ONLY mode (no wall head; off by
  default, so every existing wall renders as before), embedded so the page scrolls it.
- <dxm-poster-section type scope collapsible collapsed locale assets-base api-base-url is-dark>: the
  attributes map onto the standard element's profile-config (posterSectionConfig.js, pure), so it keeps the
  per-instance i18n and store. registerPosterSectionElement() from any bundle; Country Posters ships it first.
- country-posters/poster-section: a page showing two sections (Africa open, Oceania collapsed).
- poster.sectionNone (11 locales): an unknown type or an empty scope says so, never a blank.
check:poster-section (gates:pre) + self-test: the registry, DX Life's 8 scopes covering every country once,
withheld India, the attribute mapping, and PosterSection.vue injecting every name its template uses; 3 poisons.
The known collapse-while-scrolled landing is left exactly as it is.
2026-10-02 06:56:48 +00:00
Doxa Maps
31d594b83f Prayer Progress registers as <dxm-simple-map>; the older names only on request
A host page can define a tag name before our bundle loads, and the first definition wins. DX Life's own
/js/doxa-simple-map.js defines <doxa-map> and <doxa-simple-map>, so on those pages our guarded define was
skipped and the page drew the host's element under our name.
- The doxa-simple-map bundle now defines <dxm-simple-map>, DX Maps' own name, first. The manifest, the leaf
  pages and the gallery mount it (generate-tree reads the first define).
- <doxa-map> and <doxa-simple-map> are defined only when the host asks: data-legacy-tags on the bundle's
  <script>, or window.DXM_LEGACY_TAGS = true before it loads.
2026-10-02 03:22:36 +00:00
Doxa Maps
68bcb28624 Posterverse: "Back to homepage" leads to the DOXA site by default, in the shell's language; a host's own home link still wins 2026-10-02 02:15:28 +00:00
Doxa Maps
b3de39a39e Research Gallery: "Back to homepage" leads to the DOXA site by default, in the gallery's language; a host's own home link still wins 2026-10-02 02:13:47 +00:00
Doxa Maps
c11d179d3d Poster Design: a withheld country's large-format cards say why, and are never drawn or printed
countrySheet.js now withholds the whole-India poster (WITHHELD,
sheetWithheld), and makeCountrySheet returns nothing for India. The three
large-format Styles cards use India as their sample, so they showed
"preview unavailable" and their print fell through to a stored poster
that does not exist. They now answer PosterWall's unsupported with
messages.countryPosterTooMany, in the reader's language: the card shows
that sentence instead of a preview, and a print opens only that notice.
The designs stay in the catalogue, so they return when India is no longer
withheld.
2026-10-01 22:24:53 +00:00
Doxa Maps
fe743ff48d The whole-India poster is withheld for now: "Too many people groups to fit on one poster legibly"
India's whole-country poster does not ship yet; a solution is in progress. countrySheet.js gains WITHHELD (India)
and sheetWithheld(item):
- makeCountrySheet draws nothing for a withheld country, in any format, before fetching a single record.
- largeSheet() is null for it, so the Country Posters wall and the Regions list show their existing
  messages.countryPosterTooMany ("Too many people groups to fit on one poster legibly — a solution is in
  progress.", all eleven locales) on the card instead of a poster.
- Both callers also withhold its list, packet and cards with the same sentence (about a thousand pages, offered
  when the poster is).
- India's STATE and union-territory posters are separate cards (indiaState) and are untouched; so are the India
  section and its first place.
- sheetFormatFor keeps the large-sheet size rule itself (it returns with the poster).
check:country-sheet-one-path arm G: India stays withheld (no sheet in any of 7 formats, 0 records fetched, its
state cards never withheld, both callers show the sentence and reject its rows), with a poison for un-withholding
it and one for a wall that prints its list.
2026-10-01 22:18:31 +00:00
Doxa Maps
6dfc7dd7a8 check:side-lane-photo-pixels: every name clear of every OTHER photo too (a long inner-column name must not run into the outer column's photo above or below) 2026-10-01 18:46:44 +00:00