The zoom buttons render an icon through a slot and carried only `title`, so their accessible name was empty: a screen reader announced "button" with no indication of what it does. title is a tooltip, not an accessible name — unreliably announced, and never surfaced to touch users. Found while proving the research-dashboard zoom controls actually work. They do: a click triggered six tile requests at zoom level 2, so the open-work item is function-verified, not just present. The probe that matched aria-label found nothing while the probe that fell back to title found both buttons, and that discrepancy was the defect. One binding in the shared MapControlButton reaches all eight control buttons — zoom in and out, fullscreen, location, help, share, hamburger, theme — across seven map bundles, because every one composes this base. No caller changes: the component does not set inheritAttrs:false, so a caller passing its own aria-label still wins through normal fallthrough, and undefined omits the attribute when there is no title to mirror. Verified across all seven bundles: 34 control buttons, 0 without an accessible name. |
||
|---|---|---|
| .. | ||
| architecture | ||
| assets | ||
| readme-images | ||
| screenshots | ||
| develop-a-plugin-and-see-it-live.md | ||
| explanation.md | ||
| how-to.md | ||
| README-embed-example.md | ||
| README-longform.md | ||
| README-SECTION-3-cli-commands.md | ||
| README.md | ||
| reference-capability-exemplars.md | ||
| reference-library-index.md | ||
| reference.md | ||
| slide-deck-outline.md | ||
| tutorial.md | ||
| why.md | ||
docs/ — pick your path
"what is this?" "teach me" "how do I …?" "look it up" "all the detail"
│ │ │ │ │
why.md ──────────► tutorial.md ────► how-to.md ────► reference.md ───► architecture/
(2 min, 1 diagram) (first map) (task recipes) (tables) (contracts)
- why.md — the problem and the "map islands" idea. Start here.
- tutorial.md — build your first map, no jargon.
- how-to.md — recipes: embed, iframe, SPA, colors, CDN, mobile, tokens.
- reference.md — config fields, build scripts, the
profile-configcontract. - explanation.md — the model in 15 lines.
- architecture/ — the deep end: full contracts, the per-file catalog.
- README-embed-example.md — the drop-in README used when this bundler is embedded inside a host repo.
Nothing on the simple path is longer than a few minutes; everything complex lives in
architecture/, linked from where you'd need it.