Thirty-nine keys the panels and the ring legend already name existed in no catalogue, so every locale rendered the English written at the call site. The fallback is what kept it readable and therefore silent — a missing key degrades to correct English rather than to a visible key name, which is the whole reason nobody noticed. The English is byte-identical to the fallback it replaces, asserted mechanically against the components rather than by eye: translating existing wording is a product decision, changing it is not, and a catalogue entry that quietly reworded a call site would be the second kind wearing the first's clothes. The ring legend's English was read out of the component for the same reason, not copied from the message describing it. Each script carries its own punctuation rather than English punctuation in another alphabet: the Devanagari danda, the Chinese full-width colon and stop, the French space before a colon, the Arabic comma and Arabic-Indic digits. The vocabulary is the fixed part. Reached and unreached are terms of art with settled renderings, the two chart names are Hiebert's bounded set and centered set, and the first culture column says "same people" rather than "same culture" because the rule behind it is the same ethne in another country — a stronger claim than the brief's wording, and the label should not overstate or understate what was measured. That one word is on the Driver's sheet; if he keeps his, three cells change and nothing else. |
||
|---|---|---|
| .. | ||
| api | ||
| colors | ||
| components | ||
| composables | ||
| constants | ||
| data | ||
| i18n | ||
| layouts | ||
| lists | ||
| maps | ||
| packet | ||
| packets | ||
| scripts | ||
| stores | ||
| styles | ||
| utils | ||
| vendor/cldr | ||
| 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.