# doxa-maps — one build, maps that embed everywhere **A Vite bundler that turns each map into a self-contained web component.** One `bun run build` produces a `doxa-maps/` folder you drop on any host — iframe it, script-embed it, ship it as a mobile app, or open the whole thing as one SPA. **Same code, every screen.** This README is a **show, don't tell** index. Skim the three tables, then jump to the section you need. --- ## Index ### The 5 plugin (app) types — from simplest to full app | # | Capability | What it is | Example plugin | Section | |---|------------|------------|----------------|---------| | 1 | **Single element** | One folder → one bundle → one custom element. The lightest tier. | `doxa-vision-card` | [§1](#cap-1--single-element) | | 2 | **Preset element (prop-table)** | ONE `root.vue` rendered N ways by preset props — one plugin, many maps. | `doxa-simple-map` (prayer · engagement · adoption) | [§1](#cap-2--preset-element-prop-table) | | 3 | **Monolithic / multi-view** | A whole research map, all in one `root.vue`. | `doxa-research-map` | [§1](#cap-3--monolithic-research-map) | | 4 | **Composite element** (nested-element SPA) | A composite element that nests other elements and wires them via props/events. | `my-upg-100-list` | [§1](#cap-4--composite-element) | | 5 | **App shell** (nested-SPA) | The full doxa-maps app — every plugin in one deep-linkable page. | the doxa-maps SPA | [§1](#cap-5--app-shell--the-doxa-maps-app) | ### The 5 deployment methods | # | Method | Status | Section | |---|--------|--------|---------| | 1 | **iframe embed** on any site | required | [§2](#deploy-1--iframe-embed) | | 2 | **Mobile app** (Android / Capacitor) | required | [§2](#deploy-2--mobile-app) | | 3 | **Direct-JS / research dashboard** (props + events + SRI) | required | [§2](#deploy-3--research-dashboard-direct-js) | | 4 | **WordPress** (same artifacts, Custom HTML block) | deferred POC | [§3](#3-cli-commands--installs-per-deploy-method) | | 5 | **Desktop** (Tauri) | deferred POC | [§3](#3-cli-commands--installs-per-deploy-method) | ### CLI commands + what to install Install **[Bun](https://bun.sh)** once, then: ```bash bun install # download node_modules (one time) bun run dev # live plugin gallery at http://localhost:5173 bun run build # build every plugin-designs// → public/doxa-maps/ bun run serve # preview the built tree bun run phone # build → Capacitor → Android APK on a connected device ``` The full command matrix (per deploy method, with prereqs like the Android SDK / JDK for mobile) lives in **§3 → [docs/README-SECTION-3-cli-commands.md](./docs/README-SECTION-3-cli-commands.md)**. > **The data caveat:** maps ship **without data**. Being JAMstack, each fetches its people-group data from an > **API** at runtime, and its Mapbox token from a token endpoint (never baked into the bundle). That is what > keeps them embeddable everywhere. See [docs/how-to.md](./docs/how-to.md). --- ## 1. Plugin types — one screenshot each Every image below is a real map from this repo's `bun run build` output (`public/doxa-maps/`), captured in a headless browser. ### CAP 1 — Single element *One folder → one bundle → one custom element.* The lightest tier: `plugin-designs/doxa-vision-card/`. No map engine, mounts instantly — a self-contained "mission vision card." ![Capability 1 — a single-element plugin (doxa-vision-card)](docs/readme-images/cap1-single-element.png) ### CAP 2 — Preset element (prop-table) *One `root.vue`, many maps.* `plugin-designs/doxa-simple-map/` is a single parameterized profile. A preset prop-table (`simple-map.instances.json`) renders it three ways — **prayer**, **engagement**, **adoption** — each a standalone embeddable page. Same code, three maps. | Prayer | Engagement | Adoption | |--------|------------|----------| | ![Prayer map](docs/readme-images/cap2-prayer.png) | ![Engagement map](docs/readme-images/cap2-engagement.png) | ![Adoption map](docs/readme-images/cap2-adoption.png) | *All three come from the **same** `doxa-simple-map` plugin-design folder — differentiated only by preset props.* ### CAP 3 — Monolithic research map *A whole research map, all from one `root.vue`.* `plugin-designs/doxa-research-map/` — the monolithic tier. ![Capability 3 — the monolithic research map](docs/readme-images/cap3-monolithic-research.png) ### CAP 4 — Composite element *A composite element that nests lower-tier elements and wires them via props/events.* `plugin-designs/my-upg-100-list/` — the UPG-100 list plugin. The composite (`upg-100-mfe`) plus its list pages: | Composite element (`upg-100-mfe`) | List — page 1 | List — page 2 | |-----------------------------------|---------------|---------------| | ![UPG-100 composite](docs/readme-images/cap4-upg100-mfe.png) | ![UPG-100 list page 1](docs/readme-images/cap4-upg100-list-page1.png) | ![UPG-100 list page 2](docs/readme-images/cap4-upg100-list-page2.png) | ### CAP 5 — App shell / the doxa-maps app *The top tier: every plugin in one deep-linkable single-page app* — `public/index.html`, generated by the build. A vertical-tab sidebar groups every plugin by capability (CAP 5 → 1); clicking a row mounts that plugin. This same SPA is the Capacitor mobile-app entry (see deploy 2). ![Capability 5 — the doxa-maps SPA (all plugins, one app)](docs/readme-images/cap5-doxa-maps-spa.png) --- ## 2. Deployment methods — one screenshot each The exact commands + install prereqs for each are in **§3**. These shots show what each method looks like live. ### Deploy 1 — iframe embed *The simplest.* One `