doxa-maps/library
doxa-maps-88655c70 c07098bd77 Give fitBounds a duration, because FLY_CONFIG alone leaves it instant
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.
2026-09-23 05:01:53 +00:00
..
api consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
colors Land the swarm's dashboard work: colour, rails, cascade, scroll 2026-09-22 18:57:39 +00:00
components Show the eighth filter, and wrap the row instead of scrolling it 2026-09-23 02:49:38 +00:00
composables Give fitBounds a duration, because FLY_CONFIG alone leaves it instant 2026-09-23 05:01:53 +00:00
constants doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
data docs: simplify all folder READMEs (what's here + graphic + link); migrate complex reference to docs/architecture/{data-sources,i18n,components,app-wrappers,poster-generation}.md 2026-09-11 18:50:31 +00:00
i18n consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
layouts Match the tab radius to the rest of the app, and open on the tab you were last on 2026-09-23 01:03:15 +00:00
maps Load the RTL text plugin from one place, and in the composite too 2026-09-22 19:55:58 +00:00
scripts consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
stores fix(spa): make embedded maps survive the sandboxed plugin iframe 2026-09-12 21:07:26 +00:00
styles Move the eight CARTO basemap styles to OpenFreeMap 2026-09-22 02:27:48 +00:00
utils Land the prayer facet and the scrim helper 2026-09-22 21:50:32 +00:00
index.js Brand-neutral shared VerticalTabsLayout with lazy nested-element hosting; fix cap-5 prayer tab leaf path; neutralize library identifiers; add Forgejo CI build-gate workflow 2026-09-19 17:24:30 +00:00
ProfileLoader.vue Land the swarm's dashboard work: colour, rails, cascade, scroll 2026-09-22 18:57:39 +00:00
README.md Complete app-profiles->plugin-designs sweep across comments/docs; build green; layouts kept at root (load-bearing) 2026-09-17 18:18:19 +00:00

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.