doxa-maps/docs
doxa-maps-88655c70 a5c5cf1910 give every map control an accessible name
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.
2026-09-21 13:02:56 +00:00
..
architecture point docs at library/layouts and fix the stale bunx and provider-ladder claims 2026-09-21 10:43:11 +00:00
assets README: lead with the SPA-composition trinity + visual proof (desktop & mobile) 2026-09-16 00:17:45 +00:00
readme-images give every map control an accessible name 2026-09-21 13:02:56 +00:00
screenshots README: distinguish the two cap-5 apps (product SPA vs developer studio) and add current capability screenshots 2026-09-20 05:00:01 +00:00
develop-a-plugin-and-see-it-live.md carry the push buffer flag in the golden path, not only the runbook 2026-09-21 07:34:05 +00:00
explanation.md Complete app-profiles->plugin-designs sweep across comments/docs; build green; layouts kept at root (load-bearing) 2026-09-17 18:18:19 +00:00
how-to.md point docs at library/layouts and fix the stale bunx and provider-ladder claims 2026-09-21 10:43:11 +00:00
README-embed-example.md docs: simple README template for the embedded (in-host) copy 2026-09-11 18:50:31 +00:00
README-longform.md point docs at library/layouts and fix the stale bunx and provider-ladder claims 2026-09-21 10:43:11 +00:00
README-SECTION-3-cli-commands.md gate the docs' quoted scripts block against package.json 2026-09-21 10:47:51 +00:00
README.md docs: close retest gaps — engine-swap recipe (provider param), instances.json recipe + schema, adopt embed-example into router 2026-09-11 18:50:31 +00:00
reference-capability-exemplars.md generate the capability exemplar table so the answer stops being remembered 2026-09-21 12:38:50 +00:00
reference-library-index.md generate the library menu and gate it against library drift 2026-09-21 07:25:18 +00:00
reference.md prove the live server serves the catalog's exact bytes 2026-09-21 12:46:48 +00:00
slide-deck-outline.md Plugin gallery: one generator for the dev server and the build 2026-09-16 20:04:18 -05:00
tutorial.md point the tutorial at the studio folder and separate build from publish 2026-09-21 07:38:50 +00:00
why.md README: lead with the story — one sign-up site is the bottleneck, the map embeds on every partner team's site, Training-for-Trainers roles, the share-button campaign, private CRM for the team list 2026-09-16 12:34:59 -05:00

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-config contract.
  • 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.