resources-list and charts turned out to be almost entirely explanatory prose. Their actual chrome is four strings — two page titles, the loading line and Close — and those are now in all eleven locales. The blanket dir=ltr is off both roots, so Arabic gets its layout, and each English prose block declares its own direction where it sits. That completes option (b) across all five gospel profiles. What stays English is what carries doctrinal and statistical precision: which pools were searched, what "nothing found" does and does not claim, why Open Bible Stories is not Scripture. A machine translation of those would read as authoritative while being wrong, and one translated line in each locale says so in the reader's own language. Verified on a served built tree whose identity I proved first — the Russian title appears once served and once on disk. en/ar/ru on both leaves: heading translated, 0 clipped, dir=rtl only for Arabic, no page errors and nothing 4xx. |
||
|---|---|---|
| .. | ||
| api | ||
| colors | ||
| components | ||
| composables | ||
| constants | ||
| data | ||
| i18n | ||
| layouts | ||
| maps | ||
| packet | ||
| scripts | ||
| stores | ||
| styles | ||
| utils | ||
| index.js | ||
| ProfileLoader.vue | ||
| README.md | ||
library/ (@map) — the shared map template
The other half of the architecture (see ../plugin-designs/README.md):
every map in plugin-designs/<your-map>/ composes the reusable, parameterized pieces that live here.
Fix something here and every map benefits on the next build; break something here and every map
breaks — read components/WARNING.md before touching shared pieces.
| Folder | What lives there |
|---|---|
ProfileLoader.vue |
The root of every bundle: parses profile-config, loads the profile, provides the stores + config |
components/ |
Shared UI — map, legends, controls, popup (PeopleGroupDetail), tables, charts, hints (README) |
composables/ |
Shared logic — map engine (useMapInstance), provider switch, shadow-DOM styles, theming |
stores/ |
Per-instance Pinia stores (ui / map / data) — provided by ProfileLoader, injected by children |
api/ |
Data-source registry (sources.json) + fetch layer — the JAMstack runtime wiring |
colors/ |
Color sets maps opt into via profile-config.colorSet |
i18n/ |
The shared string catalogs (all maps speak the same languages) |
data/ |
Small shared datasets baked at build time (big served data lives in ../data/) |
constants/ |
Shared constants |
scripts/ |
Maintainer pipelines (posters, research) — not part of any bundle |
The rule of thumb (same as WARNING.md): custom code in your app-profile, reusable code here — and things only move from the first to the second once they've earned it.