Decouple prose: no go-base / nuxtbase / nuxtinator / doxa-base names in plugin comments and docs

Comments and prose only, no code change (DECOUPLE-go-base-mentions.md sections B and C, outside
library/ and README.md): stack-demo's page-flow note becomes 'a normal host page', the share-link
and CORS comments say 'the live test host', embeddability.md's Traefik note says 'a self-hosted
reverse proxy' and drops the internal proxy file path, and how-to's hosting option becomes 'a Git
host you run (for example Forgejo)'. stack-demo.vue's @description feeds the generated tree, so the
landing regenerates the tree. Section A (QA widget), library/ and package.json are left to studio.
This commit is contained in:
Doxa Maps 2026-09-26 16:44:08 +00:00
parent 1d569edd13
commit 44a1afba04
7 changed files with 10 additions and 10 deletions

View file

@ -81,9 +81,9 @@ apply it. Rule of thumb: **a path with ≥2 directory segments under the tree ro
page → serve it framable.**
Portable ways to implement the split, by host:
- **Traefik** (nuxtbase/go-base): a higher-priority router on `PathRegexp(^/plugin-assets/[^/]+/[^/]+/)`
sets `Content-Security-Policy: frame-ancestors *` + clears `X-Frame-Options`. (Live example:
`/data/coolify/proxy/dynamic/doxa-maps-embed.yaml`.)
- **Traefik** (a self-hosted reverse proxy): a higher-priority router on `PathRegexp(^/plugin-assets/[^/]+/[^/]+/)`
sets `Content-Security-Policy: frame-ancestors *` + clears `X-Frame-Options`. (Live example: a Traefik
dynamic-configuration file on the test host.)
- **Cloudflare Pages / Netlify**: a `_headers` file — `/<bundle>/*/* Content-Security-Policy: frame-ancestors *`.
- **Nginx**: `location ~ ^/[^/]+/[^/]+/ { add_header Content-Security-Policy "frame-ancestors *"; }`
- **GitHub Pages**: serves no custom headers → pages are framable by default (no frame-ancestors), which is already correct for direct embeds.

View file

@ -215,8 +215,8 @@ there are options:**
site serves them, so **doxa-life is the CDN**. No third party.
- **GitHub.** Push the built maps to a public GitHub repo and serve them free through
**GitHub Pages or jsDelivr** — **GitHub is the CDN**.
- **doxa-base's built-in home (Forgejo).** doxa-base ships **Forgejo as a CDN** — push the maps
there and it serves them, with no extra service to set up.
- **A Git host you run (for example Forgejo).** Push the maps there and serve them from it, with
no extra service to set up.
- **Anywhere else.** Any static host works — Cloudflare, an S3-style bucket, etc.
Pick one home and **every partner site embeds the same map from it** — change the map once and it

View file

@ -223,7 +223,7 @@ function onDashboardFilter({ filterSet = {}, searchTerm = '' } = {}) {
// Tier 1 takes a whole url, so it is COMPUTED rather than hardcoded: resolveEmbedBase() is the same
// helper ShareButton uses (profileConfig.embedBaseUrl → window.MAP_EMBED_BASE_URL → the root the
// built bundle derives from its own script url), so the link stays correct on doxa.life, on
// nuxtbase.app and in a dropped tree with no configuration. Hardcoding an absolute url here would
// the live test host and in a dropped tree with no configuration. Hardcoding an absolute url here would
// pin every share to whichever host happened to build it.
//
// Note this is exactly the two-host defect class: research-dashboard standalone PASSES the same

View file

@ -1124,7 +1124,7 @@ export default defineComponent({
// ★ THE CORS-READABLE COPY (generate-tree writes it beside this bundle, byte-identical).
// A script embed on a partner page FETCHES the manifest cross-origin, and the live static layer
// sends Access-Control-Allow-Origin only on paths INSIDE a folder of the tree — every bundle file
// and assets/ carry it, the ROOT manifest.json does not (measured 2026-09-25 on nuxtbase: the
// and assets/ carry it, the ROOT manifest.json does not (measured 2026-09-25 on the live test host: the
// root 200 without it, doxa-maps-spa/<anything> with it, even a 404). So on a foreign page the
// copy is read FIRST (no CORS error in the host's console) and the root second; same-origin keeps
// the root first. Script URLs still resolve against the TREE ROOT, never the copy's folder.

View file

@ -159,7 +159,7 @@ watch(textDir, reflectDir)
// The absolute url this composite is shared and iframed as. Built here rather than written as a
// literal because resolveEmbedBase() walks profileConfig.embedBaseUrl → window.MAP_EMBED_BASE_URL →
// the root this bundle derives from its OWN script url, so the link is right on doxa.life, on
// nuxtbase.app and in a dropped tree with nothing configured.
// the live test host and in a dropped tree with nothing configured.
//
// It MUST be absolute, which is the non-obvious part. resolveShareUrl returns a tier-1 shareUrl
// VERBATIM (embedBase.js:95 — `return whole.trim()`, no resolution), and ShareButton feeds the same

View file

@ -24,7 +24,7 @@
<p class="sub">Capability&nbsp;4, STACK variant — the shared <code>StackLayout</code> renders two
elements (<code>&lt;research-dashboard-map&gt;</code> then <code>&lt;people-groups-grid&gt;</code>)
<strong>on top of each other</strong>, each at its natural height, so you
<strong>scroll down</strong> through both on one page (the doxa-life / nuxtinator page-flow model).
<strong>scroll down</strong> through both on one page, as on a normal web page.
Embed <code>&lt;stack-demo&gt;</code> anywhere and the host page provides the scroll.</p>
<div class="host">
<stack-demo></stack-demo>

View file

@ -4,7 +4,7 @@
*
* @element stack-demo
* @description Groups TWO independent elements TOP-TO-BOTTOM so you can embed the pair on a page and
* SCROLL down through all of it (the doxa-life / nuxtinator page-flow model), instead of switching
* SCROLL down through all of it (the page-flow model of a normal host page), instead of switching
* between them with tabs. Section 1 = the rich <research-dashboard-map> (facets + map + charts +
* table); section 2 = the cap-2 <people-groups-grid> (live pray.doxa.life). Each renders at its
* NATURAL height; the host page scrolls.