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. |
||
|---|---|---|
| .. | ||
| charts | ||
| dashboards | ||
| hints | ||
| info | ||
| legends | ||
| map-controls | ||
| maps | ||
| poster | ||
| qa | ||
| regions | ||
| search | ||
| tables | ||
| BackToTopButton.vue | ||
| LargerScreenNotice.vue | ||
| PeopleGroupDetail.vue | ||
| README.md | ||
| ResearchMapFilterPanel.vue | ||
| ResearchMapSideMenu.vue | ||
| SideMenuDrawer.vue | ||
| ViewSelect.vue | ||
| WARNING.md | ||
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>, callsuseShadowStyles(), and reaches stores viainject('mapStore' | 'uiStore' | 'dataStore')— never a direct store import.
Full catalog + conventions:
../../documentation/architecture/components.md ·
per-file roles: ../../documentation/reference.md.