Commit graph

3910 commits

Author SHA1 Message Date
Doxa Maps
50ff504dc9 Rebuild the three consumers of the SPARSE print change
posterSheets.js and poster-render.js are compiled into every bundle that prints
a poster; landing-preconditions step 4 named regions-dashboard, my-upg-100-list
and country-posters as stale. Each built with BUNDLE, then tree, then fix:sri.
2026-09-30 03:34:58 +00:00
Doxa Maps
1728372a1e Reshoot the 173 country previews in the SPARSE layout
The country poster previews were the dense layout -- small facts table, both
vision columns, a smaller map -- while every UPG-100 thumbnail is SPARSE. Now
that the click-time print is SPARSE too, the stored country previews have to be,
or the card and the print disagree.

Generated with SPARSE=1 and checked BEFORE any browser time:
  · the generator's own layout guards: 173 of 173 ok, octilinear, 0 diagonals.
  · SPARSE on all 173: 0 sheets draw a dense-table element; all 173 carry the
    bold "N UPG's" count.
  · real values: 0 sheets show 0, NaN or blank population. Worst cases by UPG
    count: Sudan 105 / ~20.7M, Brazil 103 / ~63K, Laos 95 / ~968K.
Shot on the fleet's shared Chromium (no private browser), one page at a time:
173 of 173, 0 failed, all 3000x3000, none blank. Smoke-tested and looked at
first: Sudan shows the bold facts row, no vision columns, "1 of ~170 maps".

ALL 173 CHANGE: 173 source thumbnails, 173 full-size and 173 served previews
differ from development, 0 strays, nothing written to a stray library/ path.

China is deliberately NOT here: its thumbnail stays the dense "map 174 of 174"
it has tonight. Its print becomes SPARSE with "map 1 of 1" via the small-total
guard. The remaining numbering difference is R-CHN-SERIES-TIER, a product call
after the demo.
2026-09-30 03:30:10 +00:00
Doxa Maps
42db98180f A tiny series prints its exact count, not a rounded ~0
The SPARSE series line rounds its total to tens -- 173 reads as ~170, 28 as ~30
-- because a series that large is read as a size, not counted. Below ten the
rounding breaks: China is the only 3x4 country sheet, so its tier has one member,
and Math.round(1 / 10) * 10 = 0 printed "1 of ~0 maps".

Under ten the line now states the exact count, "map 1 of 1" -- the same text
the dense layout already prints for China, so the move to SPARSE is not a
regression for it on the print.

PROVED: China rendered SPARSE reads "— map 1 of 1" with 0 occurrences of "~0";
and Sudan rendered after this change is BYTE-IDENTICAL to Sudan rendered before
it, so no series of ten or more changes -- the 173 country sheets and the
UPG-100 zones are unaffected.

Not decided here: China's thumbnail says 174 of 174 and its print 1 of 1. That
is per-tier against whole-series numbering, the pre-existing R-CHN-SERIES-TIER,
left for a product decision after the demo.

poster-render.js is sha384-pinned; re-pinned so check:poster-render-pinned
accepts it.
2026-09-30 03:05:49 +00:00
Doxa Maps
16dca4d266 Posters drawn at the click use the SPARSE layout, like their stored thumbnails
The bold header on a poster -- the UPG count and population set large, a
bigger map, and no "Jesus' Strategy to Feed the 5000" / "What is a Prayer List"
columns -- is the SPARSE layout, the "thumbnail-worthy" design. The `posters`
script generates with SPARSE=1, so every stored thumbnail has it. But the env
handed to the generator in the browser carried only FORMAT and POSTER_DATE, so
EVERY sheet drawn at the click -- UPG-100 and country alike -- fell back to the
dense layout.

MEASURED on FINAL (two UPG-100 zones, Northwest and South-Central India): the
thumbnail shows the SPARSE header; the print the reader actually gets shows the
small facts table, both vision columns and a smaller map. That is the reported
"the country poster looks worse than the UPG-100 poster" -- the comparison was a
SPARSE thumbnail against a dense sheet.

(a) posterSheets.js passes SPARSE for every POSTER format and NOT for 'packet'.
    That is exactly the split the two build scripts make: `posters` sets
    SPARSE=1, `packets` does not. The renderer's formats are 3x4, 3x3, letter and
    packet, so 'packet' alone keeps the full layout its pages were built around.

(b) check:poster-browser-equiv's poster case now runs the Node side with
    SPARSE=1 as well. It used to compare dense with dense, so it passed while no
    reader ever saw that layout on a card. The packet case stays dense on both
    sides. PASS: country-npl 909026 bytes on each; asia-india-gujarat (packet)
    835047 on each.

The stored UPG-100 thumbnails are untouched by this. What changes is the PRINT,
which now matches them.
2026-09-30 02:53:15 +00:00
Doxa Maps
948012a003 Rebuild regions-dashboard, my-upg-100-list and country-posters from the merged source in the lock 2026-09-30 02:45:58 +00:00
Doxa Maps
b4079cc9d2 Merge remote-tracking branch 'origin/development' into regions/mobile-posters-2up
# 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-09-30 02:44:56 +00:00
Doxa Maps
c964c79db8 Merge remote-tracking branch 'origin/development' into upg100/status-badge-credits 2026-09-30 02:40:37 +00:00
Doxa Maps
eab8963a20 Regions: two country posters per row on a phone
Reported from a phone: on the Regions tab, "2 posters per row" for the country
posters did not work -- a 390px phone showed ONE per row.

THE CAUSE is a deliberate clamp in PosterWall. The per-row setting is 2, but the
grid is Math.min(perRow, fits) with fits = floor((viewport - 36) / 210), and at
390 that is floor(354 / 210) = 1. So the setting said two and the phone silently
showed one.

★ WHY THE CLAMP EXISTED, AND WHY IT IS SAFE TO RELAX NOW. It was added when a
two-up card (~162-170px) CLIPPED its action labels -- 'Prayer List' and 'Poster
Map' both read 'Pra...', and Romanian's 'Pachet de cartonase' was measured at 54
of 81 controls clipped at ro/390. That was then fixed separately: the labels WRAP
(.pfs > .pbtn, "a label too long for its box wraps"). With wrapping in place the
clamp no longer protects anything; it only costs the phone a column.

★ IT IS OPT-IN, NOT A GLOBAL CHANGE. PosterWall is shared by twelve files,
several of them frozen experimental maps. A new minCardPx prop defaults to 0,
which means the existing 210px clamp, so every wall that does not set it lays out
byte-for-byte as before. Only regions-list sets 150, which gives two per row at
360, 390 and 414, still one at 320 (which genuinely cannot hold two), and no
change on desktop (already capped at the per-row setting of 2).

MEASURED on the regions-list leaf page, this branch served locally, against
FINAL on :4611 -- by hit test and by eye:
  FINAL  @390 en   1 per row, 367px cards
  AFTER  @390 en   2 per row, 169px cards, 0/123 labels clipped
  AFTER  @390 ro   2 per row, 0/123 labels clipped   <- the old clipping corner
  AFTER  @390 ar   2 per row, RTL, 0/84 labels clipped
  AFTER  @1440 en  2 per row, unchanged
0 horizontal overflow and 0 console errors in every cell. The print buttons now
stack three high on a phone card instead of sharing a line.

KNOWN, COSMETIC, NOT CHANGED: at two-up the card's "53 UPG · Show on map" pill
wraps "Show on / map" onto a second line. Readable, not clipped.
2026-09-30 02:33:24 +00:00
Doxa Maps
a83b836160 Merge origin/development into studio/no-campaign 2026-09-30 02:31:41 +00:00
Doxa Maps
8dbad994f9 Merge remote-tracking branch 'origin/development' into upg100/status-badge-credits 2026-09-30 02:25:30 +00:00
Doxa Maps
e9530994a1 Rebuild upg-neighbor for its movement wording, and regenerate the tree 2026-09-30 02:18:26 +00:00
Doxa Maps
c1763ebff9 No "campaign" in the DX Maps UI: the near-neighbor planner speaks of movements
The word is a military term, and the Driver asked for "prayer movement(s)" / "mobilization movement"
instead. The five user-facing strings in all eleven locales (55; the translated word too: Kampagne,
campaña, حملة, अभियान, 宣传活动 …) now say movement, in each language's natural church usage: Russian
"движение" with "вдохновить" rather than "мобилизовать", Arabic "حركة" with "تحفيز" rather than "تعبئة",
Chinese "宣教动员" rather than 宣传 (propaganda) or 运动; the Portuguese lines move to Brazilian forms like
the rest of the catalogue. The instance title and the meta note follow, and the CSV exports' column
headers become bridge_language / bridge_language_code (a user sees them in every spreadsheet).
Identifiers stay: the "view":"campaigns" profile-config value (embeds pass it), the i18n key names,
file and function names, and the campaigns-server references.
2026-09-30 02:17:14 +00:00
Doxa Maps
b609202f5c Keep the UPG-100 status badge off the map credits
The badge sat at bottom:10px right:10px, z-index 5: the corner both engines
keep their attribution in. It won every hit point of the OpenStreetMap
credit on both engines in English and Arabic. In Arabic the list panel
mirrors onto that corner, so the badge also covered the panel's pin note,
and the panel itself lay over the top of the credit line.

- The badge sits at the inline end (right in English, left in Arabic),
  6px above --upg-credit-floor: 30px for the tallest single-line credit
  (the Mapbox wordmark) plus the lift LegendMobile gives the engine
  corners on a phone. z-index 1 keeps it under the engine corners, and it
  takes no pointer events.
- On phones (max-width 767px) it is hidden. It always sat under the
  collapsed legend sheet there (0 of 15 of its points visible), so this
  keeps what a phone showed.
- The batch HUD, which stacks above the badge, follows it.
- The desktop legend panel ends above the credit band where a credit
  shares its corner: Arabic on both engines (the attribution) and Mapbox
  in English (the wordmark). MapLibre in English is unchanged. The rule
  is scoped to the desktop slot; unscoped, it collapsed the phone sheet's
  panel on Mapbox.

Measured on a local serve of the upg-100-mfe leaf, 1440 and 390, both
engines, en and ar. Credit hit points before, at 1440: OpenStreetMap
0/15 in all four cases; the Mapbox wordmark 5/15 in English; in Arabic
on MapLibre every credit was 0/15. After: every credit 15/15, except
'© Mapbox' in Arabic, whose right-to-left box spans the whole credit
line and whose points go only to the neighbouring credit links. At 390
all credits are 15/15 before and after, and the sheet's panel is
unchanged (48px).
2026-09-30 01:30:49 +00:00
Doxa Maps
bff75e0995 Gospel Resources: in Arabic the people-group card opens opposite the legend, not on it
The desktop card was placed with right:14px while the legend sits at the inline start. In a
right-to-left page the legend mirrors to the right and the card stayed there, so opening any
people group or country covered the legend at every desktop width. The card now sits at the
inline end, as Cities' copy of the same rule already did. English is unchanged.

Rebuilds gospel-resources only, with its five pages and the two manifests.
2026-09-30 01:13:23 +00:00
Doxa Maps
29634ed075 Rebuild regions-dashboard on top of PINFLOOR
PINFLOOR also rebuilt this bundle for the PinHint credit fix, so it is rebuilt
here from the MERGED source rather than taken from either side of a textual
merge -- a picked regions-dashboard.js would keep one side's build and drop the
other's fix.
2026-09-30 00:04:44 +00:00
Doxa Maps
daeb1cc29b Merge remote-tracking branch 'origin/development' into regions/regions-print-series
# Conflicts:
#	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-09-30 00:04:11 +00:00
Doxa Maps
072b1ff216 Regions-tab print: pass the same series as the Country Posters wall
Every country poster printed from the Regions tab read "map 1 of 0" and "This
map is one of a 0-map set called the Country Maps" -- nonsense on a printed
poster, on the demo's showcase flow (Regions -> a country -> Poster Map). Found
by the served check on FINAL.

WHY: makeCountrySheet called generateCountrySheet with no series, so
generateSheet fell back to its default { totalGroups:0, totalLists:0, index:1 }.

NOT A REGRESSION from the one-definition change, and worth recording because it
was first reported as one. The plugin-local copy regions-list used before that
change passed no series either; across it regions-list.vue changed by exactly
one line, the import. The defect has been in the Regions print since 168b1f1bd.
The Country Posters wall was never affected because it computes its own.

THE FIX computes the series exactly as the wall does (country-poster-wall.vue):
the tier is every country printed at the same sheet size, the total is that
tier's length, and the index is the country's position in it by id. It lives in
ONE place, seriesFor() in the library, rather than as a second inline copy of the
wall's formula -- the same duplication this branch's parent removed for the sheet
itself. regions-list passes the FULL country list, not a region's sublist:
indexing a region's own list would print "map 3 of 12" beside a thumbnail that
says "map 57 of 173".

PROVED, rendered with the values seriesFor returns:
  Sudan  index 1 of 173  ->  "map 1 of 173"  |  "one of a 170-map set"
  Chad   index 4 of 173  ->  "map 4 of 173"  |  "one of a 170-map set"
which is exactly the text the wall prints for the same two countries on FINAL,
measured on the served page, and what their thumbnails say. A row with no sheet
tier gets undefined, keeping the renderer's own default rather than a fabricated
position.

KNOWN, NOT CHANGED: China is the only 3x4 sheet, so its tier has one member and
it prints "map 1 of 1" / "a 0-map set" -- here AND on the wall, identically,
because this matches the wall by design. Its thumbnail says "174 of 174". Fixing
it means choosing whole-series numbering over per-tier, which is the carded
174-vs-173 question, not a freeze-night change.
2026-09-30 00:00:00 +00:00
Doxa Maps
08e7e3c681 Rebuild the 16 bundles the PinHint floor reaches, and the gallery for MapInfo's scrim, and regenerate the tree 2026-09-29 23:45:36 +00:00
Doxa Maps
b86dcc3df2 MapInfo's backdrop sits above every map's own top layer, so no pin hint floats over the dialog
PinHint's first-visit pill sits at z-index 2147482000, so with MapInfo's scrim at 1000 the pill floated
bright and clickable over the dimmed backdrop while the popup was open (gospel; measured on the live
build: the pill's centre hit the pill, not the scrim, on Cities). The scrim goes to 2147483000; the
dialog is its child, inside the scrim's stacking context, so it stays on top of the scrim. The root fix
is the top layer (<dialog>.showModal()), carded.
2026-09-29 23:45:35 +00:00
Doxa Maps
31bb8c3894 Merge exp-shepherd/pinhint-floor (the credit is a floor for the pin hint; clearance cap 120) 2026-09-29 23:38:48 +00:00
Doxa Maps
1051afd52b PinHint: the credit is a floor for the pill, wherever it has moved
The pill's clearance above the licence credit is measured in syncAttribClearance,
and that runs again only when the credit RESIZES. On a phone the credit is also
MOVED, lifted above the legend bar, without resizing. The clearance then stays at a
stale value, and the pill covers the credit. MEASURED at 390, on the shared
browser: on DX Life's home page the pill covered 36px of the 37px credit with the
clearance at 43px; on the leaf in ar, 36px.

clampIntoView now takes the credit's measured top as a floor, next to the fold and
the phone legend sheet. It already runs from the settle timers (1.2, 3 and 6 s)
and from the sheet and host observers, so it reads where the credit is, whatever
the clearance says.

Measured on a served tree, Prayer Progress rebuilt with this and the 120px cap,
at 390: the leaf and the gallery tab, in en and ar.
- before (development's tip): overlaps of 7, 36, 7 and 7px;
- after: 0px in all 4, with the pill's bottom 13px above the credit's top.

Library only. Every ProfileLoader consumer needs a rebuild to ship it.
2026-09-29 23:36:28 +00:00
Doxa Maps
5484b844c6 Merge remote-tracking branch 'origin/development' into regions/country-sheet-onedef 2026-09-29 23:34:15 +00:00
Doxa Maps
b3b06a29d8 PinHint: the credit clearance may reach 120px, not 72
The clearance is the strip from the credit's top to the box's bottom edge, capped
so a mis-measure cannot throw the pill up the map. The cap was 72px. On a 390px
phone MapLibre's credit wraps to two lines, and on the leaf it sits above the
bottom bar, 90px up. With the selector now finding it, the clearance hit the cap
and the pill still overlapped the credit by 6px, in en and ar (was 35px). The cap
becomes 120px: the measured need fits, and a runaway is still bounded.

Library only. Every ProfileLoader consumer needs a rebuild to ship it.
2026-09-29 23:31:26 +00:00
Doxa Maps
99783ff0f7 Merge remote-tracking branch 'origin/development' into bundler-2/rm-unmount
# Conflicts:
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/doxa-research-map/doxa-research-map.js
#	public/dx-maps/doxa-research-map/research-map/index.html
#	public/dx-maps/doxa-research-map/research-map/maplibre/index.html
#	public/dx-maps/manifest.json
2026-09-29 23:29:55 +00:00
Doxa Maps
2eb5b38027 Merge origin/development into exp-shepherd/pp-quiet-cancel at the landing turn 2026-09-29 23:22:56 +00:00
Doxa Maps
087f562e04 Reshoot the 174 country previews with the region hue and ink badges
The poster walls' card THUMBNAILS are stored WebP files, not generated at the
click, and all 174 were last shot on 09-25 -- teal. Since the region hue
landed, the PRINT has been hued, so both Country Posters and the Regions tab
showed a teal thumbnail above a hued poster. The Experimental section shows on
Deep Research, so that mismatch was visible.

Shot in one pass on the shared browser: 174 of 174, 0 failed, 0 retries,
23:00:37-23:10:07Z, one engine, DSF 2. Measured by the shooter: none blank (at
least 1,000 distinct colours each), and the count of sheets by their --zc hue
matches the region census exactly -- 41 Africa, 27 Asia, 27 Europe, 21 Middle
East, 18 Other, 17 Oceania, 14 North America, 9 Latin America. Asia is 27, not
28, because India has no sheet.

★ ALL 174 CHANGE, and that is the check that matters here. make-previews used to
write one directory too high (library/plugin-designs/..., library/data/posters)
while reporting success, so a reshoot could complete, look complete, and change
no served file at all. With that fixed, 174 of 174 source thumbnails, 174 of
174 full-size sources and 174 of 174 served previews differ from development,
with 0 untracked strays.

China was regenerated first with the whole-series count: 'map 174 of 174' and
'one of a 170-map set', where it had printed 'map 1 of 1' and 'a 0-map set'.
2026-09-29 23:18:26 +00:00
Doxa Maps
476989bab5 Merge remote-tracking branch 'origin/development' into regions/country-sheet-onedef
# Conflicts:
#	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-list/index.html
#	public/dx-maps/regions-dashboard/regions-mfe/index.html
2026-09-29 23:17:40 +00:00
Doxa Maps
2ddd8dc1e8 Merge origin/development into exp-shepherd/pp-quiet-cancel, and rebuild doxa-simple-map on the merged source 2026-09-29 23:17:05 +00:00
Doxa Maps
67fed8b79f Merge remote-tracking branch 'origin/development' into bundler-2/bp-grid-locale 2026-09-29 23:15:51 +00:00
Doxa Maps
a6372eea88 Regenerate the tree and SRI after merging development 2026-09-29 23:10:33 +00:00
Doxa Maps
c314e9421a Merge origin/development into studio/batch 2026-09-29 23:10:22 +00:00
Doxa Maps
0bf87bb50f Rebuild doxa-simple-map for the quiet cancel, and regenerate the tree 2026-09-29 23:08:17 +00:00
Doxa Maps
e4b5a3d1b1 Prayer Progress released mid-start no longer reports a failed map
Prayer Progress is a heavy gallery tab: switching away empties its slot. If the map
is still starting, initializeMap returns silently (useMapInstance's liveness
checks) and leaves map.value null. onMounted then logged "[doxa-simple-map] Map
failed to initialize, check token and container": a console error that blamed
the token for a tab switch.

Measured on development's tip, served from its committed tree, on the shared
browser, a phone in Arabic (pp-fastswitch.mjs): switched away 150 and 500 ms after
selecting the tab, 2 runs in 10 logged it. The control runs, switched away after a
full start or never switched away, logged nothing.

Same shape as the research map's quiet cancel (0c263fb60): when the map's
container is gone or detached, both failure paths return quietly. A mounted pane
that really fails still logs.
2026-09-29 23:08:17 +00:00
Doxa Maps
aaa4b8b690 A poster tier run can be told the whole series size
China's sheet printed 'map 1 of 1' and 'one of a 0-map set'. The cause is that
generate.mjs derives the series facts from the zones THIS run built --
Object.assign(SERIES, seriesFacts(zones)) -- and the two sheet tiers are separate
runs. The 3x4 tier is China alone, so totalLists came out 1, and the body
sentence rounds it (Math.round(1/10)*10 = 0) into a 0-map set.

SERIES_TOTAL overrides the derived count so a tier run can state the size of the
whole series. Regenerated China with SERIES_TOTAL=174 SERIES_INDEX=174: it now
reads 'map 174 of 174' and 'one of a 170-map set', which is what the other 173
sheets' body text already says (174 and 173 both round to 170).

NOT a defect, and worth recording because it reads like one: the header's exact
count and the body's rounded one are the SAME number by design. 173 exact and
170 approximate are not two answers.

The 173 3x3 sheets still say 'of 173' where the set is 174. Regenerating them
plus a full reshoot is about 28 minutes against tonight's hard switch, the body
text is identical either way, and the difference is only visible with two sheets
side by side. Run BOTH tiers with SERIES_TOTAL=174 to close it.
2026-09-29 23:07:20 +00:00
Doxa Maps
0cff02817f Rebuild regions-dashboard after merging development
41 commits of development merged; the merge conflicted only on built output,
resolved by regenerating rather than picking a side, so neither the countrySheet
region forwarding nor development's library changes are lost.
2026-09-29 23:02:44 +00:00
Doxa Maps
baa60ba647 Merge remote-tracking branch 'origin/development' into regions/country-sheet-onedef
# Conflicts:
#	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-09-29 22:59:27 +00:00
Doxa Maps
f3b1566c76 Rebuild doxa-maps-spa after the MapInfo pointer rule
MapInfo is imported by the gallery, so the rule is compiled into this bundle.
landing-preconditions step 4 named doxa-maps-spa alone; built with BUNDLE, then
tree, then fix:sri.
2026-09-29 22:51:12 +00:00
Doxa Maps
2d764b740d Big Picture's info button sits above its filter bar, so it can be clicked
At top 46px the button lay in the empty end of Big Picture's filter area, but that bar is a
positioned layer (z-index 55) painted over the button (z-index 20): nothing opened on click (rega,
1440, en and ar). The filter area wraps with width, so no spot below it is free at every width (at
1024 the stats row moves under a fixed offset). pos.raise lifts the BUTTON to z-index 60; the one-time
pointer stays under the bar, so no filter is covered even visually. Measured on the built tree: no
interactive element or text under the button, the button topmost at its centre, and a click opens the
popup, at 1440, 1024 and 800, en and ar.
2026-09-29 22:48:21 +00:00
Doxa Maps
3b0fb958e1 MapInfo: the one-time nudge is desktop-only, at a measured threshold
The "What can this map do?" pointer is anchored beside the ⓘ and extends ~213px
INWARD, across whatever the tab puts in its top strip. Worst overlap per width,
measured on Deep Research on the shared browser, on 99c22caf7:

     390   Regions "Region Dashboards" 1416px^2   UPG-100 1428px^2
     768   Cities legend 6560   Gospel legend 6560 + input 6240   Regions 4200
     900   Cities legend 2432   Gospel legend 2496 + input 2176   Regions 3696
    1024   Cities CLEAN         Gospel CLEAN                      Regions 2100
    1200   CLEAN                CLEAN                             CLEAN
    1440   CLEAN                CLEAN                             CLEAN

★ IT IS NOT A PHONE PROBLEM, which is how it was first reported and how I first
fixed it. It persists to 1024 and only clears near 1200, so the max-width:600px
version I wrote first would have left 768, 900 and 1024 broken on four tabs.
Two things found that: gospel counted PANELS (.gm-legend/.gm-sheet) as well as
controls -- a control-only probe misses a legend entirely -- and upg100 measured
the same shape on their own tab (768 over "Prayer Resources" and "Map", 1024 over
"Map", clear at 1200+), in en and ar.

★ ARABIC IS MEASURED, not argued. My first attempt used ?lang=ar, which does not
switch the locale -- the page stayed dir=ltr and I reported that run as invalid
rather than as an ar pass. Via DX Life's /ar/ route (dir=rtl confirmed) the
pointer is hidden and clean at 390, 768 and 1024, and at 1440 it mirrors to the
start side (x=104) and is clean there too.

★ TWO OTHER SHAPES WERE MEASURED FIRST AND BOTH WERE WORSE. Stacking it below the
button traded one collision for five: Gospel's "Resources found" chip (2010px^2)
plus the zoom +/- of Prayer Progress, Big Picture and Simple Research. Hiding
only its text shrank it to 30px but still left 675px^2 on "Region Dashboards" and
900px^2 on Gospel's search input.

⚠ NOT A PLACEMENT CHANGE, and an earlier draft of this got it wrong. It also
pinned the button's inline side at narrow widths; studio's pos.narrow values have
since landed and the buttons now sit at x=8, 12, 294 and 346 across the seven
tabs at 390. A pinned inset-inline-* here wins by specificity and would have
silently flattened every one of them. The button is placement's business; this
rule is only about the hint. 0 added lines declare --map-info-side; 0 touch
.mi-btn.

Its own block rather than the existing 600px one, which also full-screens the
dialog and has nothing to do with this.

VERIFIED AFTER THE CHANGE, en and ar: pointer hidden and 0 overlaps at 390, 768
and 1024 on Cities, Gospel, Regions and UPG-100; present and clean at 1200 and
1440.

NOT FIXED HERE: at 1440 Big Picture's pointer lies over the Religion filter by
1050px^2. Stacking it below the button there does not clear it -- it relocates it
to "Adopted" 561 + "1%" 425. The only single rule that clears that too is hiding
the pointer at every width, which deletes the affordance where it does fit. So
BP-1440 wants a per-tab placement value or a known-minor ruling; it is
pointer-events:none, so the filter still opens.
2026-09-29 22:45:49 +00:00
Doxa Maps
080dcb75ed Rebuild doxa-research-map for the quiet cancel 2026-09-29 22:45:32 +00:00
Doxa Maps
0c263fb601 A research map released mid-start no longer reports a failed map
When the reader switches tab while the research map is still starting, the gallery releases the
pane, and initializeMap returns quietly with no map. The handler logged that as "Map failed to
initialize — check token and container", so the console error landed in whichever tab was then open
and blamed the token. A released container is now a quiet cancel.
2026-09-29 22:45:32 +00:00
Doxa Maps
e3c631932f Merge origin/development into studio/batch (upg100's example images) 2026-09-29 22:33:34 +00:00
Doxa Maps
89794dc883 Rebuild the 17 bundles the PinHint fix and the gallery's example links reach, and regenerate the tree 2026-09-29 22:33:12 +00:00
Doxa Maps
1c5a6bd589 On a phone, Cities' info button takes the corner above its zoom column, like Gospel's
At 390 Cities' legend spans the same width as Gospel's (344px), and side 56px put the button on
the end of the legend title's first line (gospel's measurement; a probe that also counts visible
text under the button reports the same, 236px2). narrow side 4px, as Gospel.
2026-09-29 22:28:52 +00:00
Doxa Maps
09bb493718 Rebuild dashboard-plus-grid for the grid's language 2026-09-29 22:26:50 +00:00
Doxa Maps
f4c026501d Big Picture's grid took its language from the page URL, not from Big Picture
The grid is mounted inside Big Picture as a component, so it shares Big Picture's host, and its
direction is written onto Big Picture itself. Its profile-config carried only the list, so its
language fell through to ?lang= on the page. An English page opened with ?lang=ar therefore laid
the whole of Big Picture out right-to-left, English included.

The grid now receives the host's language under both keys, locale and lang.
2026-09-29 22:26:49 +00:00
Doxa Maps
838f6c14b6 Merge remote-tracking branch 'origin/development' into upg100/examples 2026-09-29 22:25:44 +00:00
Doxa Maps
8e081cea44 UPG-100's and Simple Research's popups show the packet and the card deck
UPG-100's info popup lists its Middle East Core poster, then the full packet's 12 pages and the 70-card
deck (upg100's pre-generated files). Simple Research shows the same 12 pages, captioned "Example
packet: Middle East Core": same renderer, method and 'full' variant, but a UPG-100 zone's data, so it
is labelled as an example rather than passed off as a Simple Research selection.
2026-09-29 22:18:35 +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
04cf5ea9e6 Merge exp-shepherd/pinhint-maplibre (PinHint clears MapLibre's credit) 2026-09-29 22:17:54 +00:00