Selecting a row jumped the camera instead of easing to it. The shared helper spread FLY_CONFIG into the fitBounds call, which looks like it animates and does not: FLY_CONFIG carries speed and curve, which flyTo understands and fitBounds ignores. Without an explicit duration, fitBounds is an instant cut. The flyTo paths in the same file were always eased, which is why the tree rows animated and the map did not -- different mechanisms, not one broken setting. Measured before: the camera moved 1.45 to 6 with two distinct zoom values across fourteen samples. After: it interpolates through 1.453, 1.806, 3.429. options still spreads last, so a caller passing duration 0 still jumps. That is why the default lives here rather than in FLY_CONFIG, which is shared with callers that must not inherit it. One thing this box cannot settle: whether 900ms FEELS right. Sampling with requestAnimationFrame returned six frames in 1.6 seconds -- SwiftShader software rendering paints at roughly 4fps here, so perceived smoothness is not measurable on this machine and my earlier "hard cut" reading at 90ms intervals was aliasing against a starved renderer. The easing is proven present; the duration is a judgement for a real browser. |
||
|---|---|---|
| .. | ||
| 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.