ShareButton: the first tab is "Share this page", the link to exactly what the reader is looking at. Where the page owns its address (urlOwner 'app' or 'host', on the map's own profile-config or any element above it across shadow roots) that is the page's own URL, read at open and at copy; on a partner's page it is the map's own page, as before. The second tab, "Embed", says in plain words what embedding is and why it helps, keeps the buttons.shareSteps list, then the paste hint, the sizes and the code. Copy/sizes labels come from the catalogue. MapControlMenu: a standalone anchor (a Share button outside any map toolbar) resolves where its menu lives when it opens, and places it below the button, toward the side with room, inside the viewport, at the readable width (340 or the viewport minus its edges), converting into the menu's real containing block. The render-time area tag that sent header menus far left and narrow is gone. Map toolbars keep their placement unchanged. English only for now (the new share.json keys are recorded as translation debt in check:i18n-parity). check:map-menu-anchor reads a resolution that lives in a named function, every named-area return must keep its structural fallback. |
||
|---|---|---|
| .. | ||
| api | ||
| charts | ||
| colors | ||
| components | ||
| composables | ||
| constants | ||
| dashboards | ||
| data | ||
| elements | ||
| i18n | ||
| layouts | ||
| lists | ||
| maps | ||
| packet | ||
| packets | ||
| scripts | ||
| stores | ||
| styles | ||
| utils | ||
| vendor/cldr | ||
| index.js | ||
| ProfileLoader.vue | ||
| README.md | ||
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.