Commit graph

3960 commits

Author SHA1 Message Date
Doxa Maps
151fb8f0eb Prayer Progress's ⓘ carries the approximate-location caveat; rebuild every ⓘ-control consumer
The ⓘ panel now states that a dot marks where a people is found, not a town or a boundary (noteKey
pins.approximate, the catalogue string the map's pin note used, in all 11 locales), so the caveat
stays available to a reader who asks once the phone legend stops stating it.

Also rebuilds every bundle the MapInfoButton / MapInfo change reaches, as the landing precondition
names them: research-dashboard, dashboard-plus-grid, cities-internet, gospel-resources and
doxa-research-map (their behaviour is unchanged: standalone is opt-in), plus doxa-simple-map for the
note. Then tree + SRI.
2026-09-30 06:36:49 +00:00
Doxa Maps
d03b24e613 Prayer Progress carries its own "What can this map do?", so the ⓘ works wherever the map is embedded
On a partner page or a standalone preset page the ⓘ control rendered nothing, because only the
gallery answered it and the ⓘ's text lived in the gallery's settings. Now the map carries its info
(plugin-designs/doxa-simple-map/src/mapInfo.js) and a host only adds placement:

- MapInfoButton gains an opt-in `standalone` prop. When no host answers and the map carries info, it
  asks the map for a popup of its own (the 'standalone' event). If a real host appears later, the
  map's popup is dropped and the host takes over. Never inside the gallery (its panes carry
  data-doxa-gallery): there the gallery alone decides, its own info:false included.
- MapInfo gains `popupOnly` (with trigger 'control'): no floating button, since the map's control is
  the only button; it answers that control from inside the map, points at it once per page load,
  and opens the same popup (the bottom sheet on phones). It announces itself as local, so the
  control can tell it from a real host.
- Prayer Progress mounts that popup beside its control column, only when asked.

Per preset: the text describes the prayer map, so a map that shows the Prayer tab has info (the full
profile and the prayer preset); the engagement-only and adoption-only presets have none and show no
ⓘ, as before. A host's profile-config info:false removes the ⓘ. Every other MapInfoButton consumer
is unchanged (standalone is off by default).

doxa-simple-map grows by 20,590 bytes raw (5,699 gzipped), for compiling MapInfo. Rebuilt
doxa-simple-map and doxa-maps-spa, then tree + SRI.
2026-09-30 06:15:11 +00:00
Doxa Maps
1a26e4116c Merge remote-tracking branch 'origin/development' into HEAD
# Conflicts:
#	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-30 06:07:39 +00:00
Doxa Maps
a78c86ce36 Merge origin/development into studio/phone-place, and rebuild cities-internet + doxa-maps-spa from the merged source 2026-09-30 05:54:47 +00:00
Doxa Maps
7d1ea68212 Merge origin/development into studio/phone-place, and rebuild the phone-placement bundles from the merged source 2026-09-30 05:49:57 +00:00
Doxa Maps
bca5932172 Merge remote-tracking branch 'origin/development' into HEAD
# Conflicts:
#	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-30 05:49:29 +00:00
Doxa Maps
11cb626de9 Merge origin/development into gospel/info-control
# Conflicts:
#	public/dx-maps/cities-internet/cities-internet.js
#	public/dx-maps/cities-internet/connectivity-list/index.html
#	public/dx-maps/cities-internet/connectivity-map/index.html
#	public/dx-maps/cities-internet/data-tables/index.html
#	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/gospel-resources/charts/index.html
#	public/dx-maps/gospel-resources/data-tables/index.html
#	public/dx-maps/gospel-resources/gospel-dashboard/index.html
#	public/dx-maps/gospel-resources/gospel-resources.js
#	public/dx-maps/gospel-resources/resources-list/index.html
#	public/dx-maps/gospel-resources/resources-map/index.html
#	public/dx-maps/manifest.json
2026-09-30 05:42:39 +00:00
Doxa Maps
c3523ae1fc The ⓘ panel on a phone is a bottom sheet over the map, not a full white page
On phones (up to 767px) the "What can this map do?" panel opened as a full-screen page: a few
lines of text at the top of an empty white screen, reading as a new page rather than a panel.
It is now a bottom sheet:

- it sizes to its content, up to 70% of the small viewport (svh, so a collapsing URL bar does not
  resize it), and scrolls inside, with its scroll kept to itself;
- the close button is 44px and stays in view in the sheet's header;
- the dimmed map above it stays visible, and a tap there closes the panel, as Escape does.

Desktop is unchanged. Rebuilt doxa-maps-spa (the only bundle that compiles MapInfo.vue), then
tree + SRI.
2026-09-30 05:35:46 +00:00
Doxa Maps
3d5cd9ab74 Rebuild 5 library-reach composites left stale by the parallel build (all-people-groups, cities-internet, demo-map, gospel-internet, prayer-walk-planner) 2026-09-30 05:28:47 +00:00
Doxa Maps
ed1091f59b Merge remote-tracking branch 'origin/development' into big-picture-plugin/bp-c3-header
# 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/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-30 05:16:14 +00:00
Doxa Maps
7378832cc9 On a phone, Cities' and Gospel Resources' control column starts below the folded legend
The ⓘ is now the column's top control, and its one-time pointer runs sideways from it across the
map's top band. On a phone that band is these maps' legend (title and fold button), and MapToolbar's
phone rule put the column at top:72px inside it, so the pointer lay over the legend's title and
buttons. Below 700px the column now starts 8px under the FOLDED legend's measured bottom, whatever its
height in each language. It is measured only while folded and before the toolbar exists, so opening
the legend never moves the controls. Desktop is unchanged.

Rebuilds cities-internet and gospel-resources, with their pages and the two manifests.
2026-09-30 05:06:12 +00:00
Doxa Maps
17ce1bf9a9 Merge remote-tracking branch 'origin/development' into studio/phone-place
# 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/doxa-simple-map/doxa-simple-map.js
#	public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html
#	public/dx-maps/manifest.json
2026-09-30 05:03:17 +00:00
Doxa Maps
b227f76085 Merge remote-tracking branch 'origin/development' into big-picture-plugin/bp-c3-header
# 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/doxa-simple-map/doxa-simple-map.js
#	public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html
#	public/dx-maps/manifest.json
2026-09-30 05:01:31 +00:00
Doxa Maps
4181f37396 Rebuild 5 composites with fresh children + regenerate tree/SRI 2026-09-30 04:56:46 +00:00
Doxa Maps
f6c2e92846 Full tree rebuild on merged development (BP-C3 header buttons + PP2 grace) 2026-09-30 04:48:50 +00:00
Doxa Maps
688ea384de Rebuild doxa-research-map and doxa-maps-spa for Simple Research's ⓘ control 2026-09-30 04:48:21 +00:00
Doxa Maps
6b05bd242c Simple Research: "What can this map do?" becomes the map's top round control
The research map draws the ⓘ as the first button of its own control column (MapInfoButton), and the
gallery's Simple Research row switches to trigger: 'control' in the same commit, so the tab never
shows two ⓘ, and never shows none. At mount the map tells the gallery that its control is coming, so
the floating ⓘ does not flash while a slow phone loads. A failure or an unmount withdraws that
promise, and the floating ⓘ comes back at once. On a page with no gallery nothing answers, and the
map is unchanged.
2026-09-30 04:48:20 +00:00
Doxa Maps
792d4e1ae9 Cities with Internet and Gospel Resources tell the gallery their ⓘ is coming
Their control column renders only once the map exists, after the data, which can take tens of
seconds on a slow phone. At mount each map now tells the gallery's MapInfo that a control is on its
way (Prayer Progress's announcement), so MapInfo waits for the map instead of flashing its floating
ⓘ first. A failure or an unmount before the map exists withdraws the promise, so the floating ⓘ
shows at once. Gospel's single-card page builds no map and promises nothing.

Rebuilds cities-internet and gospel-resources, with their pages and the two manifests.
2026-09-30 04:48:10 +00:00
Doxa Maps
947133d259 Merge prayer-progress-plugin/info-pending (step A) into gospel/info-control
# 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-30 04:46:37 +00:00
Doxa Maps
5cbabe7ffa Cities with Internet and Gospel Resources: "What can this map do?" is the top of their control column
The ⓘ becomes the first round control in each map's own column (MapInfoButton, as Prayer Progress
has it), and each tab's gallery row says trigger: 'control', so there is exactly one ⓘ: the control.
MapInfo keeps its fail-open, so a page where the control never arrives still gets the floating one.

Rebuilds cities-internet, gospel-resources and doxa-maps-spa, with their pages and the two manifests.
2026-09-30 04:44:32 +00:00
Doxa Maps
3d462ec308 The ⓘ control's pointer: once per page load, gone after a click or a tab change, no checkbox
Every map whose ⓘ is its own control (MapInfo trigger 'control') now gets the same pointer:
it shows the first time that control is on screen in a page load, and goes for the rest of the
load once the reader opens the popup or leaves the tab. A full reload shows it again. This is
page-load memory, never storage, so the popup offers no checkbox in control mode: the "Keep
tooltip turned on" box and its string (all 11 locales) are removed, along with the pointerKeep
prop that selected this model per tab. Floating-mode maps keep their stored model and their
"don't point again" box, unchanged.

Leaving the tab is read from the pane (hidden or inert), on the control's intersection change
and the existing 1.5 s measurement tick.

Rebuilt doxa-simple-map (it ships the mapInfo catalogue) and doxa-maps-spa, then tree + SRI.
2026-09-30 04:41:04 +00:00
Doxa Maps
8a271596ce Merge remote-tracking branch 'origin/development' into big-picture-plugin/bp-c3-header
# 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-30 04:34:58 +00:00
Doxa Maps
f7f9c66853 WIP: partial build outputs (to be replaced by the full rebuild) 2026-09-30 04:33:59 +00:00
Doxa Maps
d7b496c6b1 Prayer Progress tells the gallery its ⓘ is coming, so the floating one never flashes on a slow load
Prayer Progress draws its control column only once the style and the people-group data are in,
which on a slow phone can take longer than any fixed wait, and then the gallery's floating ⓘ
appeared and was swapped for the control. Now the map announces at mount that a control is on its
way ('dxmaps:mapinfo-pending'), and MapInfo waits for the map instead of a clock.

- A known failure (the map reports an error) or an unmount before the map is ready withdraws the
  announcement, and the floating ⓘ shows at once.
- While a control is pending, the 30 s wait becomes a 90 s backstop (time on screen), so an
  unreported failure still gets a floating ⓘ.
- A map that never announces anything keeps the 30 s wait, and pages with no MapInfo are unchanged.

Rebuilt doxa-simple-map and doxa-maps-spa, then tree + SRI.
2026-09-30 04:32:55 +00:00
Doxa Maps
e6bf86ff1e Merge remote-tracking branch 'origin/development' into studio/phone-place
# 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/doxa-simple-map/doxa-simple-map.js
#	public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html
#	public/dx-maps/manifest.json
2026-09-30 04:32:28 +00:00
Doxa Maps
d0de376f4a Big Picture header: rounded-square ⓘ left of a rounded-square Share
The dashboard header gains an info button ("What can this map do for you?") to
the left of Share. Both are rounded squares at the vertical tabs' radius
(--vtl-radius), matching the app's own roundedness; map controls stay round.

Built as a reusable, parameterized header-button form so other dashboards adopt
it by prop, not by copy:
- MapControlButton: new shape="rounded-square" (border-radius: var(--vtl-radius,8px)).
- ShareButton / MapInfoButton: a shape prop forwarded to MapControlButton;
  ShareButton also squares its rotating ring so a round ring never wraps a square.
  Defaults stay 'round' — every existing consumer is unchanged in behaviour.
- research-dashboard DashboardTopBar mounts the ⓘ and Share as one header-button
  group, sized to the bar with the 44px tap target kept for both. DOM order
  [ⓘ, Share] puts ⓘ at the logical start: left in English, right of Share in
  Arabic (the flex row reverses under rtl).
- doxa-maps-spa dashboard-plus-grid tab -> trigger:'control', so the tab's
  MapInfo is driven by the header ⓘ and the gallery's floating ⓘ is suppressed:
  exactly one ⓘ, fail-open. No new strings (reuses mapInfo.open, 11 locales).
2026-09-30 04:27:44 +00:00
Doxa Maps
a77ea9d512 Merge remote-tracking branch 'origin/development' into HEAD 2026-09-30 04:27:17 +00:00
Doxa Maps
3359f48fb1 Merge remote-tracking branch 'origin/development' into studio/phone-place
# Conflicts:
#	public/dx-maps/cities-internet/cities-internet.js
#	public/dx-maps/cities-internet/connectivity-list/index.html
#	public/dx-maps/cities-internet/connectivity-map/index.html
#	public/dx-maps/cities-internet/data-tables/index.html
#	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/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/doxa-simple-map/doxa-simple-map.js
#	public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/index.html
#	public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html
#	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 04:18:59 +00:00
Doxa Maps
3b933aefd4 Prayer Progress: round, spaced controls again, and no floating ⓘ while the map loads
The control column goes back to the library's round, spaced buttons at every width; the square
grouped card read too compact, on phones most of all. The ⓘ stays the top control.

In control mode, MapInfo no longer shows its floating button before the map's control has
announced itself. The map draws its column only once it is ready (style and people-group data),
so the floating ⓘ appeared for a moment and was then replaced by the control. The wait is bounded
at 30 s of time on screen, counted only while the pane is visible and not inert: measured column
arrival times run from 7 to 19 s on a local serve, so a shorter wait expired inside a normal load
and flashed late. If no control arrives, the floating button shows, so there is still always a way
to open the popup. Once a control has announced itself, measurement alone decides, as before.

MapInfo's plain <script> block (the page-load pointer memory) now sits above <script setup>, so
check:setup-order no longer reads it as used before its definition; its explanation moves into
<script setup> so the library index keeps the component's own description. Compiled output is
unchanged by the move.

Rebuilt doxa-simple-map and doxa-maps-spa (the only bundle that compiles MapInfo.vue), then
tree + SRI.
2026-09-30 04:17:28 +00:00
Doxa Maps
d256687676 plugin-designer skill: reusable by default, pilot before roll-out, one shape per kind of control
Three rules for work that spans plugins, in section 3 (Reuse library/ first):
- A component that could serve more than one plugin is built once in library/,
  driven by props, and landed through the build owner, so other plugins adopt it
  instead of copying it. This replaces "Graduate late".
- A new pattern starts on one plugin, built by its owner. A maintainer approves it on
  the dev server, and only then do the other owners adopt it in their own plugins.
- Map controls are round and spaced: MapToolbar's default column of round
  MapControlButtons, not its grouped square card. Dashboard header-bar buttons are
  rounded squares with the vertical tabs' radius, var(--vtl-radius, 8px).
2026-09-30 04:10:45 +00:00
Doxa Maps
c7cb739a6d Merge origin/development into exp-shepherd/pp-info-control-2 at the landing turn 2026-09-30 03:53:30 +00:00
Doxa Maps
148f3cffe6 Merge origin/development into exp-shepherd/pp-info-control at the landing turn 2026-09-30 03:48:23 +00:00
Doxa Maps
57c1613192 Rebuild the five LegendMobile bundles and the gallery for the phone placement, and regenerate the tree 2026-09-30 03:46:30 +00:00
Doxa Maps
fa01a77799 Prayer Progress's pointer: once per page load, and "Keep tooltip turned on"
- pointerKeep maps (Prayer Progress only) point ONCE PER PAGE LOAD: the pointer shows the first time
  the map is on screen in a load. Opening the popup hides it for the rest of that load, and the next
  full load shows it again. The memory is a module-scope Set (pointerDoneThisLoad), because the gallery
  remounts a heavy tab's MapInfo on every switch back. It is marked when the pointer is on screen, not
  on mount. Nothing about it is persisted any more (no seen write in show() or hide()).
- The keep box (still stored, per map) keeps the pointer after the popup closes and on every
  appearance. A page-load pointer ignores the every-map off switch, which is not offered beside it.
- The label is "Keep tooltip turned on" (en), with de retuned to match; the other nine already say
  "keep ... on".
- Rebuilt doxa-simple-map and doxa-maps-spa, then tree and fix:sri.
2026-09-30 03:46:30 +00:00
Doxa Maps
d83c89f287 Phones: the gallery's ☰ moves into a bar above the pane, off every map
The floating ☰ circle sat in the bottom-left corner of whatever map was open.
It covered Simple Research's search box and the licence credit on Cities and
Gospel Resources (in Arabic, mirrored, the credit's other end). On a phone
(narrow and headerless, the circle's own condition) the ☰ now sits in a 44px
bar above the pane, beside the open view's name. The layout no longer
publishes a fab clearance, so the maps' bottom corners return to their plain
insets. Desktop and header-on layouts are unchanged.
2026-09-30 03:44:22 +00:00
Doxa Maps
8133f28b6b Phones: only the sheet's handle resizes it, and its list keeps a fling to itself
In the detail view a thumb on the content resized the sheet whenever the
content could not scroll that way, so reading the list moved the sheet. Only
the handle (the drag strip and the title row) starts a resize now; below it
the content scrolls, in every mode.

The sheet's list gets overscroll-behavior: contain (the list only, not the
pane), so a fling that reaches its end stops there instead of scrolling the
page behind the map.
2026-09-30 03:44:22 +00:00
Doxa Maps
7c9979e08b Phones: the open legend sheet fits its content, up to 45% of the map, and every map starts collapsed
The open state was a fixed 30% of the map: a three-row legend sat in a mostly
empty sheet, and a long tree scrolled inside one. At rest in the open state the
sheet now takes its content's height, capped at 45% of the map. A drag still
sets an explicit height; the collapsed and fully open states are unchanged. The
detail view's mini image follows the open sheet's real top edge.

The start state was a race. Every map's own mount code means collapsed on a
phone, but uiStore.init() measures the breakpoint in a ResizeObserver whose
first callback runs after mount, so Simple Research read the 'desktop' default
and started open on every load at 390, while Prayer Progress started
collapsed. The sheet now applies the collapsed start state itself, once, the
first time it sees the phone breakpoint, unless a people group is selected.
2026-09-30 03:44:22 +00:00
Doxa Maps
f7cdbd30ce Phones: the legend sheet sits above the map's credit, and the pin caption shows in every sheet state
The open sheet covered the licence credit and the Mapbox wordmark (measured at
390 on Simple Research: the top element at both was the sheet's content). The
bottom corners now stay at the map's bottom edge and the sheet sits above a
strip measured from the real boxes of both engines' bottom controls.

The approximate-location caption sits in that strip, under the sheet. It shows
once whether the sheet is open or collapsed (it was 0 when collapsed), and the
pin-hint pill, which lifts itself clear of the sheet's top, never lands on it.
2026-09-30 03:44:21 +00:00
Doxa Maps
79a426822c Merge remote-tracking branch 'origin/development' into regions/sparse-consistent 2026-09-30 03:41:13 +00:00
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
48a1a747ba Prayer Progress: "What can this map do?" is the top of its own control column
- Prayer Progress's column becomes the engine's square grouped card (controls="square"). Its first
  control is MapInfoButton, which opens the gallery's MapInfo for the tab. The gallery's tabInfo
  'prayer-map' entry now uses trigger 'control', so the floating button hides while that control is
  on screen, and shows again (fail-open) whenever it is not.
- MapInfo, control mode: the first-visit pointer now points at the control. Its place is measured
  against the pane (which scrolls) and goes on the control's physical inner side, so an Arabic page,
  whose column mirrors to the left, gets the pointer on the right with the arrow reversed. It shows at
  every width: the under-1200px rule was measured for the floating pointer crossing each tab's top
  strip, and does not apply here.
- MapInfo, pointerKeep (prayer-map only): the popup offers "Keep tooltip activated" instead of the
  every-map "don't point again" box. It is off by default, and opening the popup retires the pointer.
  Checked, the pointer keeps showing on every load. It is stored per map.
- mapInfo.keepPointer in all 11 locales.
- Rebuilt doxa-simple-map and doxa-maps-spa, then tree and fix:sri.
2026-09-30 03:31:15 +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
915a317ebe MapInfoButton: an unanswered control adds no child to the column
A v-show-hidden button is still a child, so it took the square toolbar's
:last-child corners (MapToolbar controls="square") from the last button a
reader can see, on every page where no host answers (a standalone leaf, a
partner page). Found by exp reading the bridge.

The control now asks from the toolbar's own element (MapToolbar provides it
as mapToolbar.el), or from its placeholder's parent, and renders its button
only once a host has answered (v-if). The rendered button then announces
itself, so the host measures and focuses the real element.
2026-09-30 03:22:54 +00:00
Doxa Maps
2fd2462797 The fold buttons say "legend" in Spanish and Arabic, not a key for a lock
Cities with Internet's and Gospel Resources' fold buttons translated "key" literally: "Clave" and
"المفتاح" name a key for a lock. They now use each language's word for a map legend, the one the
maps already use elsewhere: "Leyenda" and "وسيلة الإيضاح".

Rebuilds cities-internet and gospel-resources, with their pages and the two manifests.
2026-09-30 03:15:32 +00:00
Doxa Maps
b4664aa67e MapInfo can answer a map-control info button (MapInfoButton), fail-open
The "what can this map do for you?" button can now live IN a map's control
column instead of floating over it. This is the bridge only: nothing changes
until a map adds the control and its gallery tab sets trigger: 'control'.

- map-controls/MapInfoButton.vue (new): a MapControlButton with the info
  icon and the localized mapInfo.open label. Clicking it sends a bubbling,
  composed 'dxmaps:mapinfo-open' event out of the plugin's shadow root to
  the gallery pane. On mount it asks 'dxmaps:mapinfo-control' and shows
  ONLY if a MapInfo on the same pane answers (ack), so a standalone leaf or
  a partner page never shows a button that opens nothing. A MapInfo that
  mounts later broadcasts 'dxmaps:mapinfo-host' and the button asks again.
- info/MapInfo.vue: new prop trigger, 'floating' (default, unchanged) |
  'control'. In control mode it listens on its own pane: it acts only on
  events whose composedPath contains the pane, and stops them there. Its own
  floating button and pointer hide ONLY while the announced control is
  MEASURED usable: connected, a non-zero on-screen rect, and in no
  inert/aria-hidden subtree. It is re-measured by IntersectionObserver and
  ResizeObserver plus a 1.5 s fallback timer, never inferred from an unmount
  event. Escape and close return focus to the control when it is on screen,
  else to the floating button. aria-expanded is kept on the control.

Proved on a UPG-100 pilot served locally (gallery page, 1440, MapLibre and
Mapbox, en and ar), exactly one info button on screen at every step:
wall 1 floating; Map 1 control (it wins its hit test and sits inside the
toolbar column); opened from the control, Escape closes it with focus back
on the control; toolbar hidden 1 floating, shown again 1 control; tab away
and back 1; back to the wall 1 floating. 0 page errors. That pilot's wiring
is not in this commit.
2026-09-30 03:11:40 +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
766d829028 Merge origin/development into gospel/cities-legend-fold 2026-09-30 02:57:55 +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
0288d3d083 Merge remote-tracking branch 'origin/development' into bundler-2/sr-band-first-screen 2026-09-30 02:53:10 +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