Merge remote-tracking branch 'origin/main' into rega/research-gallery-embed
Some checks are pending
build-gate / build (push) Waiting to run

# Conflicts:
#	public/doxa-maps/index.html
This commit is contained in:
doxa-maps-88655c70 2026-09-24 20:00:50 +00:00
commit fd95518152
11 changed files with 220 additions and 102 deletions

View file

@ -63,7 +63,6 @@ Generated from 22 bundle(s).
| `doxa-simple-map` | `doxa-simple-map` | `parameterized` |
| `doxa-vision-card` | `doxa-vision-card` | `parameterized` |
| `people-groups-grid` | `people-groups-grid` | `parameterized` |
| `upg-neighbor` | `upg-neighbor` | `parameterized` |
## Capability 3 — multi-view-element (monolithic)
@ -71,6 +70,7 @@ Generated from 22 bundle(s).
|---|---|---|
| `doxa-research-map` | `research-map` | `monolithic` |
| `research-dashboard` | `research-dashboard` | `monolithic` |
| `upg-neighbor` | `upg-neighbor` | `monolithic` |
## Capability 4 — composite-element (nested-element SPA)

View file

@ -47,6 +47,7 @@ import { useI18n } from 'vue-i18n'
// (contain:layout on .vtl-content). Measured 1024x793 @ (256,107) at 1280x900 — rail clickable
// behind the "modal". See library/utils/viewportScrim.js for the measurements and rejected fixes.
import { useViewportScrim } from '@map/utils/viewportScrim.js'
import { bundleTreeRoot } from '@map/utils/embedBase.js'
const props = defineProps({
items: { type: Array, required: true },
@ -149,7 +150,29 @@ const props = defineProps({
const plural = computed(() => props.itemNounPlural || `${props.itemNoun}s`)
const base = computed(() => String(props.assetsBase || './assets').replace(/\/+$/, ''))
const previewUrl = (id) => `${base.value}/previews/${id}.webp`
// ★ A SECOND PLACE TO LOOK, because "poster not generated yet" was being shown for posters that
// ARE generated. The DRIVER reported it on Ethiopia, whose country-eth.webp exists (174 of the 175
// records have their .webp; India is the one that legitimately does not and carries its own
// reason). MEASURED here — static build AND dev server, every request 200, zero cards in that
// branch — so the file is not missing; a HOST LAYOUT is. resolveAssetsBase points at
// <treeRoot>/../assets, the shared pool, which is correct for the layout generate-tree documents
// and wrong on a host that publishes only the tree folder. generate-tree ALSO stages a
// self-contained copy INSIDE the tree ("staged 421 runtime asset(s) → doxa-maps/assets"), and
// that copy is reachable on both layouts. So: try the pool, and if the bytes do not arrive, try
// the copy before telling the user anything.
const fallbackBase = computed(() => {
const root = String(bundleTreeRoot() || '').replace(/\/+$/, '')
return root ? `${root}/assets` : ''
})
// 0/absent = first attempt, 1 = the fallback is being tried.
const attempt = ref({})
const previewUrl = (id) => `${attempt.value[id] ? fallbackBase.value : base.value}/previews/${id}.webp`
function onPreviewError(id) {
const fb = fallbackBase.value
if (!attempt.value[id] && fb && fb !== base.value) { attempt.value = { ...attempt.value, [id]: 1 }; return }
missing.value = { ...missing.value, [id]: true }
}
// Sections ordered by TOTAL count (largest first), items within a section by their
// own count — the densest prayer need leads at BOTH levels.
@ -630,11 +653,18 @@ useShadowStyles(
@click="previewIsControl && exportPoster(item)"
@keydown.enter.prevent="previewIsControl && exportPoster(item)"
@keydown.space.prevent="previewIsControl && exportPoster(item)"
@error="missing[item.id] = true" />
@error="onPreviewError(item.id)" />
<div v-else class="ph">
<div class="ph-label">{{ item.label }}</div>
<div v-if="item.count" class="ph-count">{{ item.count.toLocaleString() }} people groups</div>
<div class="ph-note">poster not generated yet</div>
<!-- NOT "not generated yet": reaching this branch means the preview IMAGE did
not arrive after both bases were tried, which says nothing about whether a
poster exists. A record with genuinely no poster carries its own
unsupportedReason and renders the branch above. Saying "not generated" of a
poster that is sitting on disk is how the Driver came to report this.
i18n DEBT: this literal predates t() here and is still untranslated, like
the two beside it. -->
<div class="ph-note">preview unavailable</div>
</div>
</div>

View file

@ -20,10 +20,19 @@
// rem values would resolve against the host's root (16px by default) and every space would be
// 1.6x too large. That is exactly why these were resolved to px in the first place.
//
// THE VALUES ARE OURS AS THEY ALREADY WERE, not re-derived from live. Live carries more precision
// (2.352637rem = 23.52637px vs our 23.5264px). Naming the numbers and changing the numbers are two
// different changes; this one only names them, which is what lets a full computed-style
// fingerprint prove it altered nothing. Re-deriving would be a separate, separately measured step.
// THE VALUES ARE NOW LIVE'S FULL PRECISION. They started as the rounded numbers this file was
// created to name (23.5264px for --spacing-lg, where live is 2.352637rem = 23.52637px), and the
// header said re-deriving them would be "a separate, separately measured step". THIS IS THAT STEP,
// and a measurement forced it: their country-list bullet is sized in em, 1.5em of --font-size-md,
// and against live it came out 29.2812px where theirs is 29.2969px. 0.0157px, which is nothing to
// look at — but it is the ROUNDING of --font-size-md (19.5312 for their 19.53125) multiplied by
// 1.5, and every other em- or percentage-derived length on the page inherits the same error. The
// scales are exact powers of their two ratios (type 1.25, spacing 1.33) on a 10px root, so full
// precision is available for free and there is no reason to ship a rounded clone.
// type: 10px * 1.25^n -> 15.625 / 19.53125 / 24.4140625 / 30.517578125 / ...
// spacing: 10px * 1.33^n -> 13.3 / 17.689 / 23.52637 / 31.2900721 / ...
// The vs-live diffs compare with a +/-0.5px tolerance, so this cannot be what turns one green; the
// bullet's exact-equality compare is what it is for.
//
// Mapping verified against live's own custom properties, not arithmetic:
// spacing 3xs .5653230821rem · 2xs .7518796992 · md 1.7689 · lg 2.352637 · xl 3.12900721
@ -36,10 +45,10 @@
// a magic number because it reads as deliberate.
export const DXLIFE_TOKENS =
':host{' +
' --spacing-3xs:5.6532px; --spacing-2xs:7.5188px; --spacing-md:17.689px;' +
' --spacing-lg:23.5264px; --spacing-xl:31.2901px; --spacing-2xl:41.6158px;' +
' --spacing-3xl:55.349px; --spacing-4xl:73.6142px;' +
' --font-size-sm:15.625px; --font-size-md:19.5312px; --font-size-lg:24.4141px;' +
' --font-size-xl:30.5176px; --font-size-2xl:38.147px; --font-size-3xl:47.6837px;' +
' --font-size-4xl:59.6046px; --font-size-5xl:74.5058px;' +
' --spacing-3xs:5.653230821px; --spacing-2xs:7.518796992px; --spacing-md:17.689px;' +
' --spacing-lg:23.52637px; --spacing-xl:31.2900721px; --spacing-2xl:41.615795893px;' +
' --spacing-3xl:55.349008538px; --spacing-4xl:73.614181355px;' +
' --font-size-sm:15.625px; --font-size-md:19.53125px; --font-size-lg:24.4140625px;' +
' --font-size-xl:30.517578125px; --font-size-2xl:38.146972656px; --font-size-3xl:47.68371582px;' +
' --font-size-4xl:59.604644775px; --font-size-5xl:74.505805969px;' +
'}'

View file

@ -651,7 +651,13 @@ useShadowStyles(
' --dx-surface:#f3f3f1; --dx-elevated:#fff; --dx-text:#2a332a; --dx-header-bg:#3b463d;' +
' --dx-header-text:#fff; --dx-muted:#6d766e; --dx-line:#d1d4cd; --dx-accent:#92b195;' +
' --dx-dark:#2a332a; --dx-on-dark:#f3f3f1; --dx-track:#4e594f; --dx-partial:#f0c64a;' +
' --dx-radius:35px;' +
' --dx-radius:35px; --dx-radius-lg:25px;' +
// base/_globals.scss:99-105 + :205-207 style EVERY table on their site: --table-border-color
// is $color-gray-500 (#666) and --border-radius-lg is 2.5rem at their 10px root = 25px.
' --dx-table-border:#666;' +
// base/_globals.scss:132-141 styles EVERY anchor: --color-brand-light on hover to
// --color-brand-lighter. $color-green-400 / $color-green-300.
' --dx-link:#4e594f; --dx-link-hover:#6d766e;' +
' background:var(--dx-surface); color:var(--dx-text);' +
' font:var(--font-size-md)/1.5 Poppins,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; }' +
// Same responsive context + same 1200px cap as tab 1 (regions-list.vue). DX-life applies its
@ -669,15 +675,24 @@ useShadowStyles(
// We cannot set this on the host document from inside a shadow root, and should not;
// this element's own scroller is the box every child measures against.
'.rd-scroll{ flex:1 1 auto; min-height:0; overflow-y:auto; scrollbar-gutter:stable; -webkit-overflow-scrolling:touch;' +
' padding:var(--spacing-3xl) 0 var(--spacing-4xl); display:flex; flex-direction:column; gap:var(--spacing-3xl);' +
' padding:var(--spacing-3xl) 0 var(--spacing-4xl); display:flex; flex-direction:column;' +
' container-type:inline-size; }' +
'.rd-scroll > * + *{ margin-top:var(--spacing-3xl); }' + // .stack .stack--3xl
'.rd-scroll > *{ box-sizing:border-box; width:calc(90% + 16px); max-width:1200px;' +
' margin-left:auto; margin-right:auto; }' +
'.rd-status{ padding:28px; text-align:center; color:var(--dx-muted); font-size:var(--font-size-md); }' +
'.rd-status.rd-failed{ font-weight:600; }' +
// ── head: RegionDetail.vue:47-51, a .stack--xs (7.5px) block, centred ──
'.rd-head{ display:flex; flex-direction:column; gap:10px; text-align:center; }' +
// ★ EVERY .stack HERE IS NOW THEIR MECHANISM, not `gap`. The goal card proved the two are not
// interchangeable (a child's margin-top:auto can override a margin and cannot override a gap),
// and the extended live diff then caught the residue: their .stack rowGap computes to `normal`
// because the spacing is margin, while ours read 17.689px. Same pixels, different code — and the
// DRIVER asked for the code to match, not just the screenshot. Converted, so the next
// margin-overriding child anywhere on this page behaves as it does on their page.
// .stack .stack--xs — --spacing-xs is 1rem at their 10px root.
'.rd-head{ display:flex; flex-direction:column; text-align:center; }' +
'.rd-head > * + *{ margin-top:10px; }' +
'.rd-backlink{ margin:0; }' +
// their .light-link on a dark-on-light page: brand-light, underlined on hover
// THEIR back-link is an <a class="light-link">, so it inherits the UA underline plus their
@ -734,7 +749,9 @@ useShadowStyles(
// clone below is untouched by it.
'.rd-chooser{ display:flex; flex-wrap:wrap; gap:13.3px; align-items:flex-end;' +
' justify-content:center; }' +
'.rd-mapblock{ display:flex; flex-direction:column; gap:13.3px; }' +
// .stack .stack--sm — --spacing-sm, 1.33rem.
'.rd-mapblock{ display:flex; flex-direction:column; }' +
'.rd-mapblock > * + *{ margin-top:13.3px; }' +
'.rd-mapnote{ margin:0; text-align:center; color:#92b195; font-weight:700; font-size:var(--font-size-md); }' +
// .rounded-xlg on their <CountryMap>; the child takes border-radius:inherit from here.
'.rd-mapframe{ border-radius:var(--dx-radius); overflow:hidden; }' +
@ -776,7 +793,16 @@ useShadowStyles(
// heading keeps the full clamp -- it has 1200px and no such constraint.
// .stack--lg (var(--spacing-lg)) inside each card, centred; .region-goal pins to the bottom
// (margin-top:auto) so three cards of different heights still align their goal lines.
'.rd-goal-card{ display:flex; flex-direction:column; gap:var(--spacing-lg); text-align:center; }' +
// ★ THEIR .stack IS margin-top, AND THAT IS LOAD-BEARING — not a stylistic detail.
// composition/_stack.scss: `.stack > * + * { margin-top: var(--stack-spacing) }`, with
// `.stack--lg` setting that to --spacing-lg. RegionDetail.vue's scoped
// `.region-goal { margin-top: auto }` then OVERRIDES the same property on the last child,
// so the goal line is pushed to the bottom and the 23.526px stack gap above it is GONE.
// This was ported as `gap`, which margin cannot override: gap AND the auto both applied,
// so every goal card carried ~23.5px of space their cards do not have. The DRIVER saw it
// ('spcing is nto ths ame', naming these three cards). Ported as their mechanism.
'.rd-goal-card{ display:flex; flex-direction:column; text-align:center; }' +
'.rd-goal-card > * + *{ margin-top:var(--spacing-lg); }' +
// h2: _globals.scss clamp(--font-size-2xl, 6vw, --font-size-4xl) = clamp(var(--font-size-2xl),_,var(--font-size-4xl))
'.rd-h2{ margin:0; font-size:clamp(var(--font-size-2xl), 6cqw, var(--font-size-4xl)); line-height:1;' +
' font-family:"Bebas Neue","Arial Narrow",BlinkMacSystemFont,"Segoe UI","Helvetica Neue",Arial,sans-serif;' +
@ -791,8 +817,16 @@ useShadowStyles(
'.rd-big{ margin:0; font-size:var(--font-size-4xl); font-weight:500; line-height:1.1; }' +
'.rd-goal-card .rd-big{ white-space:nowrap; }' +
'.rd-big-label{ margin:0; font-size:var(--font-size-lg); }' +
'.rd-stack-xs{ display:flex; flex-direction:column; gap:10px; }' +
'.rd-goal{ margin:auto 0 0; font-size:var(--font-size-sm); }' +
// .stack .stack--xs, inside the Prayer Coverage card.
'.rd-stack-xs{ display:flex; flex-direction:column; }' +
'.rd-stack-xs > * + *{ margin-top:10px; }' +
// .region-goal — margin-top:auto, spelled at higher specificity than the stack rule above
// so the override is unambiguous rather than depending on source order.
'.rd-goal{ margin:0; font-size:var(--font-size-sm); }' +
// base/_globals.scss:200-202 — <strong> is --font-weight-medium (500) on their site, not the
// UA's bold. The 'Goal:' label in all three cards is a <strong>, so ours was rendering 700.
'.rd-root strong{ font-weight:500; }' +
'.rd-goal-card > .rd-goal{ margin-top:auto; }' +
// ── .progress-bar: blocks/_progress-bar.scss. The HEIGHT comes from padding-top, not height
// -- clamp(15px, 6%, 25px) at [data-size="md"] -- so the track scales with its own width.
@ -817,16 +851,45 @@ useShadowStyles(
// ── the breakdown table: RegionDetail.vue's scoped block. min-width 560px inside an
// overflow-x:auto wrapper is how they keep five columns readable on a phone instead of
// crushing them -- the table scrolls sideways, the page does not.
'.rd-section{ display:flex; flex-direction:column; gap:var(--spacing-md); }' +
// ★ base/_globals.scss:19-23 — their countries block is a <section>, and EVERY <section> on
// their site carries padding-top clamp(--spacing-2xl, 6vw, --spacing-4xl) and padding-bottom
// --spacing-4xl. At 1440 that is 73.614px above and below, ON TOP of the --spacing-3xl the
// page stack already puts between blocks: 128.96px of air above the heading, where ours had
// 55.35px and nothing below. Another global rule, another thing reading RegionDetail.vue
// alone could not tell me. Same clamp, in container units for the embedded case.
'.rd-section{ display:flex; flex-direction:column;' +
' padding-top:clamp(var(--spacing-2xl), 6cqw, var(--spacing-4xl));' +
' padding-bottom:var(--spacing-4xl); }' +
'.rd-section > * + *{ margin-top:var(--spacing-md); }' + // .stack .stack--md
'.rd-table-scroll{ overflow-x:auto; }' +
'.rd-table{ width:100%; min-width:560px; border-collapse:collapse; font-size:var(--font-size-md); }' +
// ★ base/_globals.scss:99-105 — the part of their table that is NOT in RegionDetail's
// scoped block and was therefore missed: every <table> on their site is a rounded,
// ring-outlined WHITE card, and every <td> carries a 1px gridline (:205-207). Ours was a
// bare borderless table on the page background. That is what the DRIVER meant by 'the
// tbabel compoent is not the same' — the rule lived in a global stylesheet, not next to
// the markup, so reading RegionDetail.vue alone could not show it.
// overflow:hidden is what makes border-radius clip the header's own background.
'.rd-table{ width:100%; min-width:560px; border-collapse:collapse; font-size:var(--font-size-md);' +
' border-radius:var(--dx-radius-lg); overflow:hidden; background:#fff;' +
' box-shadow:0 0 0 1px var(--dx-table-border); }' +
// td ONLY — their th has no border of its own, it has the header fill.
'.rd-table td{ border:1px solid var(--dx-table-border); }' +
'.rd-table th, .rd-table td{ padding:var(--spacing-2xs) 13.3px; text-align:start; }' +
'.rd-table th:not(:first-child), .rd-table td:not(:first-child){ text-align:end; }' +
'.rd-table th{ background:var(--dx-muted); color:var(--dx-on-dark); font-weight:500; }' +
'.rd-tr--selected{ background:#e8ece7; font-weight:600; }' +
// ★ Their country cell is a <NuxtLink>, i.e. an <a>, which picks up base/_globals.scss:132-141:
// --color-brand-light, --font-weight-medium, the UA underline at 2px thickness / 4px offset,
// hovering to --color-brand-lighter. Ours is a <button> (it selects a subject in place
// rather than navigating, which is the one thing this element does differently) and a
// button inherits NONE of that — it read as plain body text, unweighted and unlined.
// So the anchor rule is spelled out here: same element role, same appearance.
'.rd-row-link{ appearance:none; background:none; border:0; padding:0; margin:0; cursor:pointer;' +
' font:inherit; color:var(--dx-text); text-align:start; }' +
'.rd-row-link:hover{ text-decoration:underline; }' +
' font:inherit; font-weight:500; color:var(--dx-link); text-align:start;' +
' text-decoration:underline; text-decoration-thickness:2px; text-underline-offset:4px;' +
' text-decoration-skip-ink:auto; transition:color .3s ease; }' +
'.rd-row-link:hover{ color:var(--dx-link-hover); }' +
'.rd-row-link:focus-visible{ outline:2px solid var(--dx-accent); outline-offset:2px; border-radius:4px; }',
'region-dashboards'
)

View file

@ -425,7 +425,9 @@ useShadowStyles(
// one list-item's worth even though DX-life's countries-grid a rule doesn't set it directly.
// Reproduced with list-style:none + the same 35.16px indent kept explicitly so a real list
// bullet has somewhere to sit without stealing width from the text column.
'.countries-grid{ list-style:none; margin:0; padding:0 0 0 35.2px; display:grid;' +
// padding-INLINE-start, as theirs is (1.8em). The physical `padding-left:35.2px` it replaces
// put the indent on the wrong side in Arabic, where the bullets hang off the right edge.
'.countries-grid{ list-style:none; margin:0; padding-inline-start:1.8em; display:grid;' +
' grid-template-columns:repeat(auto-fill, minmax(220px, 1fr)); gap:10px var(--spacing-xl); }' +
// Plain inline text (not a flex row) so multi-line country names wrap the same way DX-life's
// <NuxtLink> text does -- a flex row with align-items:baseline pinned the bullet to the first
@ -441,8 +443,22 @@ useShadowStyles(
// inset-inline-start, NOT left: the bullet hangs off the text's starting edge, which is the
// RIGHT edge in Arabic. With `left:-16px` it stayed on the physical left in RTL — measured
// at locale=ar, computed right was 256.938px instead of the -16px near-edge overhang.
'.country-link::before{ content:""; position:absolute; inset-inline-start:-16px; top:0.6em; width:6px; height:6px;' +
' border-radius:50%; background:#92b195; }' +
// ★ THEIR BULLET, COPIED — not a dot of my own. base/_globals.scss:117-131 paints the list
// marker with a 16x16 data-URI SVG circle in #92b195 sized to 1.5em, hung off the text's start
// edge by margin-inline-start:-1.3em (-2em in RTL), top .3em, line-height .9. Their
// .countries-grid comment is explicit that keeping it is deliberate ("Keeps the site's list
// bullets (global ul padding + ::before dot)").
// I had re-created it as a 6px border-radius:50% square, and MEASURED against live it was wrong
// in 9 of 11 properties: 6px vs 29.2969px box, solid fill vs a transparent box carrying the
// image, top 11.72px vs 5.86px, and positioned with inset-inline-start:-16px instead of their
// negative margin. Not a near-miss — a different bullet.
// The rule is a double-quoted JS string because the data URI contains single quotes.
".country-link::before{ content:''; position:absolute; top:0.3em; width:1.5em; height:1.5em;" +
" line-height:0.9; margin-inline-start:-1.3em; background-repeat:no-repeat;" +
" background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='%2392b195' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='7' stroke='%2392b195' stroke-width='1.5'/%3E%3C/svg%3E\"); }" +
// Their RTL variant. It is a separate rule here rather than a nested [dir="rtl"] & because this
// CSS lives in a shadow root, where a [dir] selector on an outer ancestor does not reach in.
'[dir="rtl"] .country-link::before{ margin-inline-start:-2em; }' +
'.country-link:hover{ text-decoration:underline; text-decoration-color:#92b195; }' +
'.country-link:focus-visible{ outline:2px solid #92b195; outline-offset:2px; border-radius:4px; }' +
'.country-link__count{ color:var(--dx-muted); }' +

File diff suppressed because one or more lines are too long

View file

@ -879,7 +879,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-o2n8vzVstdRyYCQ4YnWVCpZYCOfaNGa+4BABLAeVw5vuXbnm1R71Zx3WT9FJc22n",
"integrity": "sha384-T5GQFULBoK82nNRVo6J0pj0bVmvN6YX8WZam8/T42r7GlVswuXtM49aKuFWyvH4D",
"elements": [
"regions-dashboard"
],
@ -899,7 +899,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-o2n8vzVstdRyYCQ4YnWVCpZYCOfaNGa+4BABLAeVw5vuXbnm1R71Zx3WT9FJc22n\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-T5GQFULBoK82nNRVo6J0pj0bVmvN6YX8WZam8/T42r7GlVswuXtM49aKuFWyvH4D\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -913,7 +913,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-o2n8vzVstdRyYCQ4YnWVCpZYCOfaNGa+4BABLAeVw5vuXbnm1R71Zx3WT9FJc22n\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-T5GQFULBoK82nNRVo6J0pj0bVmvN6YX8WZam8/T42r7GlVswuXtM49aKuFWyvH4D\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -927,7 +927,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-o2n8vzVstdRyYCQ4YnWVCpZYCOfaNGa+4BABLAeVw5vuXbnm1R71Zx3WT9FJc22n\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-T5GQFULBoK82nNRVo6J0pj0bVmvN6YX8WZam8/T42r7GlVswuXtM49aKuFWyvH4D\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
}
]

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-o2n8vzVstdRyYCQ4YnWVCpZYCOfaNGa+4BABLAeVw5vuXbnm1R71Zx3WT9FJc22n" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-T5GQFULBoK82nNRVo6J0pj0bVmvN6YX8WZam8/T42r7GlVswuXtM49aKuFWyvH4D" 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

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

View file

@ -40,7 +40,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-o2n8vzVstdRyYCQ4YnWVCpZYCOfaNGa+4BABLAeVw5vuXbnm1R71Zx3WT9FJc22n" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-T5GQFULBoK82nNRVo6J0pj0bVmvN6YX8WZam8/T42r7GlVswuXtM49aKuFWyvH4D" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: