doxa-maps/plugin-designs
Doxa Maps 334b3d6fa1 Stage the row 130 flip, and caption the chart with a total that does not move
STAGED, NOT FLIPPED. SET_FILL_MODE in GiCenteredSetMap is 'fit' — today's
behaviour, unchanged — with the alternative named beside it so the ruling is one
line and a rebuild. 'fit' is not a placeholder: it is the honest mode for a page
that cannot zoom, so the POSTER should keep it whatever the screen chooses.

The binding constraint is recorded there because it is not obvious from the
numbers: separation can never fall below twice the pin floor (5.2), and an
18.5-unit band therefore holds at most three rows, so no minSep reaches ring 2's
658 groups. minSep 7 places 931 of 2,074; minSep 5 places 1,369; minSep 4 places
1,369 — identical, which is what proves depth rather than separation is binding.
'fill-all' places all 2,074 with none under a label and ring 2 using 18 rows.

THE CAPTION states the TRUE total — the groups that have a ring — not the number
of pins currently drawn. In the dense mode the same groups read as an arc of
colour zoomed out and as separate pins zoomed in, so a caption counting what is
visible would change as the reader moved: true at every instant and misleading
overall. It joins the paragraph that already accounts for the centre, the
no-relation groups and the unmatched ones, so those four numbers reconcile
instead of competing.

centered.shown added in all eleven locales; parity and keys-exist pass, and
hardcoded-english did not rise (257, and that fall is studio's, not mine).
2026-09-29 03:34:22 +00:00
..
all-people-groups All People Groups: no DOXA group is drawn twice; the base is re-sent slim without them 2026-09-29 02:53:16 +00:00
big-picture min-height clamps height, so the pane could not hold the plugin it was pinning 2026-09-28 15:01:19 +00:00
cities-internet The embedded map drew 340px below its card, and said nothing for the 30s it took 2026-09-28 23:43:44 +00:00
country-map Say what <doxa-country-map> is, so the gate and the gallery both have an answer 2026-09-29 02:35:36 +00:00
country-posters The country map's live poster prints its legend: it read rows the legend composable never had 2026-09-29 02:35:35 +00:00
dashboard-plus-grid A relative share link works when you click it, which is why nobody caught it 2026-09-28 17:40:34 +00:00
demo-map Five plugins were silently monolingual, because the bootstrap was copied sixteen times 2026-09-28 17:40:34 +00:00
doxa-maps-spa Experimental shelf: the Wall's "?" describes the Bless poster and Social mode, in every language 2026-09-29 03:22:40 +00:00
doxa-research-map On a phone the research map offered no export at all 2026-09-29 01:33:28 +00:00
doxa-simple-map Five plugins were silently monolingual, because the bootstrap was copied sixteen times 2026-09-28 17:40:34 +00:00
doxa-vision-card Every Experimental map carries its own hosted ?, where its controls already are 2026-09-29 02:35:35 +00:00
golden-path-check golden-path-check finds its manifest from its own script, so it answers when embedded 2026-09-28 23:23:58 +00:00
gospel-internet Stage the row 130 flip, and caption the chart with a total that does not move 2026-09-29 03:34:22 +00:00
gospel-resources Arabic readers get the language code, the link gap and the population column on the wrong side 2026-09-28 23:43:44 +00:00
key-cities Eleven plugin entries import the element helper they call 2026-09-28 17:40:35 +00:00
my-upg-100-list Name the map's countries on page 1 in the packet's language 2026-09-29 02:16:33 +00:00
people-groups-grid The grid's "controls off" preset did nothing, and nothing said so 2026-09-28 22:25:30 +00:00
plugin-studio The Plugin Studio's tree says why it imitates VS Code without pointing outside the repo 2026-09-29 03:22:40 +00:00
pplr-data-maps Every Experimental map carries its own hosted ?, where its controls already are 2026-09-29 02:35:35 +00:00
prayer-walk-planner Prayer Walk Planner: on a phone the zone list opens from a ☰ Zones button instead of being hidden 2026-09-29 02:58:03 +00:00
regions-dashboard Fold the dangling-selector gate into the portedGlobals migration 2026-09-29 02:35:36 +00:00
research-dashboard Release only the hooks this instance installed 2026-09-29 00:06:53 +00:00
research-map-plus-grid Three post-landing gates green again: the library index, the capability table, Path2D 2026-09-29 02:35:35 +00:00
rudder-voice Rudder: plain streaming by default; sentence detection only while the robot voice is on 2026-09-28 17:27:13 +00:00
stack-demo Decouple prose: no go-base / nuxtbase / nuxtinator / doxa-base names in plugin comments and docs 2026-09-26 17:28:45 +00:00
template-bundle template-bundle: each screen carries its meta.json, so a copy of the starter is listed in the Plugin Studio 2026-09-29 02:01:33 +00:00
upg-neighbor UPG Neighbor: print a prayer packet of a reached group's unreached neighbours, on the shared packet renderer 2026-09-29 01:54:37 +00:00
wall-of-people-groups Every Experimental map carries its own hosted ?, where its controls already are 2026-09-29 02:35:35 +00:00
.gitkeep Rename app-profiles -> plugin-designs; build green under new naming (load-bearing paths updated, guards pass) 2026-09-17 18:18:18 +00:00
README.md plugin-designs/README: the tree is dx-maps, and a bundle's tag is its folder name 2026-09-26 01:19:53 +00:00

plugin-designs/ — where YOUR maps live

The shared template lives in ../library/ (aliased @map) — you never edit it per-map. You build your map by making a folder here, plugin-designs/<your-map>/, and composing the template's building blocks. Your folder is yours (colors, API, i18n); the template is shared (Apache-2.0, propagated to every map on the next build).

Shared vs. yours — the balance

  library/  (@map)  ── SHARED, reusable, parameterized ──►  legend · map · map-controls
        │                                                    (every map reuses these)
        │  imported by
        ▼
  plugin-designs/<your-map>/  ── YOURS ──►  the map's "main" class (the .vue profile = the Vue
        │                                  instance for that map)
        └── src/            ── YOURS ──►  this map's OWN non-reusable components, colors, API, utils

  One bundle can hold as many maps as you want — add another .vue profile and rebuild.
  • Reusable → library/. The legend, the map, the map-controls are shared, parameterized components every map reuses. Fix once, every map benefits. Never edit it to customize one map.
  • This map's own → plugin-designs/<your-map>/. It holds two things: the map's "main" class (each .vue profile is the Vue instance for that map) and that map's own non-reusable components (in src/). Nothing here leaks to another map.
  • Many maps per bundle. The bundler bundles one map or many — add another flat .vue and rebuild.

Production or experimental — every profile declares itself

Every app profile is one of two things, and experimental profiles are unlimited and encouraged — create as many as you need:

  • Experimental, not built: prefix the folder with _ — the build skips it; it just sits in code. Zero cost, zero risk.
  • Experimental, built: builds normally, but it belongs in the Experimental section of the power app's layout (nav section) — never embedded on partner surfaces.
  • Production: a real product — main sections of the power app + individually embeddable.

(The power app = the SPA layout that composes all profiles into one application.)

The pattern in one picture

plugin-designs/<your-map>/     ← one FOLDER = one BUNDLE, named after the folder
   ├── index.js               ← entry: registers the custom element, finds the profiles
   ├── overview.vue           ← one .vue = one PROFILE (flat in the folder — no profiles/ subfolder)
   └── detail.vue             ← another profile in the SAME bundle

     builds to ─────────────► public/dx-maps/<your-map>/<your-map>.js   (one file)
  • Folder name = bundle name. Folders starting with _ or . are skipped (handy for WIP).
  • Each .vue = one profile (one map screen). One bundle can hold many.
  • Pick the profile at embed time with the profile field — every profile shares one bundle:
<script src="/dx-maps/<your-map>/<your-map>.js"></script>
<your-map profile-config='{"profile":"overview","tk":"pk.eyJ..."}'></your-map>
<your-map profile-config='{"profile":"detail","tk":"pk.eyJ..."}'></your-map>

Add a map — three steps

# 1. create the folder + one profile
mkdir -p plugin-designs/<your-map>
#    index.js   ← copy doxa-simple-map/index.js, rename the tag
#    <name>.vue ← your screen, built from @map/* blocks (flat in the folder)

# 2. build
npm run build            # → public/dx-maps/<your-map>/<your-map>.js
#    (just this one:  BUNDLE=<your-map> npm run build:bundle)

# 3. embed the script tag + element (dev staging at `npm run dev` shows a paste-ready snippet)

Your three things (everything else is shared)

  • Colors — how pins are colored. Pick one the template ships (getColorStrategy('language-family')), or drop your own in plugin-designs/<your-map>/src/colors/ (start from template-bundle/src/colors/example-mode.js). Never edit @map/colors/ to recolor your map.
  • API — your map reads its data from the profile-config on the page, so the same bundle points at different data with no rebuild. DataSourceManager accepts csv (bundled file), api (one JSON URL), or rest-api (a live REST endpoint, the default). Prefer the real API over inlined JSON.
  • i18n — the template ships 11 base locales in @map/i18n/locales/. Use useI18n() for strings and RTL_LOCALES for right-to-left; add or override strings from your own profile.

The one hosting variable

The only thing that changes between hosting modes is the <script src>: a relative path when your own site serves the file, or an absolute CDN URL when a partner site serves it. The bundle is identical either way. See ../documentation/CONTRIBUTING.md for the two CDN modes and partner-site embedding.

Profile patterns (mix freely)

  • Individual — one .vue per bundle (simplest).
  • Parameterized — one profile, behavior driven by profile-config props (e.g. tabs[]).
  • Nested — one profile that renders others (workbench-style, like doxa-research-map).

See also

  • doxa-simple-map/index.js — fully commented reference bundle entry
  • template-bundle/ — minimal two-profile skeleton to copy
  • ../library/colors/README.md — the color-strategy contract
  • ../README.md — repo overview & build pipeline · ../documentation/CONTRIBUTING.md — build vs dev, CDN modes