2.9 KiB
Contributing to doxa-maps
Everything a contributor needs, short. Recipes live in documentation/how-to.md, lookups in documentation/reference.md, depth in documentation/architecture/.
The mental model — three zones
library/ (@map) plugin-designs/<map>/ internal/
shared, parameterized ──► your map: its screens ──► the build machine
legend · map · controls (.vue) + private colors, (scripts, staging)
REUSE, never customize api wiring, components NEVER touch
per-map BUILD EVERYTHING HERE
Rule of thumb: local by default — code moves into library/ only when a second map
genuinely needs it. One fix in library/ reaches every map on the next build.
Two ways one bundle shows many maps
- Pattern A — parameterized: one
.vue, many instances differing only by config (*.instances.json→ the build emits one standalone page per instance). - Pattern B — multi-profile: several
.vuescreens in one bundle, selected byprofile-config.profile.
Pick A when the maps differ by configuration, B when they differ by layout/behavior. Full walkthrough + the migration story: documentation/architecture/patterns-and-provenance.md.
The two build steps (never confuse them)
| Command | What | Writes to public/? |
|---|---|---|
bun run dev |
HMR plugin gallery at localhost:5173 — iterate on a map in isolation |
No |
bun run build |
every bundle → public/doxa-maps/<bundle>/<bundle>.js + generated pages |
Yes |
To see a change on the served site: bun run build (or BUNDLE=<name> bun run build:bundle),
then refresh. dev never updates the served tree.
Two-terminal workflow for integration work: terminal 1 bun run build:watch (rebuilds
into public/ on save) · terminal 2 serves the host site / public/.
Where the bundles go
public/ is the committed web-root — serve it from anywhere and every map is embeddable from
it (script tag or the generated per-map page). Same-origin vs external-CDN modes, paths,
embedBaseUrl: documentation/how-to.md → "Where do the maps get served from?".
Ground rules
- Never edit
library/to customize one map (bundle-private code goes in yoursrc/). - Never bake tokens or data into a bundle — everything arrives at runtime via
profile-config. - Before a PR:
bun run build && bun run verifymust pass (adds drop-portability + parse gates). - Colors are values, not logic: documentation/contributing/COLORS.md.
One-line recap
Copy plugin-designs/template-bundle/, change exactly four things (folder name, tag in
index.js, tag/profile strings in index.html, .vue filenames), build everything inside
your folder from @map blocks, bun run build, embed the snippet. That's the whole job.