Prepare repo to the vision: BLUF vision-cast README, library warning, SRI injection, term scrub
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions

- README rewritten as a BLUF-first vision cast for vibe coders (key-terms glossary,
  origin story, features, requirements, data caveat, developer's note).
- library/components/WARNING.md: prototype in your app-profile; only proven,
  parameterized components graduate into the shared library.
- generate-tree.mjs: inject Subresource Integrity (sha384) + crossorigin into the
  standalone page <script> tags and the copy-paste embed snippets (manifest = registry).
- Scrubbed identity-tied phrasing from comments/docs, keeping the technical rationale
  and the mission content.
This commit is contained in:
doxa-maps 2026-09-15 22:58:19 +00:00
parent 73165a0eca
commit 994b8d7dcf
42 changed files with 316 additions and 143 deletions

257
README.md
View file

@ -1,93 +1,236 @@
# doxa-maps
# doxa-maps — a JAMstack map bundler for vibe coders
**A JAMstack bundler for composable, embeddable-first maps — one build outputs every map as a framework-agnostic web component, and composes them into a single-page application.**
> **Built by a vibe coder, for vibe coders.** If you use AI to write your code and you dream
> of making maps to reach your city — your nation — every people group — for Jesus, this is for you.
```
app-profiles/<map>/ bun run build where they run
┌──────────────────┐ ┌──────────────────┐ ┌─────────────────────────┐
│ your map screens │ │ one .js per map │ │ ▸ any partner website │
│ (.vue) + colors + │──────► │ Vue + CSS inlined │────► │ ▸ a SPA (several maps │
│ data wiring │ │ tree-shaken IIFE │ │ in one layout) │
└──────────────────┘ │ + an index.html │ │ ▸ Android/iOS app │
shared library/ ──────► │ per map page │ │ (Capacitor) │
(@map: legend, map, └──────────────────┘ └─────────────────────────┘
controls — reused) public/doxa-maps/… one build → three products
```
---
| The idea | In one line |
|---|---|
| **Bundle** | one self-contained `.js` = a custom HTML tag (`<my-map>`) — drop it on any page, no framework, no build step for the host |
| **Embeddable by default** | every map also gets a generated standalone page — link it or iframe it (Start.me, Notion, any CMS) |
| **Many maps, one bundle** | a bundle holds as many map screens as you want; add a `.vue`, rebuild |
| **Lean & fast** | tree-shaken, Vue + CSS inlined → **one request**, faster than loading Vue from a CDN, nothing to 404 |
| **JAMstack hot-swap** | data API, token, even the map engine (Mapbox ↔ MapLibre) are runtime settings — change them with **no rebuild** |
| **SPA** | compose several maps into one lazy-loaded layout → a full map site from the same build |
## Bottom line up front
> ✨ **Don't write code?** Describe your map to an AI coding agent — start at
> **[docs/tutorial.md](./docs/tutorial.md)**.
**doxa-maps is one repository that holds *all* your maps and turns them into embeddable apps with a single command.**
- **One folder for every map.** Not 50 folders scattered across your laptop — one repo, one shared library.
- **One command to preview:** `bun run dev` → a live playground showing every map in one place, each with a copy‑paste embed snippet.
- **One command to ship:** `bun run build` → every map comes out as a self‑contained file you can drop onto **any** website (your site, a partner church's site, WordPress), compose into a **single‑page app**, or wrap into a **mobile app** — *from the same code.*
You don't have to write the code yourself. Point your AI agent at the example maps in this repo, describe the map you want in plain English, and it builds a new one that reuses the shared library.
> ⚠️ **These maps do not come with their data.** They're JAMstack (pure JavaScript), so they fetch their
> data — like people groups — from an **API** at runtime. See **[The data caveat](#the-data-caveat)** below.
---
## Key terms (don't be afraid of these — you can learn each in one search)
New to this? Read this table first. You do **not** need to memorize it — just know the words exist and where to learn them.
| Term | In plain words | Learn more |
|---|---|---|
| **Vibe coder** | Someone who builds with AI writing most of the code. That's who this is for. | — |
| **JAMstack** | A way of building where the front end is just **J**avaScript, **A**PIs, and **M**arkup (HTML/CSS). It runs almost anywhere — including WordPress. | [jamstack.org](https://jamstack.org) |
| **Bundler** | A tool that takes all your code and packs it into a few ready‑to‑ship files. This repo *is* a bundler for maps. | [vite.dev/guide](https://vite.dev/guide/) |
| **Build step** | The one command (`bun run build`) that turns your code into those shippable files. Your agent can run it for you. | — |
| **bun** | A fast, all‑in‑one replacement for `npm` (installs packages, runs scripts). We use it here. | [bun.sh](https://bun.sh) |
| **node modules** | The reusable code packages your project depends on. `bun install` downloads them into `node_modules/`. | [bun.sh/docs](https://bun.sh/docs/cli/install) |
| **Dev server** | A local preview website (`bun run dev`) that updates live as you edit. Yours runs at `http://localhost:5173`. | — |
| **Vue / React** | Popular, well‑supported frameworks for building front ends. This bundler is built on **Vue** + **Vite**. You commit to learning one. | [vuejs.org](https://vuejs.org) |
| **Web component** | A custom HTML tag (like `<doxa-map>`) that works on any page, no framework required. Each of your maps becomes one. | [MDN: Web Components](https://developer.mozilla.org/en-US/docs/Web/API/Web_components) |
| **iframe** | A safe window that embeds one site inside another. Simple, isolated. | [MDN: iframe](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) |
| **Shadow DOM** | Lets your map's JavaScript run *directly* inside the host page (not walled off in an iframe) so it can integrate deeply — while keeping its styles from clashing. | [MDN: Shadow DOM](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM) |
| **SPA (single‑page application)** | One page that composes several maps together in a layout — a whole map site from one build. | [MDN: SPA](https://developer.mozilla.org/en-US/docs/Glossary/SPA) |
| **CDN** | A URL that serves a file (JavaScript/CSS) to be fetched and run in a browser. When you use Mapbox, you're loading its CDN. Your built maps are served the same way. | [MDN: CDN](https://developer.mozilla.org/en-US/docs/Glossary/CDN) |
| **Minify** | The build shrinks your code into compact, hard‑to‑read (but still working) form — smaller and harder to copy. | [MDN: Minification](https://developer.mozilla.org/en-US/docs/Glossary/Minification) |
| **Capacitor** | Wraps your web app into a real iOS/Android app — **same code, no Swift, no Flutter, no React Native.** | [capacitorjs.com](https://capacitorjs.com) |
| **Lazy loading** | Only loads each map when it's actually needed, so a page with many maps stays fast. | [web.dev: lazy loading](https://web.dev/articles/lazy-loading) |
---
## Have you ever dreamed of making maps?
Here's the story. Maybe it's yours too.
You got into building software right as AI made it possible for anyone to write code. And you had a
vision: **make maps** — every map you could imagine — to advance the Kingdom of God, so that every people
in every place could hear the gospel of Jesus.
So you started. And it worked… for one map. AI is *great* at writing a single map — a couple thousand
lines of code you can embed on a website.
But then you wanted a second map. And a fifth. And a fiftieth. And here's the wall you hit:
- Every new map meant **copying the whole thing** into a new folder — nothing was reusable.
- Your maps grew past 2,000… 5,000… lines of tangled "spaghetti code."
- You ended up with **50 folders, 50 map projects**, scattered across your machine — half of them lost.
- Each one was fragile, glitchy, and impossible to maintain.
**If that's you: you built maps for Jesus. I salute you.** Those maps have their place. But you were
missing one thing — a *framework* that lets all your maps live in one place and share reusable pieces.
That's what this is.
---
## What doxa-maps gives you
- **One repository for all your maps.** Each map is an *application profile* in `app-profiles/<your-map>/`.
- **A shared library of reusable, parameterized components** (`library/` — the map, the legend, the
controls, the search bar) so your maps stop duplicating code.
- **Room for each map's own custom code** — because real maps always have something unique.
- **Rapid prototyping.** Add a `.vue` file, rebuild, and it's live. Build *hundreds* of maps from one library.
- **Your agent's happy place.** Everything's in one folder, so your AI agent has all the context it needs to
build the next map from the examples already here.
---
## The parts that make you do a backflip
- **One build → many embeddable maps.** `bun run build` turns every map into a self‑contained web component
*and* generates a standalone HTML page for each one.
- **Embed anywhere.** Drop a map on your own site, a partner church's site, or WordPress — via an **iframe**
(safe and isolated) *or* via **shadow DOM** (the map's JavaScript runs directly in the page, for deep
integration and power features).
- **Compose maps into a single‑page app.** Put several maps into one layout — a whole multi‑map site — and it
**lazy‑loads** each map so it stays fast even when there are many.
- **Turn it into a mobile app.** The same code runs as an **iOS/Android app** via **Capacitor** — no new
language to learn. Design it mobile‑friendly right in your browser (inspect element → switch to a phone
aspect ratio), then wrap it.
- **Your source stays protected.** The build **minifies** your code — it still runs perfectly, but anyone who
grabs it off a partner site gets compact, hard‑to‑read output, not your clean source.
- **Update once, everywhere.** Serve the built maps from a **CDN**, and when you rebuild, every partner site
that embeds a map picks up the latest version on refresh.
**One codebase → desktop website · embedded on partner sites · WordPress · mobile app · standalone.**
---
## Quickstart
Bun required ([bun.sh](https://bun.sh); `bun.lock` is committed).
You need [**bun**](https://bun.sh) installed (`bun.lock` is committed, so installs are reproducible).
```bash
bun install
bun run build # every app-profiles/<bundle>/ → public/doxa-maps/<bundle>/<bundle>.js
bun run dev # live playground at http://localhost:5173/ — every map, clickable,
# with a copy-paste embed snippet for each
bun install # download node_modules (one time)
bun run dev # the playground: http://localhost:5173
# every map, clickable, with a copy-paste embed snippet for each
bun run build # the build step: every app-profiles/<map>/ becomes
# public/doxa-maps/<map>/<map>.js + a standalone index.html per map
```
## Embed a map
`bun run build` writes everything into **`public/doxa-maps/`** — that's your output folder. Copy it wherever
your site or CDN serves files (for example, a host repo's `public/` directory), and your maps are live.
### Embed a map
```html
<!-- 1) the map engine (Mapbox shown here) -->
<link href="https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.css" rel="stylesheet" />
<script src="https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js"></script>
<script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v5.0.0/mapbox-gl-geocoder.min.js"></script>
<!-- 2) your built map + its custom tag -->
<script src="/doxa-maps/my-map/my-map.js"></script>
<my-map profile-config='{"profile":"my-map","tk":"pk.eyJ..."}'></my-map>
<doxa-map profile-config='{"profile":"my-map","tk":"pk.eyJ..."}'></doxa-map>
```
Or skip the script tag entirely — iframe the map's generated page:
`/doxa-maps/<bundle>/<profile>/index.html`. Both snippets are pre-generated per map in
Prefer not to run JavaScript on the host page? **iframe the generated page instead:**
`/doxa-maps/<map>/<profile>/index.html`. Both snippets are pre‑generated for every map in
`public/doxa-maps/manifest.json`.
---
## A word before you decide
This architecture is probably different from what you're used to. **Different doesn't mean worse** — it
means it can make your life better and let you build the maps of your dreams.
So be honest with yourself. If you don't have big dreams about map‑making, this product might not be for
you — and that's okay. But if you dream of maps that change the world and carry the gospel to places it has
never been, you're going to need **more than a vibe‑coded map**. You'll need a *framework* that supports far
more components than a typical one‑off map. And you'll need a *community*.
You can't form a community around spaghetti‑coded maps. You **can** form one around a shared framework with a
reusable library — because then people prototype on the same foundation and build something stronger
together, where maps never have to be rewritten from scratch.
## Requirements — the one small wall (and it's worth it)
Someone once told me: *don't reinvent the wheel — use Vue and Vite instead of hand‑rolling vanilla
JavaScript.* They were right. So here's the honest deal before you start:
1. **Commit to learning Vue *or* React.** This bundler is built on **Vue + Vite** and supports both patterns.
You don't have to master it — but pick one and lean in. (Afraid you can't learn a new architecture? You
can. The concepts are one search away — that's what the glossary above is for.)
2. **Learn the four basics** (your agent can run all of them):
- `bun install` — get the dependencies
- `bun run dev` — the dev server (live preview)
- `bun run build` — the build step (ship it)
- what `node_modules` are (the downloaded dependencies)
3. **You do *not* need to write the code.** Give your agent access to the example maps in `app-profiles/` plus
the shared `library/`, describe your map in plain English, and it builds a new map that reuses the library
instead of duplicating spaghetti.
That's the wall. It's small, and everything past it is the maps of your dreams.
---
## The data caveat
Read this so nothing surprises you: **the maps ship without their data.** Because they're JAMstack (pure
JavaScript), each map fetches its data — like people‑group information — from an **API** at runtime. That's
what keeps them embeddable everywhere.
Your map data has to come from somewhere. Common sources:
- **[Joshua Project](https://joshuaproject.net)**
- **[PeopleGroups.org](https://peoplegroups.org)**
- **A project API.** doxa-maps was originally built to serve **DX**, which runs its own people‑group API
(`https://pray.doxa.life`) covering the unreached people groups these maps were made to pray over. The data
source, the map token, and even the map engine (Mapbox ↔ MapLibre) are **runtime settings** — change them
with **no rebuild**.
---
## Docs
| Read this | When |
|---|---|
| **[why.md](./docs/why.md)** | 2 min — the problem, the "map islands" idea, one diagram |
| **[tutorial.md](./docs/tutorial.md)** | build your first map, step by step |
| **[how-to.md](./docs/how-to.md)** | task recipes — embed, iframe, SPA, colors, mobile, tokens |
| **[reference.md](./docs/reference.md)** | lookup — config fields, build scripts, contracts |
| **[architecture/](./docs/architecture/)** | the deep end — full contracts and catalogs, when you want them |
| **[docs/why.md](./docs/why.md)** | 2 min — the problem, the idea, one diagram |
| **[docs/tutorial.md](./docs/tutorial.md)** | build your first map, step by step (great to hand to your agent) |
Contributors: **[CONTRIBUTING.md](./CONTRIBUTING.md)**.
---
## The output — real maps from this bundler
## A note from the developer
Every map below is a single self-contained bundle built by one `bun run build`, embeddable on any
site with one `<script>` + tag. Colors are data-driven **color strategies** (`@map/colors/`).
> **Bottom line: maps should be open source, they should run everywhere, and no movement of God has ever
> moved without them.**
### Research Map — the full example
`doxa-research-map` · `<doxa-research-map>` — 7 tabs (prayer, adoption, engagement, regions,
languages, religions) with clustering, filters, legends and poster export. This is the reference
map that shows everything the library can do.
You found some really cool maps on the internet, didn't you? On discipleship sites, maybe — maps that
inspired you, that made you want to build your own. But the code wasn't available. Or if it was, it wasn't
written to run on WordPress, or on your own site, or across your partner churches' websites. It wasn't
simple. It wasn't modular. It didn't work the way you needed it to.
![Research Map](docs/assets/showcase/research-map.png)
That was me too. That's why I built this framework. I love maps — I'm going to build maps until the day I
die — because I want to see the Kingdom of God advance to the places it has never been, and I long to see a
global movement of map‑makers multiplying maps everywhere.
### Prayer Map — the flagship embed
`doxa-simple-map` · `<doxa-map>` · prayer instance · color: prayer-progress · **Semantic Tree
Legend** — the prayer map built for embedding on partner sites at scale.
I want the Great Commission fulfilled in my lifetime, and there is no global movement without map‑making.
Look at Scripture: *Jerusalem, Judea, Samaria, and the ends of the earth* — the book of Acts is a map, all
the way to Rome. Where do you find a movement of God without maps at its white‑hot center? Nowhere. So why
would we lock our maps away and make them closed source? Why should the power to make a map sit in the hands
of a few who never release their code?
![Prayer Map](docs/assets/showcase/prayer-map.png)
It shouldn't. **This was built to be open source, to serve movements of God** — so the maps can multiply to
every device: WordPress, your own site, an embeddable script on Squarespace, mobile, anywhere an embed can
run. If we want to put map‑making into the hands of every disciple, we need a framework that lets the maps
*go*, lets them be *reusable*, and lets a community build them *together*.
> Each also builds its own standalone page (`/doxa-maps/<bundle>/<profile>/index.html`) — link it
> or iframe it on a partner site. See **[docs/why.md](./docs/why.md)** for the idea and
> **[docs/how-to.md](./docs/how-to.md)** to build your own.
If you have a vision to reach the globe but you've been stuck vibe‑coding an entire platform alone — with no
open‑source foundation that runs on your site and your partners' sites — that gap isn't your fault, and you
don't have to stay there. You can escape it by adopting a framework that has already been where you are.
Come build the maps of your dreams. Let's reach every people, in every place.
## License
The **doxa-maps template** (`library/` + build tooling) is **Apache-2.0** — a permissive base
everyone shares. Your maps under `app-profiles/<bundle>/` are **yours**: your colors, API
connections, and i18n. Full text: **[LICENSE](./LICENSE)**.
**Open source.** We want this in the hands of every map‑maker on earth — because we want the whole earth
to hear the gospel of Jesus. Make all the maps of your dreams. Reach your city. Reach every people, in every place.

View file

@ -37,7 +37,7 @@ the app is rebuilt.**
| File | What it does |
|---|---|
| `generate.mjs` | THE template. Reads the profile data, writes one HTML poster per zone. |
| `shoot.mjs` | Screenshots each poster to PNG (Firefox — never Chromium; ZERO-GOOGLE law). |
| `shoot.mjs` | Screenshots each poster to PNG (Firefox — never Chromium; privacy-first policy). |
| `poster-regions.mjs` | The region map (India, Africa, …). Shared by both gallery builders. |
| `build-gallery.mjs` | `out/index.html` — browsable preview grid, sectioned by region. |
| `build-hd-gallery.mjs` | `out/hd.html` — full-resolution review + copy-to-clipboard. |

View file

@ -367,7 +367,7 @@ function bundleHtml(b, index, manifest) {
* opts.bakedToken opt-in literal token baked from build-config (ladder rung 3)
*/
function mapPageHtml(opts) {
const { title, tag, config, jsSrc, apiBaseUrl, tokenUrlExpr, bakedToken } = opts
const { title, tag, config, jsSrc, apiBaseUrl, tokenUrlExpr, bakedToken, integrity } = opts
const apiScript = apiBaseUrl
? `\n <script>window.MAP_APP_API_URL = ${JSON.stringify(apiBaseUrl)};</script>`
: ''
@ -403,7 +403,7 @@ function mapPageHtml(opts) {
<div id="status">loading token…</div>
${apiScript}
<!-- Bundle IIFE — registers the <${esc(tag)}> custom element. -->
<script src="${esc(jsSrc)}"></script>
<script src="${esc(jsSrc)}"${integrity ? ` integrity="${esc(integrity)}" crossorigin="anonymous"` : ''}></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:
@ -512,6 +512,7 @@ function profileHtml(b, profile, tokenUrlExpr, bakedToken) {
apiBaseUrl: DEST_CONFIG.apiBaseUrl,
tokenUrlExpr,
bakedToken,
integrity: b.integrity,
})
}
@ -530,6 +531,7 @@ function instanceHtml(b, profile, inst, tokenUrlExpr, bakedToken) {
apiBaseUrl: inst.apiBaseUrl || DEST_CONFIG.apiBaseUrl,
tokenUrlExpr,
bakedToken,
integrity: b.integrity,
})
}
@ -597,6 +599,20 @@ function scanBundles() {
const bundleElements = extractElements(join(dir, 'index.js'))
const tag = bundleElements[0] || entry
// SUBRESOURCE INTEGRITY (sha384) of the built bundle IIFE. Vite has already
// emitted it to DEFAULT_ROOT by the time generate-tree runs, so we can hash it
// HERE and thread the value into every <script> tag we generate (standalone
// pages + copy-paste embed snippets). A tampered / CDN-swapped bundle then fails
// the browser's integrity check and is REFUSED. crossorigin="anonymous" is
// required for the check to run on cross-origin (CDN) loads. Missing .js → null
// → tags omit integrity (graceful, e.g. `bun run tree` before a build).
let integrity = null
try {
integrity = 'sha384-' + createHash('sha384').update(
readFileSync(join(DEFAULT_ROOT, entry, entry + '.js'))
).digest('base64')
} catch { integrity = null }
const profiles = vueFiles.map((file) => {
const tags = extractHeaderTags(join(dir, file))
const { description, file: fileTag, ...rest } = tags
@ -614,7 +630,7 @@ function scanBundles() {
`<iframe src="${iframeUrl}" width="100%" height="600" ` +
`style="border:none;border-radius:12px;" allowfullscreen></iframe>`
const scriptEmbed =
`<script src="${scriptUrl}"><\/script>\n` +
`<script src="${scriptUrl}"${integrity ? ` integrity="${integrity}" crossorigin="anonymous"` : ''}><\/script>\n` +
`<${tag} profile-config='{"profile":"${profileName}","tk":"YOUR_MAPBOX_TOKEN"}'></${tag}>`
// Preconfigured instances: ONE parameterized profile → N preset render
@ -647,6 +663,7 @@ function scanBundles() {
// Absolute-or-root-relative URL to the bundle IIFE (paste-anywhere).
scriptUrl: `${EMBED_BASE}/${entry}/${entry}.js`,
output: `${TREE_NAME}/${entry}/${entry}.js`,
integrity,
elements: bundleElements,
profiles,
})
@ -700,15 +717,8 @@ function writeManifestAndHtml(root, bundles, tokenUrlExpr, bakedToken) {
function main() {
const bundles = scanBundles()
// SUBRESOURCE INTEGRITY: hash each built bundle IIFE so the app-shell can load it with
// integrity="sha384-…" and REFUSE a tampered/CDN-swapped bundle. Vite has already emitted
// the .js into DEFAULT_ROOT by the time this runs (bun run build = vite → generate-tree).
for (const b of bundles) {
try {
const buf = readFileSync(join(DEFAULT_ROOT, b.bundle, b.bundle + '.js'))
b.integrity = 'sha384-' + createHash('sha384').update(buf).digest('base64')
} catch { b.integrity = null }
}
// SUBRESOURCE INTEGRITY is computed inside scanBundles() (each bundle record carries
// `integrity`), so it is available to the embed snippets AND the generated <script> tags.
const tokenUrlExpr = readTokenUrlExpr()
const bakedToken = DEST_CONFIG.token // opt-in literal token (ladder rung 3); '' by default

View file

@ -0,0 +1,20 @@
# ⚠️ Read before you touch these components
**These are the SHARED, REUSABLE components — every map in `app-profiles/` depends on them.**
A change here does not affect one map. It ripples to **all** of them. So:
- **Prototyping or experimenting? Don't edit these.** Put your custom, one-off, not-yet-proven component
inside your own map's folder (`app-profiles/<your-map>/`), where it can be as messy as you need and
breaks nothing else.
- **Only proven, parameterized, reusable components graduate into this library.** If a component has hard-coded
values, assumptions about one specific map, or hasn't been used by more than one map yet — it is **not**
ready to live here.
- **A reusable component takes props, not assumptions.** Before you move something in, make it parameterized:
the map, the legend, the controls, the search bar all take configuration — yours should too.
- **If you must change a shared component, check every map that uses it.** Run `bun run dev` and click through
the maps before you commit. The whole point of this library is that maps *don't* have to be rewritten —
don't undo that by breaking the shared pieces.
Rule of thumb: **custom code in your app-profile, reusable code in the library — and things only move from the
first to the second once they've earned it.**

View file

@ -9,7 +9,7 @@
*
* ═══ WHY HAND-ROLLED SVG AND NOT A CHART LIBRARY ════════════════════════════
* SELF-HOSTED ONLY. A chart CDN request from a persecuted user's device leaks their
* IP to a third party — that is the zero-Google / self-sovereign rule, and it is a
* IP to a third party — that is the privacy-first rule (no third-party calls), and it is a
* SAFETY rule, not a preference. The alternative to a CDN is vendoring a library the
* way DataTable.vue vendors Tabulator (443KB, injected at runtime); for bars that is
* paying a runtime fetch, a shadow-root stylesheet injection and a version to track

View file

@ -22,7 +22,7 @@
*
* SELF-HOSTED, NEVER A CDN. Vendored at public/assets/vendor/tabulator/ (v6.3.1).
* A CDN request from a persecuted user's device leaks their IP to a third party —
* that is the ZERO-GOOGLE / self-sovereign rule, and it is a safety rule, not a
* that is the privacy-first rule (no third-party calls), and it is a safety rule, not a
* preference. geo-steward vendors the same way.
*
* ═══ SHADOW-DOM CAVEAT (measured today, twice) ══════════════════════════════

View file

@ -9,7 +9,7 @@ data via an env var once silently rendered stale posters (Nepal, Bangladesh, Bhu
HTML per zone PNG @3000² assets/previews/ app shows them
```
- `generate.mjs` is the template; `shoot.mjs` screenshots to PNG (Firefox only — ZERO-GOOGLE law).
- `generate.mjs` is the template; `shoot.mjs` screenshots to PNG (Firefox only — privacy-first policy).
- A template change is not visible in the app until previews are regenerated **and** the app rebuilt.
- Exported PNGs go to a sibling folder (`../../../upg-100-posters/`), never `public/` — Capacitor
packages `public/` wholesale.

View file

@ -20,8 +20,8 @@
// NO key and NO account, which is the whole point:
// * a Mapbox token in a client-side poster generator is a credential to leak;
// * a token means an account, and an account is a name — against the
// nameless/faceless stance for persecution-sensitive work;
// * ZERO-GOOGLE / self-sovereign: no third party gets to log who rendered what.
// no-account privacy stance for sensitive-context work;
// * privacy-first: no third party gets to log who rendered what.
//
// ═══ USAGE POLICY IS A HARD CONSTRAINT, NOT A SUGGESTION ════════════════════
// OSM's tile servers are donated infrastructure. Their policy requires an

View file

@ -16,7 +16,7 @@
// renderer, which is the discipline the poster README already mandates and which
// nothing was actually enforcing.
//
// FIREFOX, never Chromium (ZERO-GOOGLE). No WebGL needed: an SVG poster is DOM.
// FIREFOX, never Chromium (privacy-first: no third-party browser telemetry). No WebGL needed: an SVG poster is DOM.
//
// THE GUARD IS ONLY WORTH ITS GREEN IF IT CAN GO RED. Each check below states the
// real defect it would have caught, so a future reader can corrupt an input and

View file

@ -3,7 +3,7 @@
// node fetch-connectivity.mjs -> out/connectivity-by-country.json
//
// SOURCE: World Bank Open Data (api.worldbank.org, v2). Public, no key, no account
// — which satisfies the nameless/faceless constraint (no signups).
// — which satisfies the no-account privacy constraint (no signups).
// IT.NET.USER.ZS individuals using the internet, % of population
// IT.CEL.SETS.P2 mobile cellular subscriptions per 100 people
// SP.POP.TOTL population

View file

@ -12,7 +12,7 @@
// from a source that can be cited per row. This is that step.
//
// SOURCE: Nominatim (OpenStreetMap), reverse geocoding.
// - NO ACCOUNT, no API key — satisfies the nameless/faceless constraint.
// - NO ACCOUNT, no API key — satisfies the no-account privacy constraint.
// - Licence ODbL 1.0, attribution "© OpenStreetMap contributors" carried per row.
// - CHOSEN OVER GeoNames because GeoNames' shared `demo` user is exhausted
// ("daily limit of 20000 credits for demo has been exceeded") and a real

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <cities-internet-map> custom element. -->
<script src="../cities-internet.js"></script>
<script src="../cities-internet.js" integrity="sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <cities-internet-map> custom element. -->
<script src="../cities-internet.js"></script>
<script src="../cities-internet.js" integrity="sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <cities-internet-map> custom element. -->
<script src="../cities-internet.js"></script>
<script src="../cities-internet.js" integrity="sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"cities-internet","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"cities-internet","scriptUrl":"./cities-internet/cities-internet.js","output":"doxa-maps/cities-internet/cities-internet.js","elements":["cities-internet-map"],"profiles":[{"profile":"connectivity-list","file":"connectivity-list.vue","description":"","element":"cities-internet-map","iframeUrl":"./cities-internet/connectivity-list/index.html","scriptUrl":"./cities-internet/cities-internet.js","embed":{"iframe":"\u003ciframe src=\"./cities-internet/connectivity-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./cities-internet/cities-internet.js\">\u003c/script>\n\u003ccities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/cities-internet-map>"}},{"profile":"connectivity-map","file":"connectivity-map.vue","description":"","element":"cities-internet-map","iframeUrl":"./cities-internet/connectivity-map/index.html","scriptUrl":"./cities-internet/cities-internet.js","embed":{"iframe":"\u003ciframe src=\"./cities-internet/connectivity-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./cities-internet/cities-internet.js\">\u003c/script>\n\u003ccities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/cities-internet-map>"}},{"profile":"data-tables","file":"data-tables.vue","description":"","element":"cities-internet-map","iframeUrl":"./cities-internet/data-tables/index.html","scriptUrl":"./cities-internet/cities-internet.js","embed":{"iframe":"\u003ciframe src=\"./cities-internet/data-tables/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./cities-internet/cities-internet.js\">\u003c/script>\n\u003ccities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/cities-internet-map>"}}],"integrity":"sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"cities-internet","scriptUrl":"./cities-internet/cities-internet.js","output":"doxa-maps/cities-internet/cities-internet.js","integrity":"sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH","elements":["cities-internet-map"],"profiles":[{"profile":"connectivity-list","file":"connectivity-list.vue","description":"","element":"cities-internet-map","iframeUrl":"./cities-internet/connectivity-list/index.html","scriptUrl":"./cities-internet/cities-internet.js","embed":{"iframe":"\u003ciframe src=\"./cities-internet/connectivity-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/cities-internet-map>"}},{"profile":"connectivity-map","file":"connectivity-map.vue","description":"","element":"cities-internet-map","iframeUrl":"./cities-internet/connectivity-map/index.html","scriptUrl":"./cities-internet/cities-internet.js","embed":{"iframe":"\u003ciframe src=\"./cities-internet/connectivity-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/cities-internet-map>"}},{"profile":"data-tables","file":"data-tables.vue","description":"","element":"cities-internet-map","iframeUrl":"./cities-internet/data-tables/index.html","scriptUrl":"./cities-internet/cities-internet.js","embed":{"iframe":"\u003ciframe src=\"./cities-internet/data-tables/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/cities-internet-map>"}}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js"></script>
<script src="../country-posters.js" integrity="sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js"></script>
<script src="../country-posters.js" integrity="sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"country-posters","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"country-posters","scriptUrl":"./country-posters/country-posters.js","output":"doxa-maps/country-posters/country-posters.js","elements":["country-posters-map"],"profiles":[{"profile":"countries-map","file":"countries-map.vue","description":"","element":"country-posters-map","iframeUrl":"./country-posters/countries-map/index.html","scriptUrl":"./country-posters/country-posters.js","embed":{"iframe":"\u003ciframe src=\"./country-posters/countries-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./country-posters/country-posters.js\">\u003c/script>\n\u003ccountry-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/country-posters-map>"}},{"profile":"country-poster-wall","file":"country-poster-wall.vue","description":"","element":"country-posters-map","iframeUrl":"./country-posters/country-poster-wall/index.html","scriptUrl":"./country-posters/country-posters.js","embed":{"iframe":"\u003ciframe src=\"./country-posters/country-poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./country-posters/country-posters.js\">\u003c/script>\n\u003ccountry-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/country-posters-map>"}}],"integrity":"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"country-posters","scriptUrl":"./country-posters/country-posters.js","output":"doxa-maps/country-posters/country-posters.js","integrity":"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw","elements":["country-posters-map"],"profiles":[{"profile":"countries-map","file":"countries-map.vue","description":"","element":"country-posters-map","iframeUrl":"./country-posters/countries-map/index.html","scriptUrl":"./country-posters/country-posters.js","embed":{"iframe":"\u003ciframe src=\"./country-posters/countries-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./country-posters/country-posters.js\" integrity=\"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccountry-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/country-posters-map>"}},{"profile":"country-poster-wall","file":"country-poster-wall.vue","description":"","element":"country-posters-map","iframeUrl":"./country-posters/country-poster-wall/index.html","scriptUrl":"./country-posters/country-posters.js","embed":{"iframe":"\u003ciframe src=\"./country-posters/country-poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./country-posters/country-posters.js\" integrity=\"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw\" crossorigin=\"anonymous\">\u003c/script>\n\u003ccountry-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/country-posters-map>"}}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <demo-map> custom element. -->
<script src="../demo-map.js"></script>
<script src="../demo-map.js" integrity="sha384-yF/Cx1BKdbEFJU6rmzkEzUkiLe0UpM1XdSO2Pn2p1liyOVurnV+OUxy4wPXdY4rI" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"demo-map","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"demo-map","scriptUrl":"./demo-map/demo-map.js","output":"doxa-maps/demo-map/demo-map.js","elements":["demo-map"],"profiles":[{"profile":"demo-map","file":"demo-map.vue","description":"Simple two-tab demo map. Tab 1 colors pins by religion (shared","element":"demo-map","iframeUrl":"./demo-map/demo-map/index.html","scriptUrl":"./demo-map/demo-map.js","embed":{"iframe":"\u003ciframe src=\"./demo-map/demo-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./demo-map/demo-map.js\">\u003c/script>\n\u003cdemo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/demo-map>"},"bundle":"demo-map"}],"integrity":"sha384-yF/Cx1BKdbEFJU6rmzkEzUkiLe0UpM1XdSO2Pn2p1liyOVurnV+OUxy4wPXdY4rI"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"demo-map","scriptUrl":"./demo-map/demo-map.js","output":"doxa-maps/demo-map/demo-map.js","integrity":"sha384-yF/Cx1BKdbEFJU6rmzkEzUkiLe0UpM1XdSO2Pn2p1liyOVurnV+OUxy4wPXdY4rI","elements":["demo-map"],"profiles":[{"profile":"demo-map","file":"demo-map.vue","description":"Simple two-tab demo map. Tab 1 colors pins by religion (shared","element":"demo-map","iframeUrl":"./demo-map/demo-map/index.html","scriptUrl":"./demo-map/demo-map.js","embed":{"iframe":"\u003ciframe src=\"./demo-map/demo-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./demo-map/demo-map.js\" integrity=\"sha384-yF/Cx1BKdbEFJU6rmzkEzUkiLe0UpM1XdSO2Pn2p1liyOVurnV+OUxy4wPXdY4rI\" crossorigin=\"anonymous\">\u003c/script>\n\u003cdemo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/demo-map>"},"bundle":"demo-map"}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"doxa-research-map","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"doxa-research-map","scriptUrl":"./doxa-research-map/doxa-research-map.js","output":"doxa-maps/doxa-research-map/doxa-research-map.js","elements":["doxa-research-map"],"profiles":[{"profile":"research-map","file":"research-map.vue","description":"","element":"doxa-research-map","iframeUrl":"./doxa-research-map/research-map/index.html","scriptUrl":"./doxa-research-map/doxa-research-map.js","embed":{"iframe":"\u003ciframe src=\"./doxa-research-map/research-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./doxa-research-map/doxa-research-map.js\">\u003c/script>\n\u003cdoxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/doxa-research-map>"}}],"integrity":"sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"doxa-research-map","scriptUrl":"./doxa-research-map/doxa-research-map.js","output":"doxa-maps/doxa-research-map/doxa-research-map.js","integrity":"sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR","elements":["doxa-research-map"],"profiles":[{"profile":"research-map","file":"research-map.vue","description":"","element":"doxa-research-map","iframeUrl":"./doxa-research-map/research-map/index.html","scriptUrl":"./doxa-research-map/doxa-research-map.js","embed":{"iframe":"\u003ciframe src=\"./doxa-research-map/research-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR\" crossorigin=\"anonymous\">\u003c/script>\n\u003cdoxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/doxa-research-map>"}}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-research-map> custom element. -->
<script src="../doxa-research-map.js"></script>
<script src="../doxa-research-map.js" integrity="sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../doxa-simple-map.js"></script>
<script src="../doxa-simple-map.js" integrity="sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-map> custom element. -->
<script src="../../doxa-simple-map.js"></script>
<script src="../../doxa-simple-map.js" integrity="sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"doxa-simple-map","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"doxa-simple-map","scriptUrl":"./doxa-simple-map/doxa-simple-map.js","output":"doxa-maps/doxa-simple-map/doxa-simple-map.js","elements":["doxa-map","doxa-simple-map"],"profiles":[{"profile":"doxa-simple-map","file":"doxa-simple-map.vue","description":"","element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/index.html","scriptUrl":"./doxa-simple-map/doxa-simple-map.js","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./doxa-simple-map/doxa-simple-map.js\">\u003c/script>\n\u003cdoxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/doxa-map>"},"instances":[{"id":"prayer","title":"Prayer Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-prayer","dataSource":"pray-tools","tabs":[{"id":"prayer","colorStrategy":"prayer","legend":"prayer","popup":"prayer"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/prayer/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/prayer/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}},{"id":"engagement","title":"Engagement Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-engagement","dataSource":"pray-tools","tabs":[{"id":"engagement","colorStrategy":"engagement","legend":"engagement","popup":"engagement"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/engagement/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/engagement/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}},{"id":"adoption","title":"Adoption Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-adoption","dataSource":"pray-tools","tabs":[{"id":"adoption","colorStrategy":"adoption","legend":"adoption","popup":"adoption"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/adoption/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/adoption/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}}]}],"integrity":"sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"doxa-simple-map","scriptUrl":"./doxa-simple-map/doxa-simple-map.js","output":"doxa-maps/doxa-simple-map/doxa-simple-map.js","integrity":"sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf","elements":["doxa-map","doxa-simple-map"],"profiles":[{"profile":"doxa-simple-map","file":"doxa-simple-map.vue","description":"","element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/index.html","scriptUrl":"./doxa-simple-map/doxa-simple-map.js","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf\" crossorigin=\"anonymous\">\u003c/script>\n\u003cdoxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/doxa-map>"},"instances":[{"id":"prayer","title":"Prayer Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-prayer","dataSource":"pray-tools","tabs":[{"id":"prayer","colorStrategy":"prayer","legend":"prayer","popup":"prayer"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/prayer/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/prayer/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}},{"id":"engagement","title":"Engagement Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-engagement","dataSource":"pray-tools","tabs":[{"id":"engagement","colorStrategy":"engagement","legend":"engagement","popup":"engagement"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/engagement/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/engagement/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}},{"id":"adoption","title":"Adoption Map","apiBaseUrl":"https://pray.doxa.life","props":{"profile":"doxa-simple-map","instanceId":"embed-adoption","dataSource":"pray-tools","tabs":[{"id":"adoption","colorStrategy":"adoption","legend":"adoption","popup":"adoption"}]},"element":"doxa-map","iframeUrl":"./doxa-simple-map/doxa-simple-map/adoption/index.html","embed":{"iframe":"\u003ciframe src=\"./doxa-simple-map/doxa-simple-map/adoption/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>"}}]}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js"></script>
<script src="../gospel-resources.js" integrity="sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js"></script>
<script src="../gospel-resources.js" integrity="sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"gospel-resources","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"gospel-resources","scriptUrl":"./gospel-resources/gospel-resources.js","output":"doxa-maps/gospel-resources/gospel-resources.js","elements":["gospel-resources-map"],"profiles":[{"profile":"charts","file":"charts.vue","description":"","element":"gospel-resources-map","iframeUrl":"./gospel-resources/charts/index.html","scriptUrl":"./gospel-resources/gospel-resources.js","embed":{"iframe":"\u003ciframe src=\"./gospel-resources/charts/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./gospel-resources/gospel-resources.js\">\u003c/script>\n\u003cgospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/gospel-resources-map>"}},{"profile":"data-tables","file":"data-tables.vue","description":"","element":"gospel-resources-map","iframeUrl":"./gospel-resources/data-tables/index.html","scriptUrl":"./gospel-resources/gospel-resources.js","embed":{"iframe":"\u003ciframe src=\"./gospel-resources/data-tables/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./gospel-resources/gospel-resources.js\">\u003c/script>\n\u003cgospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/gospel-resources-map>"}},{"profile":"resources-list","file":"resources-list.vue","description":"","element":"gospel-resources-map","iframeUrl":"./gospel-resources/resources-list/index.html","scriptUrl":"./gospel-resources/gospel-resources.js","embed":{"iframe":"\u003ciframe src=\"./gospel-resources/resources-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./gospel-resources/gospel-resources.js\">\u003c/script>\n\u003cgospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/gospel-resources-map>"}},{"profile":"resources-map","file":"resources-map.vue","description":"","element":"gospel-resources-map","iframeUrl":"./gospel-resources/resources-map/index.html","scriptUrl":"./gospel-resources/gospel-resources.js","embed":{"iframe":"\u003ciframe src=\"./gospel-resources/resources-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./gospel-resources/gospel-resources.js\">\u003c/script>\n\u003cgospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/gospel-resources-map>"}}],"integrity":"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"gospel-resources","scriptUrl":"./gospel-resources/gospel-resources.js","output":"doxa-maps/gospel-resources/gospel-resources.js","integrity":"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv","elements":["gospel-resources-map"],"profiles":[{"profile":"charts","file":"charts.vue","description":"","element":"gospel-resources-map","iframeUrl":"./gospel-resources/charts/index.html","scriptUrl":"./gospel-resources/gospel-resources.js","embed":{"iframe":"\u003ciframe src=\"./gospel-resources/charts/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv\" crossorigin=\"anonymous\">\u003c/script>\n\u003cgospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/gospel-resources-map>"}},{"profile":"data-tables","file":"data-tables.vue","description":"","element":"gospel-resources-map","iframeUrl":"./gospel-resources/data-tables/index.html","scriptUrl":"./gospel-resources/gospel-resources.js","embed":{"iframe":"\u003ciframe src=\"./gospel-resources/data-tables/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv\" crossorigin=\"anonymous\">\u003c/script>\n\u003cgospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/gospel-resources-map>"}},{"profile":"resources-list","file":"resources-list.vue","description":"","element":"gospel-resources-map","iframeUrl":"./gospel-resources/resources-list/index.html","scriptUrl":"./gospel-resources/gospel-resources.js","embed":{"iframe":"\u003ciframe src=\"./gospel-resources/resources-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv\" crossorigin=\"anonymous\">\u003c/script>\n\u003cgospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/gospel-resources-map>"}},{"profile":"resources-map","file":"resources-map.vue","description":"","element":"gospel-resources-map","iframeUrl":"./gospel-resources/resources-map/index.html","scriptUrl":"./gospel-resources/gospel-resources.js","embed":{"iframe":"\u003ciframe src=\"./gospel-resources/resources-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv\" crossorigin=\"anonymous\">\u003c/script>\n\u003cgospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/gospel-resources-map>"}}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js"></script>
<script src="../gospel-resources.js" integrity="sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js"></script>
<script src="../gospel-resources.js" integrity="sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -9,6 +9,7 @@
"bundle": "cities-internet",
"scriptUrl": "./cities-internet/cities-internet.js",
"output": "doxa-maps/cities-internet/cities-internet.js",
"integrity": "sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH",
"elements": [
"cities-internet-map"
],
@ -22,7 +23,7 @@
"scriptUrl": "./cities-internet/cities-internet.js",
"embed": {
"iframe": "<iframe src=\"./cities-internet/connectivity-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./cities-internet/cities-internet.js\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></cities-internet-map>"
"script": "<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></cities-internet-map>"
}
},
{
@ -34,7 +35,7 @@
"scriptUrl": "./cities-internet/cities-internet.js",
"embed": {
"iframe": "<iframe src=\"./cities-internet/connectivity-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./cities-internet/cities-internet.js\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></cities-internet-map>"
"script": "<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"connectivity-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></cities-internet-map>"
}
},
{
@ -46,16 +47,16 @@
"scriptUrl": "./cities-internet/cities-internet.js",
"embed": {
"iframe": "<iframe src=\"./cities-internet/data-tables/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./cities-internet/cities-internet.js\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></cities-internet-map>"
"script": "<script src=\"./cities-internet/cities-internet.js\" integrity=\"sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH\" crossorigin=\"anonymous\"></script>\n<cities-internet-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></cities-internet-map>"
}
}
],
"integrity": "sha384-YnTDBEhRnIxoJ9mWpnBVw9MDyvAkqQXZzNB+OMAl3GIxlS1336ABRVzm8gPrd7bH"
]
},
{
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "doxa-maps/country-posters/country-posters.js",
"integrity": "sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw",
"elements": [
"country-posters-map"
],
@ -69,7 +70,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/countries-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./country-posters/country-posters.js\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></country-posters-map>"
"script": "<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></country-posters-map>"
}
},
{
@ -81,16 +82,16 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./country-posters/country-posters.js\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></country-posters-map>"
"script": "<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></country-posters-map>"
}
}
],
"integrity": "sha384-gIkk5MKMkDoV982KSTlcfbC1I5FdErxb09MsYgt5jdw9JZD2rsMmjvgg3DcIxITw"
]
},
{
"bundle": "demo-map",
"scriptUrl": "./demo-map/demo-map.js",
"output": "doxa-maps/demo-map/demo-map.js",
"integrity": "sha384-yF/Cx1BKdbEFJU6rmzkEzUkiLe0UpM1XdSO2Pn2p1liyOVurnV+OUxy4wPXdY4rI",
"elements": [
"demo-map"
],
@ -104,17 +105,17 @@
"scriptUrl": "./demo-map/demo-map.js",
"embed": {
"iframe": "<iframe src=\"./demo-map/demo-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./demo-map/demo-map.js\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></demo-map>"
"script": "<script src=\"./demo-map/demo-map.js\" integrity=\"sha384-yF/Cx1BKdbEFJU6rmzkEzUkiLe0UpM1XdSO2Pn2p1liyOVurnV+OUxy4wPXdY4rI\" crossorigin=\"anonymous\"></script>\n<demo-map profile-config='{\"profile\":\"demo-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></demo-map>"
},
"bundle": "demo-map"
}
],
"integrity": "sha384-yF/Cx1BKdbEFJU6rmzkEzUkiLe0UpM1XdSO2Pn2p1liyOVurnV+OUxy4wPXdY4rI"
]
},
{
"bundle": "doxa-research-map",
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"output": "doxa-maps/doxa-research-map/doxa-research-map.js",
"integrity": "sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR",
"elements": [
"doxa-research-map"
],
@ -128,16 +129,16 @@
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"embed": {
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./doxa-research-map/doxa-research-map.js\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></doxa-research-map>"
"script": "<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></doxa-research-map>"
}
}
],
"integrity": "sha384-HQlyfuflA7J+wVY9UpJbQVVjCHzX1dYwkyp9+ovboEzC0Z0G90lfrQvVcAPquHVR"
]
},
{
"bundle": "doxa-simple-map",
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
"output": "doxa-maps/doxa-simple-map/doxa-simple-map.js",
"integrity": "sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf",
"elements": [
"doxa-map",
"doxa-simple-map"
@ -152,7 +153,7 @@
"scriptUrl": "./doxa-simple-map/doxa-simple-map.js",
"embed": {
"iframe": "<iframe src=\"./doxa-simple-map/doxa-simple-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./doxa-simple-map/doxa-simple-map.js\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></doxa-map>"
"script": "<script src=\"./doxa-simple-map/doxa-simple-map.js\" integrity=\"sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf\" crossorigin=\"anonymous\"></script>\n<doxa-map profile-config='{\"profile\":\"doxa-simple-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></doxa-map>"
},
"instances": [
{
@ -226,13 +227,13 @@
}
]
}
],
"integrity": "sha384-C2AbEdTMmTgufrz1/Y07B3GAH8gA6D8pb0+CeFOpe2fjxkJO3C7NCZUUyO9UG+xf"
]
},
{
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv",
"elements": [
"gospel-resources-map"
],
@ -246,7 +247,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./gospel-resources/gospel-resources.js\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></gospel-resources-map>"
"script": "<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></gospel-resources-map>"
}
},
{
@ -258,7 +259,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./gospel-resources/gospel-resources.js\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></gospel-resources-map>"
"script": "<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></gospel-resources-map>"
}
},
{
@ -270,7 +271,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./gospel-resources/gospel-resources.js\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></gospel-resources-map>"
"script": "<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></gospel-resources-map>"
}
},
{
@ -282,16 +283,16 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./gospel-resources/gospel-resources.js\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></gospel-resources-map>"
"script": "<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></gospel-resources-map>"
}
}
],
"integrity": "sha384-A2zqI3MoOIlGI6xaXz73grRQ7rPGC66skpAfc0NoOEmLBN227rsJJlLvqq1Z8fSv"
]
},
{
"bundle": "my-upg-100-list",
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"output": "doxa-maps/my-upg-100-list/my-upg-100-list.js",
"integrity": "sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc",
"elements": [
"my-upg-100-list-map"
],
@ -305,7 +306,7 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": {
"iframe": "<iframe src=\"./my-upg-100-list/poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./my-upg-100-list/my-upg-100-list.js\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></my-upg-100-list-map>"
"script": "<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></my-upg-100-list-map>"
}
},
{
@ -317,16 +318,16 @@
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
"embed": {
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./my-upg-100-list/my-upg-100-list.js\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></my-upg-100-list-map>"
"script": "<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></my-upg-100-list-map>"
}
}
],
"integrity": "sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc"
]
},
{
"bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "doxa-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74",
"elements": [
"research-dashboard-map"
],
@ -340,17 +341,17 @@
"scriptUrl": "./research-dashboard/research-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./research-dashboard/research-dashboard.js\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></research-dashboard-map>"
"script": "<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></research-dashboard-map>"
},
"bundle": "research-dashboard"
}
],
"integrity": "sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74"
]
},
{
"bundle": "template-bundle",
"scriptUrl": "./template-bundle/template-bundle.js",
"output": "doxa-maps/template-bundle/template-bundle.js",
"integrity": "sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv",
"elements": [
"template-bundle"
],
@ -364,7 +365,7 @@
"scriptUrl": "./template-bundle/template-bundle.js",
"embed": {
"iframe": "<iframe src=\"./template-bundle/template-map-a/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./template-bundle/template-bundle.js\"></script>\n<template-bundle profile-config='{\"profile\":\"template-map-a\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></template-bundle>"
"script": "<script src=\"./template-bundle/template-bundle.js\" integrity=\"sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv\" crossorigin=\"anonymous\"></script>\n<template-bundle profile-config='{\"profile\":\"template-map-a\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></template-bundle>"
},
"bundle": "template-bundle"
},
@ -377,12 +378,11 @@
"scriptUrl": "./template-bundle/template-bundle.js",
"embed": {
"iframe": "<iframe src=\"./template-bundle/template-map-b/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script src=\"./template-bundle/template-bundle.js\"></script>\n<template-bundle profile-config='{\"profile\":\"template-map-b\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></template-bundle>"
"script": "<script src=\"./template-bundle/template-bundle.js\" integrity=\"sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv\" crossorigin=\"anonymous\"></script>\n<template-bundle profile-config='{\"profile\":\"template-map-b\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'></template-bundle>"
},
"bundle": "template-bundle"
}
],
"integrity": "sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv"
]
}
]
}

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"my-upg-100-list","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"my-upg-100-list","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","output":"doxa-maps/my-upg-100-list/my-upg-100-list.js","elements":["my-upg-100-list-map"],"profiles":[{"profile":"poster-wall","file":"poster-wall.vue","description":"","element":"my-upg-100-list-map","iframeUrl":"./my-upg-100-list/poster-wall/index.html","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","embed":{"iframe":"\u003ciframe src=\"./my-upg-100-list/poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./my-upg-100-list/my-upg-100-list.js\">\u003c/script>\n\u003cmy-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/my-upg-100-list-map>"}},{"profile":"upg-100-list","file":"upg-100-list.vue","description":"","element":"my-upg-100-list-map","iframeUrl":"./my-upg-100-list/upg-100-list/index.html","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","embed":{"iframe":"\u003ciframe src=\"./my-upg-100-list/upg-100-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./my-upg-100-list/my-upg-100-list.js\">\u003c/script>\n\u003cmy-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/my-upg-100-list-map>"}}],"integrity":"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"my-upg-100-list","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","output":"doxa-maps/my-upg-100-list/my-upg-100-list.js","integrity":"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc","elements":["my-upg-100-list-map"],"profiles":[{"profile":"poster-wall","file":"poster-wall.vue","description":"","element":"my-upg-100-list-map","iframeUrl":"./my-upg-100-list/poster-wall/index.html","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","embed":{"iframe":"\u003ciframe src=\"./my-upg-100-list/poster-wall/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc\" crossorigin=\"anonymous\">\u003c/script>\n\u003cmy-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/my-upg-100-list-map>"}},{"profile":"upg-100-list","file":"upg-100-list.vue","description":"","element":"my-upg-100-list-map","iframeUrl":"./my-upg-100-list/upg-100-list/index.html","scriptUrl":"./my-upg-100-list/my-upg-100-list.js","embed":{"iframe":"\u003ciframe src=\"./my-upg-100-list/upg-100-list/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc\" crossorigin=\"anonymous\">\u003c/script>\n\u003cmy-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/my-upg-100-list-map>"}}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js"></script>
<script src="../my-upg-100-list.js" integrity="sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <my-upg-100-list-map> custom element. -->
<script src="../my-upg-100-list.js"></script>
<script src="../my-upg-100-list.js" integrity="sha384-kWha8rZTGtOKwLXR/E2uAaYHHhP18ZgBkkxtfteRdsyfEi6JoKFEBlrXrXUUeILc" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"research-dashboard","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"research-dashboard","scriptUrl":"./research-dashboard/research-dashboard.js","output":"doxa-maps/research-dashboard/research-dashboard.js","elements":["research-dashboard-map"],"profiles":[{"profile":"research-dashboard","file":"research-dashboard.vue","description":"Coordinated-Multiple-Views research dashboard for 10/40-window UPGs (live pray.doxa.life): docked facet rail + map-as-hero + linked table/charts, brushing-and-linking over one in-memory store.","element":"research-dashboard-map","iframeUrl":"./research-dashboard/research-dashboard/index.html","scriptUrl":"./research-dashboard/research-dashboard.js","embed":{"iframe":"\u003ciframe src=\"./research-dashboard/research-dashboard/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./research-dashboard/research-dashboard.js\">\u003c/script>\n\u003cresearch-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/research-dashboard-map>"},"bundle":"research-dashboard"}],"integrity":"sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"research-dashboard","scriptUrl":"./research-dashboard/research-dashboard.js","output":"doxa-maps/research-dashboard/research-dashboard.js","integrity":"sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74","elements":["research-dashboard-map"],"profiles":[{"profile":"research-dashboard","file":"research-dashboard.vue","description":"Coordinated-Multiple-Views research dashboard for 10/40-window UPGs (live pray.doxa.life): docked facet rail + map-as-hero + linked table/charts, brushing-and-linking over one in-memory store.","element":"research-dashboard-map","iframeUrl":"./research-dashboard/research-dashboard/index.html","scriptUrl":"./research-dashboard/research-dashboard.js","embed":{"iframe":"\u003ciframe src=\"./research-dashboard/research-dashboard/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74\" crossorigin=\"anonymous\">\u003c/script>\n\u003cresearch-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/research-dashboard-map>"},"bundle":"research-dashboard"}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <research-dashboard-map> custom element. -->
<script src="../research-dashboard.js"></script>
<script src="../research-dashboard.js" integrity="sha384-15m04Zhynh2T0LSwVun1vz9xfJkP5x8a2Xb5SekjrNRM44qWChw6iPRHY3pcxW74" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -130,7 +130,7 @@ header.top .sub { margin-top: 3px; font: 12px/1.4 var(--sans); color: var(--mut)
<script>window.FORGE = {"mode":"built","scope":"bundle","manifestUrl":"../manifest.json","bundle":"template-bundle","hrefBase":"../"};
/* file:// contract: manifest inlined at build — no fetch needed to render. */
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"template-bundle","scriptUrl":"./template-bundle/template-bundle.js","output":"doxa-maps/template-bundle/template-bundle.js","elements":["template-bundle"],"profiles":[{"profile":"template-map-a","file":"template-map-a.vue","description":"Minimal example profile A — a colored placeholder, no Mapbox or data.","element":"template-bundle","iframeUrl":"./template-bundle/template-map-a/index.html","scriptUrl":"./template-bundle/template-bundle.js","embed":{"iframe":"\u003ciframe src=\"./template-bundle/template-map-a/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./template-bundle/template-bundle.js\">\u003c/script>\n\u003ctemplate-bundle profile-config='{\"profile\":\"template-map-a\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/template-bundle>"},"bundle":"template-bundle"},{"profile":"template-map-b","file":"template-map-b.vue","description":"Minimal example profile B — a second profile in the same bundle.","element":"template-bundle","iframeUrl":"./template-bundle/template-map-b/index.html","scriptUrl":"./template-bundle/template-bundle.js","embed":{"iframe":"\u003ciframe src=\"./template-bundle/template-map-b/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./template-bundle/template-bundle.js\">\u003c/script>\n\u003ctemplate-bundle profile-config='{\"profile\":\"template-map-b\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/template-bundle>"},"bundle":"template-bundle"}],"integrity":"sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv"}]};</script>
window.FORGE.manifest = {"schema":"doxa-maps-manifest@1","generatedFrom":"app-profiles/*/*.vue","embedBase":".","bundleCount":9,"profileCount":17,"bundles":[{"bundle":"template-bundle","scriptUrl":"./template-bundle/template-bundle.js","output":"doxa-maps/template-bundle/template-bundle.js","integrity":"sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv","elements":["template-bundle"],"profiles":[{"profile":"template-map-a","file":"template-map-a.vue","description":"Minimal example profile A — a colored placeholder, no Mapbox or data.","element":"template-bundle","iframeUrl":"./template-bundle/template-map-a/index.html","scriptUrl":"./template-bundle/template-bundle.js","embed":{"iframe":"\u003ciframe src=\"./template-bundle/template-map-a/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./template-bundle/template-bundle.js\" integrity=\"sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv\" crossorigin=\"anonymous\">\u003c/script>\n\u003ctemplate-bundle profile-config='{\"profile\":\"template-map-a\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/template-bundle>"},"bundle":"template-bundle"},{"profile":"template-map-b","file":"template-map-b.vue","description":"Minimal example profile B — a second profile in the same bundle.","element":"template-bundle","iframeUrl":"./template-bundle/template-map-b/index.html","scriptUrl":"./template-bundle/template-bundle.js","embed":{"iframe":"\u003ciframe src=\"./template-bundle/template-map-b/index.html\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen>\u003c/iframe>","script":"\u003cscript src=\"./template-bundle/template-bundle.js\" integrity=\"sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv\" crossorigin=\"anonymous\">\u003c/script>\n\u003ctemplate-bundle profile-config='{\"profile\":\"template-map-b\",\"tk\":\"YOUR_MAPBOX_TOKEN\"}'>\u003c/template-bundle>"},"bundle":"template-bundle"}]}]};</script>
<script>/**
* staging-forge.js — the ONE-PAGE semantic staging environment (root + bundle pages).
*

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <template-bundle> custom element. -->
<script src="../template-bundle.js"></script>
<script src="../template-bundle.js" integrity="sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <template-bundle> custom element. -->
<script src="../template-bundle.js"></script>
<script src="../template-bundle.js" integrity="sha384-kRrj0E6xZ1Yh9LiQp0jKZbnR2eZxNyUExfyLqYOIDOWZFpb8DfpBHQnz7V9pOcNv" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: