doxa-maps/library
Doxa Maps 72dc172479 Four pray-tools assumptions the exporter did not know it was making
go-int read useCsvExport before importing it and found four things that are only
visible from outside. Every one is a pray-tools assumption this file made
silently, and I could not have told you they were assumptions while there was one
caller. That is what a second consumer is FOR, and it is worth more than the code
it produced.

  columns — it exported every key of the row, ordered by EXPORT_FIELDS. go-int's
    spec asks for the VISIBLE columns. Their workaround was to project rows before
    handing them over, which loses the ordering this file exists to impose. An
    explicit `columns` is now taken AS GIVEN, order included, and deliberately NOT
    filtered to keys that happen to be present: a column the reader can see must
    appear even when every row in this scope has it empty, or the file's shape
    would depend on the filter, which is the opposite of what a column picker
    promises.
  wide — exportCsvAsync always fetched the pray-tools list endpoint. A
    static-table dashboard has nothing to widen FROM, so that is a wasted network
    call that would also pollute its rows with pray-tools fields. It is skippable,
    and it now also short-circuits when there is no source at all, because that
    case can be recognised rather than configured.
  filename and hookPrefix — 'research-dashboard.csv' and the __rdash* window
    hooks were literals. Both are options; both defaults are the existing strings,
    and the default matters more than the option here: __rdash* names are read
    elsewhere in this tree, so changing it would have broken checks with nothing to
    do with this landing.
  keyOf — a row identified itself as `slug || id`. go-int's rows carry a slug so
    this costs them nothing, but they were right to flag it against
    config.data.primaryKey: two spellings of one idea that nothing forced to agree.

EVERY DEFAULT IS TODAY'S BEHAVIOUR, so Big Picture's file is unchanged to the
byte. check:csv-shape and its self-test pass, and check:kit-options-reachable
passes across 21 options — which is the gate that exists because I shipped a dead
option in the commit below this one.

Source only, stacked on kit landing 3. No rebuild beyond the one that branch
already needs.
2026-09-27 01:57:50 +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 The legends mirror now, and their labels never became their values 2026-09-26 22:06:58 +00:00
components SemanticTreeLegend says a dot is a locality, on every map with people-group pins 2026-09-26 22:06:58 +00:00
composables Four pray-tools assumptions the exporter did not know it was making 2026-09-27 01:57:50 +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 Big Picture: the live count speaks, and the locale reaches the children 2026-09-26 22:06:58 +00:00
layouts Decouple the library's prose: no host-platform names in the QA widget, StackLayout or script notes 2026-09-26 17:28:45 +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 deaf zone could not be generated at all, and five more resolved to nothing 2026-09-27 01:27:47 +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 A clicked pin finds the groups that share its point 2026-09-26 22:06:58 +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 Decouple the library's prose: no host-platform names in the QA widget, StackLayout or script notes 2026-09-26 17:28:45 +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.