Commit graph

1003 commits

Author SHA1 Message Date
Doxa Maps
7ea7195646 Pin hint: an inner scroller counts as a scrolling page, a map off the viewport is on one, and a stale lift is dropped
DX Life's /pray at 1440 kept the pill at the viewport's bottom until the map's bottom came into view: the page
scrolls a container, not the document, so the document-only test saw a full-screen page and kept the fold.
pageScrolls now also walks out from the pill, across shadow roots, for an ancestor scroller whose content is
taller than it; a map wholly below or above the viewport is treated as on a scrolling page; and a lift is
cleared when the pill goes off screen, so a lift set while the map was half visible does not survive into the
next view. check:pin-hint-floor adds the inner-scroller, shadow-crossing and map-below-the-fold fixtures; its
self-test refuses 9 planted defects.
2026-10-01 07:11:18 +00:00
Doxa Maps
ba022f68f9 Merge origin/development (d3b879c94) into studio/pinhint 2026-10-01 06:32:47 +00:00
Doxa Maps
269226318d Merge origin/development (863174825) into studio/p-assembly 2026-10-01 05:57:02 +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
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
Doxa Maps
cfab45ff97 Merge remote-tracking branch 'origin/development' into wall-of-people-groups-plugin/work
# Conflicts:
#	package.json
2026-10-01 05:19:07 +00:00
Doxa Maps
b6777218e3 Merge remote-tracking branch 'origin/development' into poster-design-plugin/zero
# Conflicts:
#	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 05:18:28 +00:00
Doxa Maps
289d31e3f4 Merge remote-tracking branch 'origin/development' into upg100/batch-tap
# Conflicts:
#	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 05:12:05 +00:00
Doxa Maps
9de5da9e4a Country Posters: the India section's header counts its states and union territories, not "countries"
The India section's cards are India itself, its 34 state and union territory posters and the two with none listed,
so "· 37 countries" was untrue. Through PosterWall's sectionItemCountKey, that section alone counts its state cards
(36, from the data) with countryPosters.indiaItemCount; every other section keeps the countries count.
The key in all 11 locales, in each locale's own plural forms (the same form counts as regions.countryCount).
2026-10-01 05:11:52 +00:00
Doxa Maps
f3851da57c 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:10:55 +00:00
Doxa Maps
a56691bc09 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 05:10:55 +00:00
Doxa Maps
24f3e4176a 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 05:10:55 +00:00
Doxa Maps
eeaea4c3e9 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 01:03:50 +00:00
Doxa Maps
e16e204530 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 01:03:50 +00:00
Doxa Maps
e7a1c940ef P: merge 202a0244e 2026-10-01 00:56:03 +00:00
Doxa Maps
a204752597 P: merge 2c397d25e 2026-10-01 00:55:59 +00:00
Doxa Maps
202a0244e2 Privacy: neutral comments in Country Posters (no quotes, date tags or agent names)
Comments only; behaviour unchanged. Each rewritten line keeps its technical fact and drops the attribution:
- design-note and brief quotations restated as plain design statements (country-poster-wall.vue, index.js,
  countries-map.vue);
- "(qa: <date> …)" tags and "user feedback / user reported" attributions removed (countries-map.vue);
- fleet agent names replaced by what was measured (countries-map.vue, country-posters-mfe.vue);
- series.json's India-state note: the approval date is gone; the wording stays the editable default.
2026-10-01 00:51:05 +00:00
Doxa Maps
c5687142ae Merge origin/development into studio/scrub 2026-10-01 00:46:07 +00:00
Doxa Maps
2c397d25ef Source comments state design history and measurements as facts, without quoting or naming anyone
Comments in library/ and internal/ that quoted a person, attributed a decision to one, used first person,
named fleet agents or carried private host names now state the same technical fact in neutral words:
poster-render (including the comments it writes into generated posters), packet-render, the poster and
research scripts, PosterWall, DataTable, the legends, the layouts and the gates. The network-policy note
states the policy itself. Behaviour is unchanged: a few printed gate messages and reason labels drop an
agent name, the poster-render integrity pin follows its comment-only edit, and series.json changes only in
its _meta and _why notes. The historical poster design snapshots (library/scripts/posters/snapshots/),
which nothing reads, are removed.
2026-10-01 00:37:17 +00:00
Doxa Maps
848ea64b95 Wall of People Groups: the poster says up front that it is for a print shop, as a PDF
Every Bless size is 2-8 ft, paper no desktop printer takes, and the print dialog then shows a 3 ft
page with no hint of what to do with it. A note under the header (Bless mode) now says: "This poster
is for a print shop: in the print dialog, choose 'Save as PDF', then send the file to the print shop."

The sentence lives in a NEW catalogue area, wallPrint (11 locales), which only this bundle names, so it
ships in the wall's bundle and in no other (measured: 0 other bundles carry it; the shared wall area
ships in 9). Shown in en and ar at 1440.
2026-10-01 00:24:32 +00:00
Doxa Maps
c870daa803 Pin hint: on a page that scrolls, the pill sits at the map's bottom instead of hanging at the fold
On a partner home page the map is a block in a scrolling page. The clamp floored the pill at the viewport
fold, so a map whose bottom was below the fold at load had its pill lifted to mid-map, re-set by the settle
timers and resize observers, and left there after a scroll, then dropped. The fold now counts only on a
page that does not scroll (a full-screen pane or leaf, where a phone's browser bar can cover the bottom);
the legend sheet and the licence credit still lift the pill everywhere. The floor is a pure function
(pinHintFloor.js), and check:pin-hint-floor proves both cases; its self-test refuses 5 planted defects.
2026-09-30 23:57:11 +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
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
28c638d7ec Comments name no internal hosts or teams; the A9 leaf-hint comment every page carries is neutral 2026-09-30 22:36:47 +00:00
Doxa Maps
e5c2b68fae UPG-100's display name is "UPG 100 List Posters": the Studio labels, the legend title and the wall heading (in 11 languages, the rail's own words); the folder and bundle id are unchanged, since DX Life and partners embed by URL 2026-09-30 22:29:09 +00:00
Doxa Maps
3e5646832d UPG-100 batch selection Copy: a selection apply-grouping cannot regroup in one go (a mix of states, provinces and countries, or a legend zone) still copies, and the flash now says its first line will not regroup. regroupable() is gated against apply-grouping's own dry-run verdict in six cases 2026-09-30 22:28:37 +00:00
Doxa Maps
1d2b29d6b5 Merge origin/development into studio/land-pd-seam 2026-09-30 22:23:58 +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
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
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
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
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
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
39ded339fa Merge upg100/batch-select (P0 batch selection, 2bf2607fc) into upg100/india-states: P0b's India detection builds on P0's selectionPeople. package.json keeps both new gates 2026-09-30 21:33:24 +00:00
Doxa Maps
d9b237ac19 PosterWall seams: gate the second-base retry, observe the wall's scroller
check:poster-wall-host-seams gains arm H: a default wall's broken stored
webp retries the tree's own copy before the placeholder. Arm I: a generated
preview that fails shows the placeholder at once. The gate serves embedBase.js
as if from a built tree, because the second base is derived from that URL and
is empty from source, which let a mutant that skipped the retry pass.

previewSrc's observer now uses the wall's own scroller as its root (the
viewport when the wall is embedded and the page scrolls it). A pane wall
scrolls inside .wall, which clips its cards, so with the viewport as root the
200px margin never looked ahead. Arm E asserts the root.

PosterWall states the two limits of previewSrc: a timeout ends the wait, not
the render, and the page cache never revokes the URLs it holds.
2026-09-30 21:29:17 +00:00
Doxa Maps
7cc28b7aee PosterWall: a previewSrc seam so a host can supply each card's thumbnail
A card's thumbnail was always the stored previews/<id>.webp. A gallery of
poster templates drawn from the library has no stored file, and must show a
library change the moment it lands, so the thumbnail can now come from the
host: previewSrc: async (item) => an image URL | null.

Default null keeps the stored webp and creates no observer, so every current
wall is unchanged. When set, a card renders only once it is in view, one
render at a time, cached on the page by instanceId + item id. Until it answers
the card shows its label; null, a throw or no answer within 20 s shows the
existing "preview unavailable" placeholder.

The header-action gate becomes check:poster-wall-host-seams and covers both
seams: arms D to G for previewSrc (default webp and no observer; lazy, one at
a time and the null fallback; the timeout; the cache). Six mutants of the new
code each fail it.
2026-09-30 21:21:27 +00:00
Doxa Maps
79b949cb24 WIP P0b: India's states and union territories table (derived from admin-membership, served as an asset, sha384-pinned in the same emitter run), its loader, the tree allowlist row, and check:india-states (not yet registered) 2026-09-30 21:17:28 +00:00
Doxa Maps
b3d6db3c59 PosterWall headerAction: a countless item's sticker reads the label alone
A template card (Poster Design) carries no people-group count, and the new
branch printed a bare ' UPG ·' before its label. The count and separator now
render only when item.count is set, in the headerAction branch only; the
default toggle is unchanged. check:poster-wall-header-action gains arm C for
it, which fails with the guard removed.
2026-09-30 21:11:33 +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
58242987c8 PosterWall: a headerAction seam for the card's header sticker
The sticker on every poster card was hard-wired to "Show on map". A wall with
no map beside it (a gallery of poster templates) needs the same card with a
different action, and a fork of the card would drift from the wall.

headerAction null (the default) renders the existing toggle unchanged: the
same markup, aria-pressed, the is-last highlight and the window event, so
every current wall is untouched. { labelKey, ariaKey } renders a plain button
labelled from those keys that emits 'header-action' with the item and
dispatches no window event.

check:poster-wall-header-action (gates:pre) mounts the real PosterWall
headlessly on a recording renderer and calls the sticker's onClick in both
modes. Four mutants fail it: no seam, a new branch that also dispatches, a
default that emits, and aria-pressed on the new branch.
2026-09-30 21:07:37 +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
c4655072ab Merge remote-tracking branch 'origin/development' into deep-research-plugin/hostslot 2026-09-30 20:53:36 +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
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