Full detail: the question no longer repeats under every tally cell; the heads stand once per page over the cells' own columns, and each cell is all tally room (96px columns, taller boxes). The worksheet's boxes get a little more room too. Both lists' first page: the intro and the blessing (Numbers 6:24-26, its credit, one line of references, the wheel pointer) at full width, then ONE band like the poster's (ruled above and below, three columns between short rules): the pace table (strongest to slower, weekly marked, each load computed from the list), what the three columns ask, and an EXAMPLE row of tally cells under the table's own heads, exactly as wide as the tally block and directly over it. One code path (explainTop, explainBand) for both packets. Measured with a 100-group list in all 11 languages: the worksheet's first page holds 10 rows (the tallest, ru, keeps 67px), Full detail's 12 under a 640px block (the tallest uses 612); the example sits over the real cells to the pixel. Gates: packet-variants checks the band in BOTH packets (once, before the first row, computed paces, one example row, heads once per page); packet-render reads the page sizes from the renderer, fails a clipped first-page block, and measures text direction against the content box (a padded cell is still pinned left). New strings x11: howto_bless_col, example_title, example_note. |
||
|---|---|---|
| .. | ||
| 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.