Commit graph

3856 commits

Author SHA1 Message Date
Doxa Maps
838f6c14b6 Merge remote-tracking branch 'origin/development' into upg100/examples 2026-09-29 22:25:44 +00:00
Doxa Maps
c8fde78522 Merge remote-tracking branch 'origin/development' into bundler-2/dirclear-ready 2026-09-29 22:18:12 +00:00
Doxa Maps
e704bdbbf8 Merge remote-tracking branch 'origin/development' into upg100/examples 2026-09-29 22:17:24 +00:00
Doxa Maps
99c22caf72 Merge origin/development into studio/examples 2026-09-29 22:14:22 +00:00
Doxa Maps
9c5ac8094b The UPG-100 info popup's examples: Middle East Core's packet pages and card deck
Twelve packet pages and seventy prayer cards, rendered from the current
renderers (people-based knows-Christ page, page-filling grids and charts,
sharp card photos) and shot in the fleet's shared browser: pages at 1500px
reduced to 1200px wide, cards at 480x672, WebP q80, 2.8 MB. They ship under
previews/examples/middle-east-core/, which the existing previews staging
copies into the tree, and the popup's pages and deck examples read them.
Middle East Core is the packet covering the most people in unengaged groups
(IMB GSEC 0-1).
2026-09-29 22:07:17 +00:00
Doxa Maps
b9514d68d3 On a phone the info button takes each tab's free corner
At 390 the desktop offsets landed on each composite's own top chrome: Regions' and UPG-100's view
selector and Gospel's search box (probe, en and ar). A tab's pos can now carry `narrow`, laid over
it while the shell is narrow (max-width:760px): Regions and UPG-100 put the button at the START of
their strip, which is empty on a phone; Gospel takes the corner above its zoom column. The same
probe then reports no interactive element under the button on any tab, 1440 and 390, en and ar.
The one-time pointer still lies over the selector or search box until first opened; it takes no
clicks (pointer-events:none).
2026-09-29 22:02:08 +00:00
Doxa Maps
a40f5ac686 Merge remote-tracking branch 'origin/development' into upg100/fill-2 2026-09-29 21:58:39 +00:00
Doxa Maps
c79e26a089 Middle East Core's stored poster and preview, regenerated with tonight's renderer
The stored poster (data/posters) and its wall preview predated the ink pin
badge: 57 pin numbers drawn white on the zone hue, 1.44:1. They are what the
UPG-100 info popup shows and opens ("Open full size"). Regenerated from the
current poster-render in its stored 3x4 format (1500x2000) and published;
the pin numbers are now white on #1c1c17, 17.10:1. The preview and the
1500px download are made from a 3000px shot of the regenerated sheet with
make-previews' own sizes and qualities (a 3x4 sheet now makes a 420x560
thumbnail; the wall letterboxes it). The other 27 stored zone posters are
fallback-only and follow after the demo.
2026-09-29 21:50:51 +00:00
Doxa Maps
81a84138c9 Regions and UPG-100: the info button sits clear of their Share button too
A geometry probe (every visible interactive element in every shadow root, intersected with the
button's box, 7 tabs in en and ar at 1440) found the default position covering each composite's Share
button exactly, which no screenshot showed. They take side 56px like the map tabs. With that, the
probe reports no element under the button on any tab in either direction; before this branch it
reported Zoom in/out under it on Prayer Progress, Cities and Gospel and Share on Big Picture.
2026-09-29 21:40:54 +00:00
Doxa Maps
30ca27a84f README: Deep Research as DX Life now publishes it, and development as the branch work lands on
From dx-maps' measurement on development 17d1a07cf; docs only.
Required, because the README contradicted the final page layout (/research shows the research map by
itself, with a link to /deep-research; /deep-research holds the gallery):
- The drop-in paragraph said DX Life's /research is filled with the Research Gallery. It now says the
  drop-in copies the folder into public/dx-maps, and /research shows the research map with a link to
  /deep-research, which holds the gallery as Deep Research.
- The JavaScript-embed section:
  - heading, lead and "one embed replaces the research map" now describe /deep-research;
  - the screenshot shows an earlier build (the gallery on DX Life's research page, the tabs in the old
    order), so its alt text and a caption now say so. A reshoot is rega's.
Also, each a one-line factual fix (the README's structure is unchanged):
- The name, once where the gallery is introduced: the Research Gallery, which DX Life publishes as Deep
  Research. The other 22 mentions and the headings, whose anchors other text links to, are unchanged.
- 7 vs 8 production maps: the eighth is the country map, for DX Life's country pages, not in the gallery.
- development is where work lands, and main moves only on a publish: the goals table, the swarm
  section's two sentences, and the glossary.
- Both production grids now follow the gallery's section order (Prayer Progress before UPG-100 List).
- The embed heading's status reads "✅ works today", the README's own legend for ✅, instead of "production":
  the page is not live on DX Life's production site yet (dx-maps' pre-read).
check:readme-size, check:doc-scripts, check:no-new-driver-references and check:link-coverage pass.
2026-09-29 21:37:17 +00:00
Doxa Maps
9013d5cf46 Rebuild the five packet consumers for the page-fill re-shape, and regenerate the tree 2026-09-29 21:36:53 +00:00
Doxa Maps
190e7665a7 The packet's low pages fill the sheet: measured, then re-shaped
Measured in a browser (content's bounding box against each sheet, en/de/ru):
the knows-Christ grid ended 72% of the way down its sheet (478px of blank
paper below), and the two single-chart sets pages 60% and 69% (702px and
525px). The same 5,200 boxes now lay out 65 x 80 in 14.5px squares, which
spends the height on bigger boxes; the sets charts (SVG, so they scale) grow
from 960px to 1320px (bounded, nothing below it) and 1240px (centered, room
for its ring legend, which widens with it). Now 88%, 79% and 84% of the
height, with no page clipped in en, de or ru. The width classes are hung on
the row (set-solo-<kind>), not on the page, so no page class name enters the
shared stylesheet.
2026-09-29 21:34:14 +00:00
Doxa Maps
92b90d0767 Rebuild doxa-maps-spa on the merged source, and regenerate the tree 2026-09-29 21:28:20 +00:00
Doxa Maps
63f6071c61 Merge origin/development into studio/examples (MapInfo's logical placement; generated files take development's side and are rebuilt next) 2026-09-29 21:27:40 +00:00
Doxa Maps
933687b146 Merge remote-tracking branch 'origin/development' into upg100/reread-fixes 2026-09-29 21:21:51 +00:00
Doxa Maps
17d1a07cf8 README: the one-map recipe regenerates the tree too, so a .meta.json change reaches the pages
From exp's second read of 4bcce8ff8. "BUNDLE=<map> bun x vite build && bun run fix:sri" is right for a
code change, but a change to the map's .meta.json reaches its pages and the manifest only through
bun run tree. Without it the leaf page ships the old settings, and the landing scan's step 2b refuses
the stale tree. The recipe is now "BUNDLE=<map> bun x vite build && bun run tree && bun run fix:sri".
The tree step takes a few seconds and changes nothing when nothing changed.
2026-09-29 21:14:06 +00:00
Doxa Maps
ab74357844 Merge remote-tracking branch 'origin/development' into upg100/reread-fixes 2026-09-29 21:13:46 +00:00
Doxa Maps
63f74d51f3 Rebuild doxa-maps-spa for the info button's placement and the new popup text, and regenerate the tree 2026-09-29 21:12:54 +00:00
Doxa Maps
11554f40b6 The info button sits clear of each map's own controls
At the default 12px from the top and the end of the line, the button covered the zoom-in button on
Prayer Progress, Cities with Internet and Gospel Resources (a control nobody could click), Big
Picture's header buttons, and Simple Research's tab bar, in English and, mirrored, in Arabic
(rega's 1440 captures, exp's second read). Each tab now carries its placement in src/tabInfo.js,
passed as MapInfo's own --map-info-top/--map-info-side: 56px from the end beside a zoom column,
46px down below Big Picture's header bar, 56px down below Simple Research's tab bar. Regions and
UPG-100 keep the default. MapInfo itself now places by the logical end of the line (upg100), so the
gallery passes no direction.
2026-09-29 21:12:54 +00:00
Doxa Maps
0341c83475 Big Picture's and Simple Research's popup text reads as one sentence after its label
MapInfo prints the takeaway after a bold label ("What you take away:"), and the two tabs' takeaways
opened with an imperative, so every locale stuttered ("What you take away: Take away the rows...").
All 22 takeaways are now noun phrases written to follow that locale's own label, and the two
Portuguese leads move to Brazilian Portuguese to match the catalogue. The claims are unchanged:
Big Picture yields a spreadsheet only; Simple Research yields a poster and a prayer packet. Text by
simpleresearch; 24 strings, only these keys.
2026-09-29 21:12:53 +00:00
Doxa Maps
60a6b9de9e Rebuild the gallery for the logical-side info button, and regenerate the tree 2026-09-29 21:08:42 +00:00
Doxa Maps
8b8f1fda79 The info button sits at the END of the line, so Arabic mirrors it
The button and its pointer were placed with a physical right:12px, so on an
Arabic page, where a tab bar starts at the right, they covered the first
(active) tab. They now use inset-inline-end / inset-inline-start (LTR is
unchanged), and under dir=rtl the pointer's arrow glyph and its nudge are
flipped so it still points and moves toward the button. --map-info-top and
--map-info-side remain the per-tab overrides.
2026-09-29 21:08:13 +00:00
Doxa Maps
3bfaa24238 Rebuild the card consumers and the gallery for the re-read fixes, and regenerate the tree 2026-09-29 21:07:27 +00:00
Doxa Maps
4bcce8ff87 Merge origin/development into repo/reread-readme-fix at the landing turn 2026-09-29 21:04:28 +00:00
Doxa Maps
d38e066ce2 The info popup's stacked-pages hint is visible
The shadow card behind a packet's first page sits at z-index:-1; without a
stacking context of its own it was painted under the dialog's white
background and never seen. isolation:isolate on the stack keeps it just
behind the page.
2026-09-29 21:04:26 +00:00
Doxa Maps
614c3248d3 Card names hyphenate only where a word cannot fit
hyphens:auto on every name let the browser split ANY word at a line end, so
multi-word names could break mid-word ("Northern Conchu-/cos"), which is
worse on a people group's name than the unhyphenated break it replaced. The
previous commit is reverted; hyphenation now applies only to names holding a
14+ letter word (12 of 2,107), with hyphenate-limit-chars:10 4 4 so a short
word is never split: the only multi-word ones are "Deaf <X>", and Deaf
stays whole.
2026-09-29 21:04:26 +00:00
Doxa Maps
1000a7ab5c Revert "A card name that must break mid-word gets a hyphen"
This reverts commit 7cdf72bfd4.
2026-09-29 21:03:46 +00:00
Doxa Maps
fcbb7bbf8e sync-dropin: a build config that won't parse fails loudly, even under --if-present
From studio's review of 87f10ceda. configDest swallowed a JSON parse error, so with a malformed
vite.doxa-maps-build-config.json (one trailing comma from a hand edit), --if-present read it as "no
destination configured" and exited 0. The build went green and never refreshed the site. The parse
error is now recorded when the file EXISTS. Under --if-present or --from-config the command exits 1
with "build config unreadable: <file>: <error>", even with DOXA_DROPIN=off. A config file that is
absent, or one with no dropin.dest, still skips.
Tested 7 ways:
1. dest configured, host absent: skip, exit 0.
2. host present: 1,208 files copied, exit 0.
3. no dest key: skip, exit 0.
4. no dest key, plain --from-config: exit 1.
5. trailing comma: exit 1, "build config unreadable".
6. trailing comma with DOXA_DROPIN=off: exit 1.
7. no config file: skip, exit 0.
The config was restored byte for byte (cmp).
2026-09-29 21:03:15 +00:00
Doxa Maps
225eadef11 README: a one-map build needs fix:sri; a snippet is pasted whole; the agent table names maps honestly
Found re-reading 10be43d2b:
- "BUNDLE=<map> bun x vite build" alone leaves the map's pages and the manifest pinned to the OLD hash,
  so the map's own page and any pasted snippet refuse the new file. It is now followed by bun run fix:sri.
  Measured two-sided: one byte added to a pinned map's built file made check:sri FAIL (4 of its pages
  disagreed); fix:sri rewrote them and the manifest, and check:sri PASSED. The probe files were restored.
  A one-map build rewrote only that map's .js, never the manifest or a page.
- "A snippet is two parts" was wrong. The snippet also preloads the map engine and sets
  window.MAP_APP_API_URL, so the README now says to paste it whole and names what it does.
- The agent table:
  - Cities with Internet works by country (internet use), so it moved from "Reach a city" to
    "Plan outreach". The production maps work by country and region; city-level planning (Prayer Walk
    Planner) is experimental, and the row says so.
  - Maps carry the names the app shows (Simple Research, UPG 100 List).
  - "Frozen" was a tonight-only rule; the line now reads "leave them as they are unless your task is one
    of them".
2026-09-29 21:00:07 +00:00
Doxa Maps
87f10ceda0 sync-dropin --if-present: no configured destination is a skip too, not a failed build
Found re-reading 2a4c3ddb3. With dropin.dest removed from the config (a site that doesn't use DX Life)
and no DOXA_DROPIN_DEST, the full build's last step printed the usage line and exited 1, after a build
that had passed. The host is optional, so --if-present now skips there as well. Without --if-present a
missing destination is still refused.
Tested: no dest configured with --if-present skips (exit 0); the plain command still exits 1; a configured
but absent host still skips (exit 0). The config was restored byte for byte after the test.
2026-09-29 21:00:07 +00:00
Doxa Maps
be3184207c Merge remote-tracking branch 'origin/development' into upg100/page-fill
# 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/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
#	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-09-29 20:54:55 +00:00
Doxa Maps
1ab8524cfb Merge remote-tracking branch 'origin/development' into regions/country-poster-hue 2026-09-29 20:45:42 +00:00
Doxa Maps
d0cbca5f4a Rebuild the five packet consumers for the grid reflow and the card-name hyphens, and regenerate the tree 2026-09-29 20:42:52 +00:00
Doxa Maps
b605b30ae1 Rebuild the three consumers stale after the merge
landing-preconditions step 4 named country-posters, my-upg-100-list and
regions-dashboard; each built with BUNDLE, then tree, then fix:sri. No source of
another plugin changed -- their bundles catch up with the shared library they
already import.
2026-09-29 20:42:01 +00:00
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
42537f11c9 The knows-Christ grid fills the page: the same 5,200 boxes, 80 x 65
52 columns exist only because a year has 52 weeks; on the knows-Christ page
a box is a share of people, and at 52 x 11px the grid used about half the
sheet's width. Without axes the same 5,200 boxes are laid out 80 x 65 (both
divide 5,200, so the rectangle is whole), the columns stretch to the frame
and the cells stay square, still shaded from the top in reading order. The
height this frees goes to a larger legend. The life calendar keeps its 52
week columns and its axes.
2026-09-29 20:41:29 +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
92ceebbcf5 Merge remote-tracking branch 'origin/development' into upg100/page-fill 2026-09-29 20:40:44 +00:00
Doxa Maps
78d57a4ab7 Regenerate the tree after merging development
The merge's conflicts were all generated output, resolved by taking
development's side and regenerating rather than hand-merging bundles.
2026-09-29 20:38:06 +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
1980c9000e Merge remote-tracking branch 'origin/development' into regions/country-poster-hue
# 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/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
#	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-09-29 20:37:20 +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
f6a3f85a2c Rebuild the three consumers of the shared country-hue rule
The rule lives in library/packet/posterSheets.js so the browser and the Node
generator cannot disagree, which puts it in every bundle that generates a country
sheet. landing-preconditions step 4 named country-map, country-posters and
regions-dashboard; each built with BUNDLE, then tree, then fix:sri.

No source of country-posters changed -- only its compiled bundle catches up with
the library it already imported.
2026-09-29 20:32:09 +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
aea1c359b7 Rebuild the four bundles for capture-at-mount 2026-09-29 20:31:05 +00:00
Doxa Maps
1fd562c28e Read the page's own direction at mount, not at our first write
The clear-only-ours fix recorded the host's dir lazily, inside the rtl branch,
the first time it wrote. That is correct only while nothing else has written a
direction first. If anything set dir="rtl" on the host before that moment, the
element recorded rtl as "the page's own declaration" and then faithfully
restored it on every switch away from Arabic -- so the direction never cleared,
which is the defect this whole change exists to remove.

Measured on the Big Picture leaf: ar left rtl, and zh put rtl straight back,
while its three siblings with the same code passed. The difference was not the
code; it was that something writes rtl on that host before the element does.

Reading the attribute on the FIRST call instead, before any write of ours, is
the only moment it is certainly the page's and not ours. A page that genuinely
declares dir still owns that decision and still gets it back.

Five cases driven against the real function in all four files: no dir at boot,
a page declaring ltr, a page declaring rtl, an element mounting while already
Arabic, and -- the case that reproduces the failure -- a FOREIGN writer setting
rtl after mount and before ours. Restoring the lazy capture to one file fails
that fifth case alone and leaves the other four passing.
2026-09-29 20:31:04 +00:00
Doxa Maps
4a715e8c37 Rebuild the four bundles for the locale-key and direction fixes 2026-09-29 20:31:04 +00:00
Doxa Maps
d975337501 Push the locale under both keys, because every reader prefers one of them
The push wrote `lang`. Every reader takes `locale` FIRST and only then falls
back to `lang`: ProfileLoader.vue:189, and people-groups-grid.vue at :273 and
:380. So writing one key is correct exactly while no child config carries the
other, and stops working silently the day one does -- a `locale` left by a boot
copy or a host-list path would shadow every fresh `lang` we push, for the rest
of the session, with both values sitting in the same object.

Writing both keeps them in step whatever put them there.

Not broken today: the nested configs were measured carrying no locale key at
all. This closes the class rather than a symptom, which is worth one line.

Shown by driving the real function: with a stale {lang:'en', locale:'en'} the
push now yields ar in both keys, and a config carrying only `locale` switches
too. Reverting to the lang-only write leaves {lang:'ar', locale:'en'} -- the
exact shadowing above, where the map reads English while holding a fresh lang.
2026-09-29 20:31:04 +00:00
Doxa Maps
75baaa82a6 Rebuild the four bundles that carry the direction fix
big-picture, dashboard-plus-grid, research-map-plus-grid and people-groups-grid
each hold one of the four reflectDir copies, so the source change reaches a
reader only once their bundles carry it.

Confirmed in the built bytes by a marker the minifier cannot rename:
removeAttribute("dir") goes from 0 occurrences to 1 or 2 in every one of the
four. The two-counts are the composites, which bundle the grid's copy as well as
their own. Checking for _dirPrev instead would have proved nothing, because a
local variable is renamed in minified output.

Hashes rebaked; check:sri passes across every leaf.
2026-09-29 20:31:04 +00:00
Doxa Maps
77415cf361 Switching from Arabic to Chinese left the page right-to-left
Every element that sets a reading direction did it one way: if the locale was
RTL it wrote dir="rtl", and there was no else. So a reader who moved from an
RTL locale to an LTR one kept the right-to-left layout for the rest of the
session -- Chinese laid out backwards, which reads as a broken page rather than
a stale setting.

The reason the clear was missing is sound and is kept: a host page that
declares its own dir owns that decision, and blindly removing the attribute
would take that with it. So each element now remembers what it found before it
first wrote, restores that value verbatim when the locale stops being RTL, and
removes the attribute only when there was none to begin with. It clears its
own, never the host's.

FOUR elements, not the three the report named: big-picture.vue,
research-map-plus-grid.vue and people-groups-grid.vue all carry it, and so does
dashboard-plus-grid.vue -- the Big Picture composite, same shape, found by
checking the neighbours of the named lines rather than only the lines
themselves.

The comment above each one said "Only ever SET, never cleared". Left alone it
would now describe the opposite of the code, so it says what the code does.

Verified two-sided against all four shipped files, driving the real extracted
function: it clears what it set, preserves a host's own dir, and still sets rtl.
Restoring the one-way body to one file fails exactly the first two and leaves
the third passing, with the other three files unaffected.
2026-09-29 20:31:04 +00:00