Commit graph

3809 commits

Author SHA1 Message Date
Doxa Maps
bd8ec6d29f Rebuild doxa-maps-spa on the merged source, and regenerate the tree 2026-09-29 20:41:30 +00:00
Doxa Maps
8bec9ac294 Merge origin/development into studio/examples (the SR caption; generated files take development's side and are rebuilt next) 2026-09-29 20:41:13 +00:00
Doxa Maps
9cf5a68696 Big Picture's table headers come from mapInfo, so the gallery stops carrying all of 'dashboard'
The four headers are copied verbatim, in all eleven locales, from dashboard.json into mapInfo.col
(peopleGroup, country, region, population); no string is retranslated. Measured with areasForBundle:
doxa-maps-spa carried [buttons, dashboard, grid, mapInfo, messages] and now carries [buttons, grid,
mapInfo, messages]. The bundle drops from 420,172 to 371,064 bytes (136,998 to 124,005 gzipped).
2026-09-29 20:37:39 +00:00
Doxa Maps
c934f8020e Merge remote-tracking branch 'origin/development' into upg100/mapinfo-toplayer
# 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-09-29 20:35:44 +00:00
Doxa Maps
fa7720cc93 Caption for Simple Research's example packet, in all eleven locales
mapInfo.tab.research-map-plus-grid.examplePacket ("Example packet: Middle
East Core"), the titleKey the gallery puts on that tab's pages example so
the packet reads as an example zone. The gallery bundle carries the mapInfo
area, so it is rebuilt.
2026-09-29 20:31:40 +00:00
Doxa Maps
f46134771e Merge origin/development into studio/bp-example 2026-09-29 20:28:42 +00:00
Doxa Maps
4a153d5b7b Big Picture's info popup shows real output: an excerpt of its spreadsheet
Big Picture's export is a spreadsheet, so its example is a kind:'table' excerpt (sr): the six largest
groups by population, of 2,107, with the live table's own column keys (dashboard.people_group,
.country, .region, .population), so the popup header and the table's header cannot drift.

Cost, measured: those keys bring the 'dashboard' area into the gallery bundle, which grows from
369,635 to 420,172 bytes (123,536 to 136,998 gzipped, +13.5 KB). The alternative, header keys
duplicated into 'mapInfo' in eleven locales, is a translation job for after the demo.
2026-09-29 20:25:42 +00:00
Doxa Maps
b8c7e9a391 Rebuild the five packet consumers for the unrounded totals, and regenerate the tree 2026-09-29 20:21:28 +00:00
Doxa Maps
7795eba447 The knows-Christ totals come from the unrounded share
Only the printed percentage rounds. A large list at 0.004% is tens of
thousands of people, which printed as 0 when the total was computed from
the rounded figure; a share below the last printed digit now reads
"<0.01%" beside its real total. check:evangelical-share asserts it.
2026-09-29 20:20:02 +00:00
Doxa Maps
588e28e10c Merge remote-tracking branch 'origin/development' into upg100/christian-page 2026-09-29 20:15:02 +00:00
Doxa Maps
b4b15fcd71 Rebuild the five packet consumers for the people-based knows-Christ page, and regenerate the tree 2026-09-29 20:14:55 +00:00
Doxa Maps
bb1241d1ee Merge origin/development into studio/sections 2026-09-29 20:10:38 +00:00
Doxa Maps
c00bf1034f Regenerate the library index for usePaneConfig, which landed without it (check:library-index) 2026-09-29 20:10:25 +00:00
Doxa Maps
d78e485643 "Who among them knows Christ" counts people, not weeks
The page reused the life calendar's grid and counted its shaded boxes in
weeks ("0.61% · 32 weeks"), under a week axis and a year axis, with a lede
calling it "one human life in weeks". On this page a box is an equal share
of the list's PEOPLE, so the same 5,200 boxes are now drawn with no week or
year axis, and the legend states each side in people: how many follow
Jesus and how many do not yet, each with its share (the two percentages
sum to 100 as printed), plus how many people one box stands for. Numbers
are formatted in the reader's locale.

The labels become "Followers of Jesus" / "Not yet following Jesus" and the
lede drops the weeks, in all eleven languages; the served strings file is
re-pinned. check:evangelical-share asserted the weeks figure; it now
asserts the people totals, the bare percentage and the absence of weeks
and axes, with the life page (which keeps its axes) as the negative
control. check:packet-variants found the grid by an exact class string
and now matches the class prefix.
2026-09-29 20:08:55 +00:00
Doxa Maps
70d87f6a3c Rebuild doxa-maps-spa for the published section order, and regenerate the tree 2026-09-29 20:00:58 +00:00
Doxa Maps
fa69209035 The gallery's published section order: Prayer Progress before the UPG-100 List
The Deep Research page publishes the rail as Dashboards (Big Picture, Simple Research, Regions),
Prayer Mobilization (Prayer Progress, UPG-100 List), Gospel Research (Cities with Internet, Gospel
Resources), then the Experimental folder. Only the Prayer Mobilization pair moves. Big Picture now
says "desktop only" on every width, not only once a phone has disabled it.

check:spa-tab-order asserted the old four-name order with UPG-100 first; it now asserts all seven
published rows in order (still relative, with tab 1 positional). It needs a browser: rega runs it.
2026-09-29 20:00:36 +00:00
Doxa Maps
40e5876a96 Rebuild the five card consumers for the name sizing, and regenerate the tree 2026-09-29 19:58:04 +00:00
Doxa Maps
e018ec47b3 A long people-group name is never cut off on a prayer card
The name now sits in a narrow box beside the photo, and the dataset has
16-letter single words (Pagativeshagallu, Liechtensteiners) that would have
overflowed it sideways and been clipped without a sign. The size steps by
the longest word as well as the length, and overflow-wrap:anywhere is the
last resort.
2026-09-29 19:56:47 +00:00
Doxa Maps
db56766667 Merge remote-tracking branch 'origin/development' into upg100/card-photo-sharp 2026-09-29 19:54:55 +00:00
Doxa Maps
0bb66b99ad Rebuild the five bundles the card-photo change reaches, and regenerate the tree
country-posters, doxa-research-map, my-upg-100-list, regions-dashboard and
upg-neighbor all print cards through library/packet/card-render.js.
2026-09-29 19:51:01 +00:00
Doxa Maps
a569868fef Merge remote-tracking branch 'origin/development' into regions/country-map-refetch 2026-09-29 19:44:14 +00:00
Doxa Maps
b6fe075e92 Prayer-card photos print sharp: sized from their pixels, not stretched
The people-group photos are small: every one sampled across the dataset is
at most 200 px wide, typically 200x250, and the API offers no larger
variant. The card stretched that across its full top band with
object-fit:cover, so a poker card printed a face at about 80 ppi and a
postcard at about 50: visibly blurred, on the one part of the card that
is a person.

The photo is now a framed portrait at the source's own 4:5 shape, sized
from its pixels at 180 ppi (about 1.1 x 1.4 in), on a warm band with the
name beside it (below it on a landscape card). Every stock prints a
200 px photo at about 190 ppi inside its frame. A bigger card gets more
room around the face, never a bigger, blurrier face.
2026-09-29 19:43:58 +00:00
Doxa Maps
b3e67c7f2b Merge remote-tracking branch 'origin/development' into bundler-2/panelang 2026-09-29 19:38:36 +00:00
Doxa Maps
2b210b78f0 Merge remote-tracking branch 'origin/development' into regions/country-map-refetch
# Conflicts:
#	package.json
2026-09-29 19:36:16 +00:00
Doxa Maps
0adb75a0c8 Rebuild research-map-plus-grid for the locale re-forward
Step 4 of the landing preconditions names this composite alone: it is the only
source that changed.
2026-09-29 19:35:19 +00:00
Doxa Maps
cff06fb8e6 Merge origin/development into studio/deep-research 2026-09-29 19:34:32 +00:00
Doxa Maps
b0d08224c1 A live language switch never reached the panes inside Simple Research
The composite re-pushed its FILTER state to the map and the grid on every
change, and nothing else. So a host switching language moved the composite's own
chrome and stopped there: the outer element received the new profile-config,
the push re-parsed each child's EXISTING attribute, and the boot `lang` survived
every write. Measured on a live en to ar switch: the map and the grid both stayed
English while the frame around them changed.

The panes were never at fault. Each child's own chain is fully reactive -- it is
reactive to its own prop, and its prop was frozen.

The map now carries the locale in the same push that carries the filters. The
grid needs its own line, because its three linked facets travel as separate
attributes while its language travels in profile-config, which this composite
set only when a host supplied a list, and never again. And a locale change now
triggers a push at all: the existing watchers cover filter state only.

The grid write is conditional so an unchanged locale writes nothing. That
matters here more than it looks: setting a pane's attribute makes it re-filter
and emit, and the composite reads those emissions -- which is what the `pushing`
guard above exists for, after a measured round trip once cancelled a selection
the composite had just applied.

Verified two-sided by driving the real pushToChildren against stub elements:
the locale reaches both panes, and a repeat at the same locale adds no write.
Removing the map's line fails that assertion alone and leaves the grid's passing.
2026-09-29 19:30:31 +00:00
Doxa Maps
7a5c9bd9fa Merge remote-tracking branch 'origin/development' into regions/pane-config-land 2026-09-29 19:30:06 +00:00
Doxa Maps
4f44a9b23e Rebuild doxa-maps-spa with every tab's info text, and regenerate the tree 2026-09-29 19:29:36 +00:00
Doxa Maps
525ce20a10 Merge origin/development into studio/deep-research (every tab's mapInfo text) 2026-09-29 19:29:04 +00:00
Doxa Maps
bd566e0d18 Merge remote-tracking branch 'origin/development' into regions/pane-config-land 2026-09-29 19:24:39 +00:00
Doxa Maps
c6f9e11427 The info popup keeps Tab inside it, as aria-modal promises
Tab from the last control wraps to the first, and Shift+Tab from the first
to the last, reading the focused element from the shadow root.
2026-09-29 19:22:10 +00:00
Doxa Maps
19339aacbf Rebuild regions-dashboard after merging development
The pane re-forward is compiled into this bundle, and landing-preconditions
step 4 named regions-dashboard as the only consumer the library change reaches.
Built with BUNDLE=regions-dashboard, then tree, then fix:sri.
2026-09-29 19:17:46 +00:00
Doxa Maps
37f3aa1221 All seven gallery tabs carry their info entry; a tab whose text is not bundled shows no button
Each production tab reads mapInfo.tab.<tabId>.lead and .takeaway, and Regions also its note, with
the India/China reasoning beside it. Only files already in the tree are listed as examples (the
UPG-100 poster); the rest join when their shots land. A tab's button renders only when its lead
key resolves in the bundled catalogue, so a key that has not landed yet hides the button instead of
opening a popup of raw key names.
2026-09-29 19:17:42 +00:00
Doxa Maps
74d2d67f19 Every map's "what can this do for you?" text, in one catalogue area
Adds the lead and takeaway for six more maps to mapInfo, keyed by the
gallery's tab ids (cities-internet, gospel-resources, dashboard-plus-grid,
research-map-plus-grid, prayer-map, regions-dashboard), plus the Regions
note, in all eleven locales. Each map's owner wrote and checked its own
text; this commit only gathers it, because the gallery ships one area and
one lane editing its eleven files cannot collide with another.

Checked mechanically before writing: every locale present, keys free of
dots (the gallery resolves keys by splitting on them), no numerals, every
locale different from English, and every string in its own locale's
script, since a stray character from another script passes every other
catalogue gate.
2026-09-29 19:17:14 +00:00
Doxa Maps
a1d9a1e318 Merge origin/development into studio/deep-research (MapInfo as landed; upg100's files take development's side) 2026-09-29 19:16:45 +00:00
Doxa Maps
656503a28d Merge remote-tracking branch 'origin/development' into regions/pane-config-land
# Conflicts:
#	package.json
2026-09-29 19:12:46 +00:00
Doxa Maps
e643e8a30e country-map: key the refetch by value, let only the newest response win, show the wait
Three defects on country-map/country-map, which is production -- DX Life's
country pages. Found by auditing the element rather than from a report.

1. ANY profile-config change refetched all 2,106 records. The watch getter
   returned a NEW ARRAY literal, and Vue compares a watch value with Object.is,
   so a fresh array always reads as changed; both computeds read the injected
   cfg, so the effect re-ran on every config change and the callback then fired
   unconditionally. MEASURED with real Vue: flipping isDark refetched the whole
   endpoint and redrew the map, and so did a host adding pinHint. A joined
   STRING compares by value, so only a real language or country change refetches
   -- which must still refetch, because the API localises the names.
   This was latent waste until the composite re-forward made config writes
   routine. It is now on every upstream locale switch, so the two changes are
   complementary rather than independent.

2. A SLOW EARLIER RESPONSE OVERWROTE A NEWER ONE. loadPoints is async and had no
   sequencing at all -- 0 abort or generation tokens in the file -- so two runs
   could be in flight and the one that STARTED first could FINISH last. Both
   assigned points, so the map showed the previous country's pins with no error
   and nothing for the reader to notice. Every run now takes a ticket and a stale
   ticket writes nothing: not the points, not loadFailed, not the spinner the
   current run is still using. fetch is left to complete rather than aborted,
   because the response is cached for the next switch back.

3. `loading` WAS WRITE-ONLY: assigned in three places and read in none, zero
   template references. A reader on a country page waited on an empty map -- no
   outline, no pins, no message -- which is indistinguishable from a country that
   genuinely has no people groups, and this element fetches the whole list before
   it can draw one pin. "Loading results..." was already in the catalogue in all
   eleven locales, so saying so cost no new string and no parity debt.

check:country-map-refetch guards all three. It drives the REAL reactive chain
with real Vue and takes the watch key expression OUT OF THE SHIPPED SFC, because
bug 1 is entirely a question of what Vue considers changed and is invisible to
any test that fakes reactivity or re-types the watch.

Mutation-tested, 5 mutations, all caught by name. The first version of the gate
MISSED one: a bare /if \(!current\(\)\) return/ grep matched the guard in the
catch block, so removing only the guard before the points write still passed.
The assertions are positional now -- the guard must sit immediately before the
assignment it protects -- and the catch guard is asserted separately. That hole
existed because the behavioural half of the test reproduced the guard's shape
inside the gate instead of reading the component, which is the self-consistent
oracle this repo's other geometry gate explicitly warns against.

Registered in scripts and gates:pre, verified by re-parsing: one key, 107
checks. Bundle rebuilt (BUNDLE=country-map), then tree, then fix:sri.
2026-09-29 19:11:37 +00:00
Doxa Maps
f0eb339512 Merge remote-tracking branch 'origin/development' into upg100/map-info2 2026-09-29 19:11:10 +00:00
Doxa Maps
93f809ebcd A map explains itself: an info button, a one-time pointer and an example popup
MapInfo (library/components/info) answers "what can this map do for
you?" with real output the map makes, pre-generated so it opens at once.
The examples are an ordered list of kinds rather than a fixed set,
because maps make different things: an image (a poster), pages (a packet
that shows its first page and expands to every page), a deck (cards that
expand from a stack to a grid) and a table (a real excerpt of the
spreadsheet a map exports, with translatable headers). An example whose
image is missing drops out quietly: no broken-image icon, no empty frame.

The pointer at the button goes for good once that map's popup has been
opened and closed; a checkbox in the popup turns it off on every map.
Both are kept in localStorage behind a guard, so private browsing cannot
break the page. On a phone the popup takes the whole screen; Escape
closes it and focus returns to the button. The pointer's motion stops
under prefers-reduced-motion.

All of its text is one new catalogue area, 'mapInfo', in all eleven
locales: the component's own words, and each map's lead, takeaway and
note as mapInfo.tab.<tabId>.<field>. One area because a bundle ships only
the areas its source names, and the gallery that mounts a popup per map
names none of the maps' own areas. This commit carries the UPG-100
map's two sentences; the other maps' follow.
2026-09-29 19:08:02 +00:00
Doxa Maps
b33d970cd4 The gallery's tab keys live in mapInfo only, so the gallery bundles that one area
A key in a map's own area either renders blank in the gallery or, named literally, pulls that map's
whole catalogue into the gallery bundle (internal/i18n-areas.mjs). Measured with areasForBundle:
development's doxa-maps-spa carries buttons, grid, messages; this branch carries buttons, grid,
mapInfo, messages, and no upgMap. The UPG-100 entry reads mapInfo.tab.upg-100.lead and .takeaway,
which upg100 adds with every tab's strings.
2026-09-29 19:05:52 +00:00
Doxa Maps
32cf3f2354 Merge remote-tracking branch 'origin/development' into exp-shepherd/simple-map-embed 2026-09-29 19:02:39 +00:00
Doxa Maps
462c0babf7 Each gallery tab can explain itself: the MapInfo button, per tab, from src/tabInfo.js
The library MapInfo (an info button, a one-time pointer and a popup of real, pre-generated output)
is mounted in each pane whose tab has an entry in src/tabInfo.js, with the gallery's live locale and
its assets base. UPG-100 is the first entry, with its poster; its packet pages and card deck join
when their files are in the tree, because a missing file would show "not available" to the audience.
Regions and the other tabs follow as their owners' keys land. profile-config info:false removes the
buttons.
2026-09-29 19:00:06 +00:00
Doxa Maps
2a7a0d88e3 Merge upg100/map-info (MapInfo) into studio/deep-research, to mount it per tab 2026-09-29 18:57:42 +00:00
Doxa Maps
2ee03f3f64 Rebuild doxa-simple-map (the tablist bar) 2026-09-29 18:57:37 +00:00
Doxa Maps
76f35d8ccd Merge origin/development into studio/deep-research 2026-09-29 18:57:33 +00:00
Doxa Maps
a85afc8b71 Prayer Progress: a multi-tab bar is a tablist, and says which tab is selected
The research page now gives this map three tabs (engagement, prayer,
adoption). With two or more tabs the bar was a row of plain buttons: a screen
reader heard three buttons, with nothing saying they are tabs or which one is
showing. The bar is now role=tablist, each button is role=tab with
aria-selected, and the buttons are type=button. A one-tab instance shows no
bar, so it is unchanged.
2026-09-29 18:56:53 +00:00
Doxa Maps
a2809b31fc Merge origin/development into studio/hygiene 2026-09-29 18:52:35 +00:00
Doxa Maps
5224e6c4d0 Merge remote-tracking branch 'origin/development' into upg100/map-info 2026-09-29 18:52:29 +00:00
Doxa Maps
baf47f2279 Rebuild my-upg-100-list for the two new upgMap strings, and regenerate the tree 2026-09-29 18:52:23 +00:00