Reworked to the consuming dashboard's contract. It emits a zone id or null on zone-change, not a selector: an id is serialisable into a query parameter, a profile config and a deep link, which is the chain that dashboard already resolves its list from, and a predicate is none of those. It also keeps the component promotable -- a selector would have to know what it selects over, and the consumer holds four different row shapes across its tabs. The join stays in one place, where the diacritic folding and the province bridge already are. A leaf emits its zone id; a region row emits the region's id and the consumer expands it, because that is where the zone data lives. And it cannot silently drop a zone. Four joinable zones are absent from the region file today, one of them the consumer's largest at a hundred groups, so grouping by region loses them with no error and no empty state -- just a shorter tree. Given the full zone set, the legend renders the difference in an explicit bucket, each one selectable. That makes the drop structurally impossible rather than something to keep checking. Omit the set and the tree is untouched, so the guard is additive. Its check includes a negative control that the unaugmented tree really does omit the largest zone, so the bucket is demonstrably not decoration. |
||
|---|---|---|
| .. | ||
| charts | ||
| dashboards | ||
| hints | ||
| legends | ||
| map-controls | ||
| poster | ||
| qa | ||
| regions | ||
| search | ||
| tables | ||
| 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.