Last tick's fix covered the shared map-control base. Sweeping the rendered DOM of all 17 bundles found three more unnamed buttons — the same "Collapse legend" control in three map bundles, again from one shared component. Its only content is an svg caret, so with title alone its accessible name was empty. It is a disclosure control, so it now reports aria-expanded as well. Verified by toggling it: the label flips Collapse/Expand and aria-expanded flips true/false. The gate measures the rendered DOM through shadow roots, because a source grep cannot answer this question. There are 132 <button> hits here and most have visible text, which IS a valid accessible name; aria-label is often on a following line. Only the DOM knows which buttons ended up nameless. It counts aria-label, a resolved aria-labelledby, or visible text, and deliberately does not count title, which is the defect it was written for. Hidden buttons are skipped since assistive tech cannot reach them either. The sweep went 319/322 before the legend fix to 322/322 after, which is the evidence it detects real defects rather than passing vacuously. |
||
|---|---|---|
| .. | ||
| charts | ||
| hints | ||
| legends | ||
| map-controls | ||
| poster | ||
| qa | ||
| search | ||
| tables | ||
| PeopleGroupDetail.vue | ||
| README.md | ||
| ResearchMapFilterPanel.vue | ||
| ResearchMapSideMenu.vue | ||
| SideMenuDrawer.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:
../../docs/architecture/components.md ·
per-file roles: ../../docs/reference.md.