# Architecture — provenance & the two multi-map patterns > Contributor front door: [../../documentation/CONTRIBUTING.md](../../documentation/CONTRIBUTING.md). ## Where this comes from — the migration story These maps were built **modular-first**, as standalone embeddable widgets, while the host site still ran on **WordPress**. Each map was a ` ``` ### Pattern B — Multi-profile bundle (several profiles, selected by name) **Use when:** the maps are **genuinely different map types** (different `.vue` logic/layout), but you want them to **share one build** because they import the same slice of the template. One bundle, **multiple** `.vue` profiles at the folder root. The host chooses which profile to mount via the `profile` field — `ProfileLoader` resolves it against the bundle's `import.meta.glob('./*.vue')` registry (key `./.vue`). Still **one script tag**; you select the map per element with `profile`. **Example — `my-upg-100-list`:** two profiles in one bundle — `upg-100-list.vue` and `research-map-clone.vue` — both served by the single `my-upg-100-list-map` element. ```html ``` > **Note — profiles are selected by `profile`, not by separate script tags.** A > bundle ships exactly one `.js`. Whether it has one profile (Pattern A) or > many (Pattern B), you load that one script and pick the profile per element via > `profile-config`. (A bundle *may* additionally register more than one element > **tag** — e.g. `doxa-simple-map` registers both `` and > `` for back-compat — but that's a tag-aliasing concern, separate > from how many maps the bundle offers.) ### Which to pick | | Pattern A — parameterized | Pattern B — multi-profile | |---|---|---| | `.vue` profiles in the bundle | one | several | | Maps differ by | config **parameters** | distinct `.vue` **logic** | | Select a map with | different `profile-config` (same `profile`) | the `profile` field | | Script tags | one | one | | Example | `doxa-simple-map` (3 instances) | `my-upg-100-list` (2 profiles) | ---