Commit graph

4721 commits

Author SHA1 Message Date
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
1142425978 Rebuild cities-internet country-posters doxa-research-map doxa-simple-map my-upg-100-list for the legend drag fixes on the merged pilot (the host floor), and regenerate the tree and SRI 2026-10-02 11:00:47 +00:00
Doxa Maps
9b82a5e96e Merge origin/development (2fc9b94f0) into studio/legend-shrink 2026-10-02 10:59:07 +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
40cfb1da68 Add India Posters review plugin (preview-only)
A review gallery for the whole-India poster challenge — fitting every
India people group on one printable sheet. It gathers each design
attempt with what was tried and the measured result, and lets a
reviewer label it, score it 1-10, and tag it a best practice or one to
avoid (saved locally, exportable as JSON).

Withheld from every public build: the attempts, their descriptions,
and the poster documents load only under the dev server, in a dev-only
gallery module that compiles away. A production build shows only the
"solution in progress" notice and emits zero whole-country-poster
bytes. Element <india-posters>; stage experimental, visibility team.
2026-10-02 10:55:46 +00:00
Doxa Maps
2fc9b94f0e Rebuild country-posters my-upg-100-list poster-design regions-dashboard for the measure-once host floor on the merged pilot (region fix + pane scroll), and regenerate the tree and SRI 2026-10-02 10:42:53 +00:00
Doxa Maps
ade3f08e6f Rebuild country-posters and regions-dashboard for the show-header attribute, then the tree and SRI 2026-10-02 10:41:26 +00:00
Doxa Maps
00ff2d56eb Merge origin/development (b1477615c) into studio/resize-floor 2026-10-02 10:41:04 +00:00
Doxa Maps
5802f47718 Merge commit 'b1477615c69b68fb1cd15603986f3c0c9e0ad1ec' into poster-design-plugin/poster-sections 2026-10-02 10:40:02 +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
aed7849bd2 Poster section element: show-header="false" hides the section's head so the host's layout is its header (absent keeps today's head); a headless section never collapses 2026-10-02 10:38:58 +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
b1477615c6 Merge remote-tracking branch 'origin/development' into upg100/pane-scroll
# 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/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-list/index.html
#	public/dx-maps/regions-dashboard/regions-mfe/index.html
2026-10-02 10:30:40 +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
0ece5d928d Rebuild country-posters and regions-dashboard for the min-card-px attribute, then the tree and SRI 2026-10-02 10:15:33 +00:00
Doxa Maps
73db18cc51 Rebuild every bundle for the measure-once host floor (ProfileLoader is in each), and regenerate the tree and SRI 2026-10-02 10:14:40 +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
a14da6f2fa Poster section element: a min-card-px attribute, the narrowest a card gets before a row holds one fewer (absent keeps today's layout) 2026-10-02 10:07:32 +00:00
Doxa Maps
5362d84bc6 Host floor: re-probe only when the host may have changed kind, and never move a scrolled child
The measure-once design missed a host restyled from sized to height:auto after mount WITH in-flow content: it
stayed sized at its content height instead of getting the floor back, as the old probe did.
- After mount, follow() re-probes only when the reading says the host may have changed kind: floor on and the
  host shorter than the floor (styled after mount, or capped), or floor off and the host changed size (it may now
  follow its content). The re-probe saves every scrolled descendant (through shadow roots) and puts it back
  before the frame paints, so no reader state is lost. A window-height change on a content-sized host still
  writes nothing.
- A host capped below the floor (max-height) is latched by the probe that finds it, until it reaches the floor
  again, so it is never re-probed in a loop. The 1 s post-flip window is gone.
- check:host-floor gains arm H (sized → auto with 420 px of content: the floor returns, at most one flip, the
  scrolled child keeps its scrollTop) and counts re-probes in D/E. Poisons: the old per-resize probe, no capped
  latch, no re-check of a sized host, no scroll restore.
2026-10-02 10:06:37 +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
cd55cfd877 Host floor: one module, a latch for a max-height host, and a gate that pins measure-once
- library/elements/hostFloor.js holds the decision ProfileLoader uses: probeOnce() at mount, follow() on every
  host resize (reads only; at most one flip of the floor).
- A host CAPPED below the floor (max-height) follows its content up to the cap. It is found at mount, or, if
  the cap arrives later, by the host shrinking right after a flip; either way it is latched as content-sized
  and never flipped again, so it cannot loop. The post-flip check runs before the collapse rule, so a capped
  host with empty content is latched rather than flipped back and forth.
- check:host-floor (gates:pre; self-test in gates:post): a stub DOM with a scrolled child that clamps when the
  loader collapses. After mount, host resizes never write the loader nor move the child; a sized host fills;
  late sizing flips once; a max-height cap (at mount: 0 flips; after mount: at most one flip and one revert)
  never loops; a collapsed host gets the floor back; an inline host is left alone. Poisons: the old per-resize
  probe, and a missing latch.
2026-10-02 10:01:46 +00:00
Doxa Maps
fcd6d51910 Merge the pilot (c7b77b0a1) and rebuild the 3 region-data bundles
Merge studio's poster type registry + pins-in-state + preview-flag pilot into
the region data fix. Built-output conflicts resolved by taking the pilot's
public/ then rebuilding the three bundles that embed country-posters.json
(country-posters, poster-design, regions-dashboard) on the merged source, so
they carry both the registry changes and the corrected regions. Tree + SRI
regenerated. check-poster-section's dropped 'other' scope and the 18 region-only
records are preserved through the merge.
2026-10-02 09:55:45 +00:00
Doxa Maps
2ff1cf207e Rebuild the four pane-wrapper bundles on the merged pilot, and regenerate the tree and SRI 2026-10-02 09:54:53 +00:00
Doxa Maps
9a8d31d18e Embedded apps keep their view through a phone's URL-bar resize: the host is measured once, then only followed
A regression from the host-sized floor: ProfileLoader re-measured its host on EVERY host resize by briefly setting
the loader's min-height to 0 and then to a huge value. On a content-sized host (100svh tall) a window-height
change, as a phone's URL bar makes, resized the host and ran that probe; collapsing and expanding the loader
clamped a scrolling child's scrollTop, and the embedded UPG-100 app, whose view follows its column's scroll,
flipped from Map back to its first view.
- The two-value probe now runs ONCE, at mount, before the profile renders.
- After that the loader only READS sizes and flips one CSS value: a block host shorter than the floor (only a
  host sized from outside can be) turns the floor off; a block host that collapsed to nothing turns it back on;
  a window-height change on a content-sized host changes nothing.
2026-10-02 09:54:23 +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
59bb677665 Rebuild the LegendMobile and PeopleGroupDetail importers for the legend drag fixes (the floating picture as a handle; contained scroll), and regenerate the tree and SRI 2026-10-02 09:50:40 +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
0223e13059 Merge remote-tracking branch 'origin/development' into upg100/pane-scroll
# 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
2026-10-02 09:49:51 +00:00
Doxa Maps
f979eb6209 Rebuild regions-dashboard on the poster type registry, then the tree and SRI 2026-10-02 09:46:13 +00:00
Doxa Maps
859cad37af Merge remote-tracking branch 'origin/development' into poster-design-plugin/poster-sections
# Conflicts:
#	package.json
2026-10-02 09:46:08 +00:00
Doxa Maps
2c80f28962 Rebuild the four bundles that compile pane-wrapper (country-posters, my-upg-100-list, poster-design, regions-dashboard) for the column-only scroll, and regenerate the tree and SRI 2026-10-02 09:45:27 +00:00
Doxa Maps
cbe28dd4c1 Merge the pilot (c7b77b0a1: the poster type registry) into the legend fix 2026-10-02 09:42:13 +00:00
Doxa Maps
6de350919d Phone legend: the floating picture is a drag handle too, so a drag from it no longer scrolls the page
Measured headless (390, real touch, a host on a page that scrolls): in the detail view, a drag up from the people
group's floating picture above the sheet scrolled the PAGE (scrollY 0 to 135, en and ar), while the same drag from
the sheet's strip did not. The picture sits outside the sheet and its grab lip, so it had none of their handlers.
It now takes the sheet's capture-phase touch handlers and touch-action:none: a drag from it resizes the sheet (the
grab-zone test holds above the sheet, as for the lip), and a tap is handed back as a click that reaches its
existing @click (open the sheet fully), as before.
2026-10-02 09:42:13 +00:00
Doxa Maps
b2bb946f2b Merge remote-tracking branch 'origin/development' into regions/poster-sections 2026-10-02 09:41:23 +00:00
Doxa Maps
c7b77b0a12 Merge origin/development into studio/poster-registry 2026-10-02 09:35:21 +00:00
Doxa Maps
fc3ea94af8 pane-wrapper: switching views scrolls the pane column, never the embedding page
scrollTo(paneId) called target.scrollIntoView(), which scrolls every scrollable
ancestor, the embedding page included. On another site, "Map" / "Show on map"
moved the host's own page so that the map's top met the window's top, and a host
shorter than the window then showed its white space under the map. The column
is the scroller (position:absolute; overflow-y:auto) and each pane's
offsetParent, so col.scrollTo({ top: target.offsetTop }) lands the pane exactly
and leaves the page alone.
2026-10-02 09:32:00 +00:00
Doxa Maps
0d09a72bf2 check:preview-flag-dev-only: the built tree may not even NAME the preview flag
Tightened before the India tab lands. A built bundle that READS globalThis.DXM_PREVIEW_UNRELEASED would ship the
withheld path itself, behind a global that any embedding page or console can set before the element loads, so
withheld content would print from production.
- A: no file under public/ names the flag at all (was: no assignment).
- B: every source line that reads OR writes it carries import.meta.env.DEV (was: writes only), so each read
  compiles away in a build.
- Self-test: a built setter, a built read, an unguarded source setter and an unguarded source read must each
  fail; the DEV-guarded forms and comments pass.
2026-10-02 09:26:40 +00:00
Doxa Maps
f9bdd8edff Key Cities: the title and intro name clusters of pins, not where groups live
A pin's position is generalised, so a cluster of pins is not a claim about where people groups live
or about a population centre. keyCities map.title is now "Clusters of people-group pins", and
list.intro counts "{named} named clusters (names from a cited gazetteer), across {clusters} located
clusters", in all 11 locales. The country-level copy is unchanged: its rows are per country.
2026-10-02 09:24:24 +00:00
Doxa Maps
7cd40a6e8e Pin wording: shared points and key-city clusters claim only what is certain
A pin's position is generalised, so it does not tell a reader the locality or where a group is
centred.

- pins.sharedPoint in all 11 locales and ApproxPinNote.vue's fallback: the groups sharing the point
  are named and counted ("{n} groups share this dot"); the locality claim is gone.
- keyCities map.note, map.sheetNote and list.caveat.row in all 11 locales: a cluster is of
  people-group pins, not centroids, and each pin marks a people group, not a town.
- The key-cities and languages-per-city caveats in build-tabulator-tables.mjs and in every committed
  copy of those two tables (only that one field changes), derive-city-candidates.mjs's caveat, and
  the matching comments in key-cities, name-clusters and the poster generator.
- check-approx-pin-note's pass line no longer calls pins localities. Two UI-strings baseline entries
  whose strings no longer exist in their files are dropped.
2026-10-02 09:21:54 +00:00
Doxa Maps
e273d451cc Phone legend: shrinking the detail sheet past its content no longer scrolls the page
Reported from a phone (Home and Pray, the people-group detail sheet): dragging the handle down worked until the
sheet became shorter than its content; from then on the page scrolled while the finger kept dragging.
- The sheet and the detail panel's scrollers (.people-group-detail, .detail-content) contain their overscroll,
  so a list that reaches its end can never chain a scroll to the page.
- The drag handlers on the sheet and its grab lip listen in the CAPTURE phase, so every touch reaches the drag
  first and no child's handler can stop one from being claimed.
2026-10-02 09:21:04 +00:00
Doxa Maps
a56e775bf8 Pin wording: a dot marks a people group, not where it is found
Locations are generalised, so a dot's position is not a claim about where a people group lives.
The pin notes now say only what is certain: a dot marks a people group, not a town or a boundary,
and its position is approximate.

- pins.approximate in all 11 locales, and ApproxPinNote.vue's fallback and header.
- gospelInternet notice.pin / notice.pins / notice.standing / facet.provinceNote in all 11 locales,
  their T() fallbacks (GiDrawer, GiMap, GiFacetRail, board) and the README line. notice.pin no longer
  takes {country}. The shared-point and internet-figure clauses are unchanged.
- gospel-resources: the province sheet's English sentence, and the `approximate` notes that
  build-gospel-by-province.mjs writes into the shipped tables. Both tables and gospel-internet.json
  are regenerated: only those notes and the generated dates change, every row is identical.
- Comments and the embed README say the same. The UI-strings baseline follows the new sentence.
2026-10-02 09:16:04 +00:00
Doxa Maps
d12d926870 packet: fork-leaders — octilinear forked leaders for paired rows
New library/packet/fork-leaders.js: a pure, deterministic router for one
paired-row leader, forking a stem at a 45° chamfer into two short legs
(one per pin), in row and trunk modes. All segments H/V/45°. Returns
polylines for drawing and a deduped segment list (stem once) so a fork
counts as one polyline for crossings, plus octilinear and through-pin
reports. Imitates the poster-render octilinear lane routing (read, not
called). Adds check:fork-leaders (both modes, 0 crossings on a 220-row
monotone set, through-pin + poison arms).
2026-10-02 09:07:49 +00:00
Doxa Maps
394d973a75 Rebuild country-posters, regions-dashboard, poster-design and my-upg-100-list for the India tab (no opener argument) 2026-10-02 09:03:39 +00:00
Doxa Maps
94abee0fd6 Rebuild country-posters, poster-design, regions-dashboard for the region data change
country-posters.json is statically imported by these three bundles (via
countryPosterType.js, poster-styles.vue and regions-list.vue), so the region
re-derive stales their built output. Rebuild the three, regenerate the tree
(manifest + leaf pages) and refresh SRI. The composite-freshness gate named
exactly these three; the other 26 bundles are unaffected. Only these three
bundle .js change; the doxa-maps-spa leaf updates its embedded integrity hash
for country-posters.
2026-10-02 08:56:25 +00:00
Doxa Maps
b3daa34ab1 P2 (2/2): five more lines without "design note" as a person, in the UPG-100 data scripts
clusters.json (one decision_pending value; the field is not in the built tree), retag-adm1.mjs (a
comment and a console message), search-index.js and uncovered-proof.mjs (comments) state the reason
without a persona. derive-city-candidates.mjs's safety_note no longer repeats "separate".
2026-10-02 08:51:19 +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
249e69f2a5 Merge the pilot (development cf0146775) 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 08:48:59 +00:00
Doxa Maps
8b83c34a79 P2: comments state the reason without quoting anyone or naming a role
Seventeen lines in 15 files. Six quoted short fragments from feedback; eleven used "design note" where a
person once stood ("design note selects 2+ rows", "a design note design call"). Each now states the
reason in neutral terms and keeps the technical content and dates.
All edits are comments, except one string: the safety_note text in
library/scripts/research/derive-city-candidates.mjs, a research script that is not bundled and whose
output is not committed. No logic changes.
2026-10-02 08:45:40 +00:00
Doxa Maps
84cc385386 Rebuild country-posters, regions-dashboard, poster-design and my-upg-100-list for the DEV-only India preview at 60x96 2026-10-02 08:45:33 +00:00