Third report of a blank card, and the root cause was never a missing field — it was two code paths producing "the same" object. build-field-cards.mjs copied groupAt()'s 39 fields by hand and missed door43, which exists only in that normalizer, so the sheet's `!selectedGroup.door43.length` threw on undefined. I fixed a value, then a timing, then would have added door43 and waited for the fourth. The shard now ships the RAW INPUTS the map itself holds — the pin row, the whole code record, the country name and the two bridge records — and the leaf's groupFrom() normalizes both paths. groupAt(i) is a three-line wrapper over it. A field added to the sheet reaches the card with no second edit, and forgetting one is no longer possible. The code record is passed WHOLE rather than picked over, because picking fields is exactly the mistake above. Shards got smaller doing it: mean 8.0 KB against 9.1. Two sheet-level sources the card fetches nothing for are seeded from the shard: the prayer page (prayIndex) and the SUN block. Both matter most to this persona — a catalyst with a Deaf group, or one handing someone a prayer page — and both were silently absent while the card "worked". Verified statically, since I cannot render: every one of the 28 fields the sheet reads off selectedGroup is produced by groupFrom, so the two paths cannot disagree about any of them. rega has the render. |
||
|---|---|---|
| .. | ||
| boundaries | ||
| brand | ||
| external-bundles | ||
| fonts | ||
| glottolog | ||
| images | ||
| internet | ||
| legacy/upg-neighbor | ||
| people-groups | ||
| posters | ||
| pplr | ||
| tables | ||
| vendor | ||
| README.md | ||
data/ — the bundler's source-of-truth data
The law: data lives here; public/ is generated. public/ holds only the output folder
(public/<tree>/, named by name in vite.doxa-maps-build-config.json) and a generated README. The
build (internal/generate-tree.mjs) copies what the plugins FETCH at runtime from here into
<tree>/assets/, alongside the per-profile data in plugin-designs/*/data/. You should be able to
rm -rf public/ and get it all back with bun run build.
| Folder | Served at | What it is |
|---|---|---|
people-groups/ |
<tree>/assets/people-groups/ (the fetched cuts only) |
People-group datasets (CSV/JSON) the maps read at runtime |
vendor/ |
<tree>/assets/vendor/ |
Third-party runtime assets (e.g. table libraries) |
posters/ |
<tree>/assets/posters/ (opt-in: bundlePosters / posterSources) |
Rendered poster set (heavy pipeline output; the export button fetches these) |
tables/ |
<tree>/assets/tables/ |
The MERGED served table set (its index.json is the merge; per-profile plugin-designs/*/data/tables are build-time sources) |
pplr/ |
<tree>/assets/pplr/ (the fetched files only) |
The PPLR data maps' derived datasets |
fonts/ |
<tree>/assets/fonts/ |
Vendored typefaces (SIL OFL), e.g. Bebas Neue for the regions clone |
images/ |
<tree>/assets/images/ |
Images the plugins fetch (e.g. the regions list's world-map watermark; see its PROVENANCE) |
brand/ |
not served | Logos and brand imagery (sources; the optional library/layouts/app-wrapper-material shell references them) |
legacy/ |
not served | Archived standalone builds kept for reference (e.g. the original upg-neighbor page) |
external-bundles/ |
not served | Prebuilt map IIFEs vendored from sibling projects (not built here); only the optional layouts/ shell mounted them |
fonts/, images/, brand/ and legacy/ moved here from public/assets/ on 2026-09-25 (card
BUILD-OUTPUT-IS-ONE-FOLDER): they were sources that existed only in the generated folder.
Don't edit anything under public/ by hand — change it here (or in plugin-designs/*/data/,
layouts/*/assets/) and rebuild.