Rings that zoom apart, as a flag, so either answer to row 130 is one line at the call site. DEFAULT IS 'fit' — this changes nothing today. 'fit' keeps every pin at least minSep apart at the chart's own scale and reports what will not fit. That is the right behaviour for a PRINTED sheet, where there is no zoom and a dot a reader cannot resolve is a dot that is not there. 'fill-all' places all of them. Separation is in map units, so it grows with zoom: measured on the shipped table, the worst ring is ring 1 (1,190 groups in the smallest circle) separating to 8px on screen at z=4.45, and ring 8 (1,932) at z=3.50. The GROUP label tier already starts at 5.2, so every pin is clickable before the names appear. At the start zoom the band reads as a dense arc of colour rather than countable dots, which is the intended appearance — and the reason a caller in this mode must caption the true total rather than a count that changes with zoom. The row count had to follow the POPULATION here, not the pin size. Keeping the 'fit' row count would have packed 1,932 pins into the two rows a band allows at full size, and they would have sat almost on top of each other along the arc — the single-line defect again, one level down. Ring 8 uses 14 rows in fill-all against 2 in fit. Real table: fit places 1,851 of 7,296, fill-all places 7,296 of 7,296, both with zero pins outside their band. Six new assertions, and the row-growth arm is poison-tested: making fill-all reuse the fit row count fails it at "2 rows vs 2". |
||
|---|---|---|
| .. | ||
| 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.