doxa-maps/library/components
Doxa Maps d54ece3b25 Kit landing 4c-2: the chip bar moves into the library, and its unconfigured default gets a voice
DashboardFilterChips.vue moves to library/components/dashboards/. Nothing about the rendering
changed. What made the move possible was 4b, which inverted the one dependency that blocked it: this
file imported useTreeLegendLabels — the People CODE -> NAME tables, research-specific and staying in
plugin-designs — and a library component importing a plugin composable is what
check:no-cross-plugin-imports refuses. The resolver now arrives on dashboardConfig.legend.

THREE THINGS BEYOND THE MOVE, all found by assessing the file rather than by moving it:

1. THE UNCONFIGURED DEFAULT NOW JOINS A LIST. 4b's fallback returned the value untouched, so a
   multi-value filter (spec D1) printed String(['A012','A013']) = "A012,A013", comma-jammed, while a
   dashboard that DID supply a resolver got "South Asian Peoples, Bengali Peoples". Configured and
   unconfigured should differ in whether CODES RESOLVE, never in punctuation — the second difference
   reads as a rendering bug rather than as missing configuration, and go-int is the consumer who will
   see the unconfigured state first.

2. THE DEAD INJECTS ARE GONE. `dataStore` and `searchSourceId` existed only to construct
   useTreeLegendLabels and have been unused since 4b. Removed rather than left in place: an unused
   inject is a claim about the host, and a kit component that appears to need a research dataStore is
   one a new dashboard will dutifully provide before discovering it is never read.

3. AN EXPLICIT EXCEPTION TO library/components/WARNING.md, recorded in the file's own header. That
   file says a component graduates into the library only once MORE THAN ONE map uses it; this one is
   used by ZERO, because the topbar dedup pass unmounted it when SearchFilterHeader became the single
   source of truth for showing and clearing filters. It is here because the kit's promise runs the
   other way round — a NEW dashboard mounts kit components, so waiting for a second consumer before
   providing the first one is a deadlock. The honest consequence is written down too: a passing gate
   means "it mounts and degrades", not "it looks right", and nobody has SEEN this component since the
   dedup. Whoever wires it in is its first real reader, and must not mount it beside a
   SearchFilterHeader that is already showing chips.

check:legend-mirrors grows arm 5, and it asserts the two things a "move" gets wrong that reading the
new file cannot show: that the OLD copy is actually gone (a move that leaves the original behind is a
copy, and two chip bars over one filterSet drift the moment one is edited — this tree has already
paid that with useNeighborT/usePplrT at Jaccard 0.82), and that the UNCONFIGURED behaviour is right,
which no dashboard here would reveal because they all supply a resolver. The default is LIFTED out of
the source and RUN, the way arm 3 drives the rail's fallbacks — not mounted, because a no-op renderer
cannot show a chip and the rendered result is rega's. Five mutants, all caught: old copy left behind,
the join reverted to 4b's bare value, a dead inject re-added, the supplied resolver ignored, and a
relative import restored.

The barrel re-exports from the library for one cycle, so no consumer's import line changes in the
same landing that moves the file. documentation/reference-library-index.md regenerated, per landing.

PARENTED ON a285e06c (4b), not on main, because 4b edits this same file — landing them the other way
round would revert 4b's inversion. Source only: research-dashboard and dashboard-plus-grid need a
rebuild.
2026-09-27 04:14:14 +00:00
..
charts Prepare repo to the vision: BLUF vision-cast README, library warning, SRI injection, term scrub 2026-09-15 22:58:19 +00:00
dashboards Kit landing 4c-2: the chip bar moves into the library, and its unconfigured default gets a voice 2026-09-27 04:14:14 +00:00
hints PinHint hides while its map's view is inactive, not only while it is off-screen 2026-09-27 03:26:35 +00:00
legends The prayer map's legends see the pins it draws 2026-09-27 02:17:35 +00:00
map-controls MapToolbar: the mobile comment names the top it actually sets (72, a 26px gap) 2026-09-26 17:10:06 +00:00
poster C4 wave 2: five library components share the guard, and keep their own English 2026-09-26 22:06:57 +00:00
qa 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
regions The region card becomes a shared component the plugin consumes 2026-09-27 03:26:36 +00:00
search C4 wave 2: five library components share the guard, and keep their own English 2026-09-26 22:06:57 +00:00
tables Share, export, clusters and the pin hint stop being typed in English 2026-09-26 12:23:49 +00:00
PeopleGroupDetail.vue Teach the synced-CSS gate what a selector is, and turn it on 2026-09-23 01:22:36 +00:00
README.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
ResearchMapFilterPanel.vue Four shared controls get a 24x24 target at every pointer, not only on touch (WCAG 2.5.8) 2026-09-26 13:35:57 +00:00
ResearchMapSideMenu.vue Stop showing English where the catalogue already holds the translation 2026-09-25 12:16:59 +00:00
SideMenuDrawer.vue doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
ViewSelect.vue Move internal files out of the repo; fix five dead links; a fuller delegation diagram 2026-09-25 05:14:10 +00:00
WARNING.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/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>, calls useShadowStyles(), and reaches stores via inject('mapStore' | 'uiStore' | 'dataStore') — never a direct store import.

Full catalog + conventions: ../../documentation/architecture/components.md · per-file roles: ../../documentation/reference.md.