A second read measured a hole in the phone print keep: a touch after print() started the grace, and if the print UI then opened (the page hidden, or the window blurred), nothing cancelled it, so the document could go while the reader was still choosing Save as PDF. Now: - going away again during the grace cancels the pending drop, and the next "back" counts; - BACK_GRACE_MS is 60 s (was 5 s): a slow phone can still be writing an 11-page packet after its dialog closes, and the kept document is invisible on screen and replaced by the next print; - a touch in the first TOUCH_SETTLE_MS (2 s) after print() is not "back" (a double tap while the preview builds). check:phone-print-keep gains arm H (a touch, then the print UI, by hiding and by blur: still mounted past the grace, released after the next back) and arm I (a touch in the settle window), with the poisons "no cancel when away again" and "no touch settle window"; arm C now taps Print a few seconds after the document is ready and stays in the dialog past the grace. The first cut fails H and I; the pilot's file fails A to H. Desktop stays byte-identical. |
||
|---|---|---|
| .. | ||
| 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.