syncAttribClearance() measured the strip it must clear from Mapbox's credit (.mapboxgl-ctrl-attrib) and our own (.doxa-attribution), never from MapLibre's (.maplibregl-ctrl-attrib). MapLibre is the default engine. With no match, the clearance stayed at the 20px fallback. On a phone the MapLibre credit wraps to two lines, and the "Tap a coloured dot" pill covered it: a licence-required credit hidden on every map that mounts the hint. Measured at 390x844 on DX Life's home page (Prayer Progress), on the shared browser: MapLibre en and ar, pill over the credit by 35px with the clearance at 20px; Mapbox, clearance 72px and 0px overlap. The selector now also takes .maplibregl-ctrl-bottom-right .maplibregl-ctrl-attrib and the MapLibre form of our own credit line. The existing measure (the strip from the credit's top to the box's bottom) and its ResizeObserver then apply unchanged. Proved on the live DOM, inside the map's shadow root: on MapLibre the old selector finds nothing and the new one finds the credit; on Mapbox both find it. Library only. Every ProfileLoader consumer needs a rebuild to ship it. |
||
|---|---|---|
| .. | ||
| 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.