doxa-maps/documentation
Doxa Maps 1a17d3a211 One guarded translator, and the fallback catalogue nobody needed
C4, first wave. Twenty places each stored the same fact — how to translate when
the host never installed vue-i18n — and two of them, usePplrT.js and
useNeighborT.js, were whole-file near-duplicates at Jaccard 0.82. That pair was
the curation audit's evidence that the guard was being COPIED rather than shared.
Both now call library/composables/useOptionalT.js and keep their public names, so
no call site changes.

★ THE SPEC ASKED FOR (namespace, fallbackCatalogue) AND THE CATALOGUE IS
UNNECESSARY. Every copy imported its own English JSON and hand-walked it after
stripping the namespace prefix. But library/i18n builds `messages[locale][area]`
keyed by the JSON's own filename, and tStatic() already walks that tree and
already falls back to English. So `import enPplr from '.../en/pplr.json'` was a
second copy of bytes the bundle already had, and the helper takes one argument.

★ AND IT IS NOT A SIZE REGRESSION, which was the one good reason the narrow
import might have existed. The build NARROWS library/i18n's catalogue glob per
bundle to the areas internal/i18n-areas.mjs finds in that bundle's source graph
(check:i18n-treeshake). A bundle that says 'pplr.' gets the pplr area, not the
other thirty. Verified before writing the helper, because "the obvious dedup
makes every bundle carry every locale" would have killed it.

Resolution order, each step earning its place: the host's own vue-i18n when it
installed one, so a host managing locale keeps control; then tStatic, which
honours the runtime locale and falls back to English; then the key itself, so a
missing string is visible rather than blank. The middle step also covers i18n
being present but empty — i18n.t() returns the key unchanged, which every copy
of this pattern already treated as "not found".

Verified by _qa-cycle/02-builder-cycle/_chk-c4-optional-t-equivalence.mjs: 18
assertions across all three host states, with a branch-for-branch equivalence
check against the old hand-written implementation and two negative controls. It
extracts and executes the module source, because useOptionalT imports vue-i18n
and an i18n index that calls import.meta.glob, which plain Node cannot run.
2026-09-26 22:06:57 +00:00
..
architecture Decouple prose: no go-base / nuxtbase / nuxtinator / doxa-base names in plugin comments and docs 2026-09-26 17:28:45 +00:00
assets consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
contributing README: lead with the objectives, showcase the Research Gallery, teach the agent swarm 2026-09-24 18:34:02 +00:00
needs-eyes The partner-embed check becomes something a person can open 2026-09-26 00:47:12 +00:00
readme-images Keep the previous UPG-100 list screenshot: the retake drew no layers (195 polys, 27/27 zones, 2107 pins loaded, nothing painted) 2026-09-26 08:10:49 +00:00
screenshots consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
CONTRIBUTING.md README: three outputs, not five methods; a Languages section; screenshot gates see every shot again 2026-09-25 19:40:03 +00:00
develop-a-plugin-and-see-it-live.md README: three outputs, not five methods; a Languages section; screenshot gates see every shot again 2026-09-25 19:40:03 +00:00
explanation.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
how-to.md Decouple prose: no go-base / nuxtbase / nuxtinator / doxa-base names in plugin comments and docs 2026-09-26 17:28:45 +00:00
README-embed-example.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
README-embed-gospel-resources.md Click a province, get its row in the table 2026-09-26 18:35:46 +00:00
README-SECTION-3-cli-commands.md Docs: an iframe updates itself; a script embed's integrity hash pins the bytes, so re-copy it after each release 2026-09-26 02:07:14 +00:00
README.md The embed contract, written down for partners 2026-09-26 17:24:55 +00:00
reference-capability-exemplars.md Rename the output folder to dx-maps 2026-09-25 19:26:14 +00:00
reference-library-index.md One guarded translator, and the fallback catalogue nobody needed 2026-09-26 22:06:57 +00:00
reference-universal-props.md List names speak the reader's language: listLabel and listDefinition 2026-09-26 08:39:52 +00:00
reference.md README: three outputs, not five methods; a Languages section; screenshot gates see every shot again 2026-09-25 19:40:03 +00:00
tutorial.md Docs: every build line a reader copies now carries BUILD_ALLOW=1 2026-09-25 03:07:52 +00:00
vendored-font-noto-serif-devanagari.md Move the vendored font's README out of the served folder 2026-09-24 04:15:26 +00:00
why.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00

documentation/ — pick your path

        "what is this?"          "teach me"        "how do I …?"       "look it up"      "all the detail"
             │                       │                   │                  │                  │
         why.md  ──────────►  tutorial.md  ────►  how-to.md  ────►  reference.md  ───►  architecture/
        (2 min, 1 diagram)   (first map)         (task recipes)     (tables)           (contracts)
  • why.md — the problem and the "map islands" idea. Start here.
  • tutorial.md — build your first map, no jargon.
  • how-to.md — recipes: embed, iframe, SPA, colors, CDN, mobile, tokens.
  • reference.md — config fields, build scripts, the profile-config contract.
  • explanation.md — the model in 15 lines.
  • architecture/ — the deep end: full contracts, the per-file catalog.
  • README-embed-example.md — the drop-in README used when this bundler is embedded inside a host repo.
  • README-embed-gospel-resources.md — the gospel map's URL contract for partner embeds: bring your own ISO 639-3 list, one country, one group, or the zero-access view.

Working on the repo:

Nothing on the simple path is longer than a few minutes; everything complex lives in architecture/, linked from where you'd need it.