The control column goes back to the library's round, spaced buttons at every width; the square grouped card read too compact, on phones most of all. The ⓘ stays the top control. In control mode, MapInfo no longer shows its floating button before the map's control has announced itself. The map draws its column only once it is ready (style and people-group data), so the floating ⓘ appeared for a moment and was then replaced by the control. The wait is bounded at 30 s of time on screen, counted only while the pane is visible and not inert: measured column arrival times run from 7 to 19 s on a local serve, so a shorter wait expired inside a normal load and flashed late. If no control arrives, the floating button shows, so there is still always a way to open the popup. Once a control has announced itself, measurement alone decides, as before. MapInfo's plain <script> block (the page-load pointer memory) now sits above <script setup>, so check:setup-order no longer reads it as used before its definition; its explanation moves into <script setup> so the library index keeps the component's own description. Compiled output is unchanged by the move. Rebuilt doxa-simple-map and doxa-maps-spa (the only bundle that compiles MapInfo.vue), then tree + SRI. |
||
|---|---|---|
| .. | ||
| 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.