doxa-maps/library
Doxa Maps 8048c3b900 Fourteen accessible names that never reached the catalogue
The dashboard's five resize handles are role="separator" widgets with arrow-key
operation and live aria-valuenow — properly built, and four of them already read
their names through T(). None of the six keys they asked for existed. aria.json
held eleven keys and not one of them was a resize key, so every handle fell back
to its English default in all eleven locales: a screen reader in Arabic
announced "Resize filters rail" over an otherwise Arabic board. The T() call
sites were right the whole time; the catalogue simply never caught up, which is
the quiet half of this defect class and the half no gate was watching.

Ten resize keys (each handle's accessible name plus its tooltip hint) and
aria.removeFilter for the kit's chip strip, all eleven locales.

Three dashboard keys for the shell's new polite live region: results_live,
filters_live, search_live. They are the sentence a screen-reader user gets when
a brush changes the row count — "693 of 2,107 groups shown · Filters: Religion".
The counts arrive already formatted by the shell, so numerals are untouched here
and the placeholders pass straight through.

Keys are appended, never reordered: a catalogue diff that reshuffles is a diff
nobody can review. check:i18n-parity and check:english-leaks pass, and
check:i18n-never-translated finds none of these fourteen identical across
locales. (It still reports poster.json:dpi, tables.json:csv and tables.json:json
from before this branch.)
2026-09-26 13:35:57 +00:00
..
api The people-group list is a universal prop: the same maps can show any project's list 2026-09-26 05:16:02 +00:00
colors C1b: the resource palette moves to library/colors/, and the local colour globs go with it 2026-09-26 08:51:39 +00:00
components The dashboard now says out loud what a filter just did 2026-09-26 13:35:57 +00:00
composables The engine logo's label follows the reader's language, on both engines 2026-09-26 13:04:16 +00:00
constants Every runtime CDN script and stylesheet is an exact version with an integrity hash 2026-09-26 05:50:24 +00:00
data Regions: expand a region to its country posters, reusing the shared wall 2026-09-24 04:26:29 +00:00
i18n Fourteen accessible names that never reached the catalogue 2026-09-26 13:35:57 +00:00
layouts The last of the shared-library English: legend, poster preview and tab loading states 2026-09-26 13:04:16 +00:00
lists List names speak the reader's language: listLabel and listDefinition 2026-09-26 08:39:52 +00:00
maps Map labels ask for a font the engine's glyph server has: one shared helper 2026-09-25 13:48:10 +00:00
packet A packet says which list it holds, in the reader's language 2026-09-26 08:39:54 +00:00
scripts The funnel stops claiming a coverage gap it cannot measure 2026-09-26 08:39:54 +00:00
stores Make the map's clustering picker real: four options, four different maps 2026-09-25 16:16:46 +00:00
styles Fiord: the MapLibre dark that actually looks like the map it replaces 2026-09-24 02:26:14 +00:00
utils People-group pins say what they are: one shared note, and the groups that share a point are named 2026-09-26 13:04:15 +00:00
index.js Move internal files out of the repo; fix five dead links; a fuller delegation diagram 2026-09-25 05:14:10 +00:00
ProfileLoader.vue Engine and token props: a token-service URL is honoured, Clear clears, and a pending token is awaited 2026-09-26 03:34:15 +00:00
README.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

library/ (@map) — the shared map template

The other half of the architecture (see ../plugin-designs/README.md): every map in plugin-designs/<your-map>/ composes the reusable, parameterized pieces that live here. Fix something here and every map benefits on the next build; break something here and every map breaks — read components/WARNING.md before touching shared pieces.

Folder What lives there
ProfileLoader.vue The root of every bundle: parses profile-config, loads the profile, provides the stores + config
components/ Shared UI — map, legends, controls, popup (PeopleGroupDetail), tables, charts, hints (README)
composables/ Shared logic — map engine (useMapInstance), provider switch, shadow-DOM styles, theming
stores/ Per-instance Pinia stores (ui / map / data) — provided by ProfileLoader, injected by children
api/ Data-source registry (sources.json) + fetch layer — the JAMstack runtime wiring
colors/ Color sets maps opt into via profile-config.colorSet
i18n/ The shared string catalogs (all maps speak the same languages)
data/ Small shared datasets baked at build time (big served data lives in ../data/)
constants/ Shared constants
scripts/ Maintainer pipelines (posters, research) — not part of any bundle

The rule of thumb (same as WARNING.md): custom code in your app-profile, reusable code here — and things only move from the first to the second once they've earned it.