|
Some checks are pending
build-gate / build (push) Waiting to run
The first tab a new user meets is now the poster/resources pane, not the map. That pane already explains what a UPG-100 list is at the top and shows the posters, so it needs no explanation; a choropleth of zones does. Maps need not be primary — a familiar list or grid is the on-ramp people use before they transition into the map. Renames the tab from "Prayer Lists" to "Prayer Resources". Pane order lives in at[0], not in array order: buildPaneColumn sorts by at[0] while ViewSelect renders the array verbatim, so both are swapped together or the tab strip desyncs from the scroll column. The active view is now derived from that same sort instead of a hardcoded 'map'. In the wrapper shell the map pane is resolved by PROFILE rather than by "pane 0 is the map": under the positional rule, reordering mounted the map element into the poster pane, and "Show on map" scrolled to the wall you clicked from. The shell's tab strip also resets to a profile's first view on switch, since a stale 'map' id is valid in nearly every profile. ViewSelect keeps each tab on one line (nowrap + ellipsis), ported from the shell's own mobile rule that the original extraction left behind. Measured at 390px: "Prayer Resources" wrapped inside its button and grew the strip 45 -> 60px; it now holds 45px at every width from 1280 down to 390. |
||
|---|---|---|
| .. | ||
| api | ||
| colors | ||
| components | ||
| composables | ||
| constants | ||
| data | ||
| i18n | ||
| layouts | ||
| maps | ||
| scripts | ||
| stores | ||
| styles | ||
| utils | ||
| 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.