The legend gives each tab a small "i" button explaining what that tier means — what an Affinity Block is, how a people group differs from a people group in a country. SemanticTreeLegend already read that text from legend.tabInfo.<id> behind a te() guard, and not one of the ten keys the research map needs had ever been written. The tab chips were translated in all eleven locales and the explanations beside them were not, so the reader least able to guess what "PGIC" means was the one reader who got it in English. The keys are written for all eleven locales, following the terminology each catalogue already uses for these same tiers — People Group as Volksgruppe, Peuple, Pueblo, 民族, Народ, जनसमूह — with WAGF and UPG left untransliterated as the corpus leaves them. The reader-facing text drops the source field names and row counts that the English carried; those are notes for whoever maintains the tables, so they stay in the source as a comment. With the keys in place the English in the tab tables can never render, and a second copy of a string drifts from the catalogue without anyone noticing, so it is removed. `info: true` stays because the legend gates the "i" button on that field being set — dropping it would have removed the affordance instead of translating it — and tabInfo now treats only a string as a fallback, so the flag cannot reach the popover as the word "true". Verified every changed tab renders a real label and a real explanation in all eleven locales. check:i18n-parity, check:i18n-never-translated and check:i18n-treeshake pass; hardcoded-english 205 -> 190. |
||
|---|---|---|
| .. | ||
| charts | ||
| dashboards | ||
| hints | ||
| legends | ||
| map-controls | ||
| maps | ||
| poster | ||
| qa | ||
| regions | ||
| search | ||
| tables | ||
| BackToTopButton.vue | ||
| PeopleGroupDetail.vue | ||
| README.md | ||
| ResearchMapFilterPanel.vue | ||
| ResearchMapSideMenu.vue | ||
| SideMenuDrawer.vue | ||
| ViewSelect.vue | ||
| WARNING.md | ||
library/components/ — shared Vue components
The map UI, built from parameterized pieces every app-profile reuses. Fix one here and every map benefits — never edit a shared component to customize one map.
library/components/
┌───────────────────────────────────────────┐
│ legends/ map-controls/ poster/ │
│ charts/ tables/ │
│ PeopleGroupDetail.vue SideMenuDrawer.vue │
│ ResearchMapFilterPanel.vue …SideMenu.vue │
└───────────────────────────────────────────┘
reused by every app-profile via @map/components/…
legends/,map-controls/,poster/each have their own README.- Every component uses
<script setup>, callsuseShadowStyles(), and reaches stores viainject('mapStore' | 'uiStore' | 'dataStore')— never a direct store import.
Full catalog + conventions:
../../documentation/architecture/components.md ·
per-file roles: ../../documentation/reference.md.