Two posters per row on the regions wall, with a control to change it

The Driver, verbatim: "i need two posters per row on the regiosn posters and
witha setitn got icnreat eh number of poswers per row".

The wall's own grid is repeat(auto-fill, minmax(210px, 1fr)), which lays five
across a region card. It now takes a `columns` count and an optional
`columnsControl`, both opt-in and both defaulting to the behaviour that shipped
— so country-posters and my-upg-100-list, which did not ask for this, keep the
auto-fill they have always had. Measured after the change: they still lay out
five across and neither grew a control.

The control is a <select>, not a stepper or a pair of chevrons. It is what
every reader already knows for "choose one of a few", it is keyboard- and
screen-reader-operable with no work, and it shows its current value without a
second element. Imitating the solved pattern rather than inventing one. Its
label is catalogued in eleven locales like everything else on this surface.

The probe measures GEOMETRY, not CSS. Asserting grid-template-columns would
pass on a rule that says repeat(2, …) while the cards actually wrapped three
across because one had a min-width the track could not honour — and a computed
style is exactly the kind of proxy that has fooled this suite five times today.
It counts how many cards share a rendered top coordinate, which is what a
reader sees: [2,2,2,2,2].

And it proves the control by USING it — set it to 3 and the rows become
[3,3,3,3,3]. A default that happens to be right would pass a one-shot check
with an inert knob.

One thing worth recording for the next person: the first attempt put the
explanatory comment inside the PosterWall tag's attribute list, and the Vue
compiler rejected it. An HTML comment belongs above the tag. This file had
already learned that once.
This commit is contained in:
doxa-maps-88655c70 2026-09-24 22:04:28 +00:00
parent 661133dd5c
commit 5a959d6b94
23 changed files with 264 additions and 198 deletions

View file

@ -39,7 +39,7 @@
* CROSS-PANE COMMS — this wall NEVER imports a map. It dispatches a window
* CustomEvent scoped by instanceId, so several embeds on one page never cross-talk.
*/
import { computed, ref, onBeforeUnmount } from 'vue'
import { computed, ref, watch, onBeforeUnmount } from 'vue'
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
import { usePosterPrints } from '@map/composables/usePosterPrints.js'
import { useI18n } from 'vue-i18n'
@ -146,8 +146,30 @@ const props = defineProps({
// group in its own chrome (the region card's header and summary) would otherwise repeat it,
// and with a single unnamed group the head renders the literal "Other". Default true.
sectionHeads:{ type: Boolean, default: true },
// ★ HOW MANY POSTERS SIT IN A ROW. The Driver, on the regions posters: "i need two posters per
// row on the regiosn posters and witha setitn got icnreat eh number of poswers per row".
// 0 keeps the wall's existing auto-fill (repeat(auto-fill, minmax(210px, 1fr))), so the two
// panes that already ship — country-posters and my-upg-100-list — are byte-identical unless
// their owner opts in. A positive number fixes the track count instead.
columns: { type: Number, default: 0 },
// And the control that changes it, off by default for the same reason. Only the caller that
// asked for a fixed count wants a knob for it.
columnsControl: { type: Boolean, default: false },
})
// The live count, seeded from the prop. A ref rather than the prop directly, because the control
// changes it and a prop is not ours to write.
const perRow = ref(props.columns || 0)
watch(() => props.columns, (n) => { perRow.value = n || 0 })
// The choices the control offers. Two is the Driver's default; the ceiling is the wall's own
// auto-fill behaviour, offered as "fit" so the knob can always get back to where it started.
const PER_ROW_CHOICES = [2, 3, 4, 5, 6]
// grid-template-columns, or nothing at all when the count is 0 — an empty string leaves the
// stylesheet's auto-fill rule in charge rather than overriding it with something equivalent.
const gridStyle = computed(() => perRow.value > 0
? { gridTemplateColumns: `repeat(${perRow.value}, minmax(0, 1fr))` }
: {})
const plural = computed(() => props.itemNounPlural || `${props.itemNoun}s`)
const base = computed(() => String(props.assetsBase || './assets').replace(/\/+$/, ''))
@ -438,6 +460,16 @@ useShadowStyles(
// left ~1px of real air and the wall read as one dense block.
'.grid{display:grid;gap:64px 30px;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));' +
'max-width:1180px;margin:0 auto}' +
// The per-row control. Sits above its own grid, right-aligned so it reads as a setting for the
// block below rather than as content, and inherits the wall's type so it does not announce
// itself. max-width matches the grid's, so the two share an edge.
'.perrow{display:flex;align-items:center;justify-content:flex-end;gap:8px;' +
'max-width:1180px;margin:0 auto 12px;font:inherit;font-size:13px}' +
'.perrow__label{color:#6d766e}' +
'.perrow__select{font:inherit;font-size:13px;padding:2px 6px;border:1px solid #cbd2d9;' +
'border-radius:6px;background:#fff;color:inherit;cursor:pointer}' +
'.is-dark .perrow__label{color:#9fb3a6}' +
'.is-dark .perrow__select{background:#132019;border-color:rgba(110,231,183,.20)}' +
'.card{position:relative;background:#fff;border:1px solid #e3e6ea;border-radius:3px;' +
'padding:24px 12px 26px;box-shadow:0 1px 3px rgba(0,0,0,.10),0 6px 18px rgba(0,0,0,.07);' +
'transition:transform .16s ease,box-shadow .16s ease}' +
@ -621,7 +653,19 @@ useShadowStyles(
</span>
</component>
<div v-show="!isCollapsed(sec.name)" class="grid">
<!-- ★ THE PER-ROW CONTROL. A <select>, not a stepper or a pair of chevrons: it is the control
every reader already knows for "choose one of a few", it is keyboard- and
screen-reader-operable with no work, and it shows the current value without a second
element. Imitating the solved pattern rather than inventing one.
Rendered once per section, beside the grid it governs, and only where the caller asked
for it — so neither existing pane grows a knob it did not request. -->
<div v-if="columnsControl && !isCollapsed(sec.name)" class="perrow">
<label class="perrow__label" :for="`perrow-${instanceId}-${sec.name}`">{{ t('buttons.postersPerRow') }}</label>
<select :id="`perrow-${instanceId}-${sec.name}`" class="perrow__select" v-model.number="perRow">
<option v-for="n in PER_ROW_CHOICES" :key="n" :value="n">{{ n }}</option>
</select>
</div>
<div v-show="!isCollapsed(sec.name)" class="grid" :style="gridStyle">
<div v-for="item in sec.items" :key="item.id" class="card"
:class="{ 'is-last': lastShown === item.id }" :data-list-id="item.id">

View file

@ -41,5 +41,6 @@
],
"clearSelection": "إلغاء التحديد",
"noOptions": "لا توجد نتائج",
"renderingLocal": "يتم إنشاء صورة بجودة الطباعة في متصفحك — لا يتم تحميل أي شيء."
"renderingLocal": "يتم إنشاء صورة بجودة الطباعة في متصفحك — لا يتم تحميل أي شيء.",
"postersPerRow": "الملصقات في كل صف"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "Auswahl aufheben",
"noOptions": "Keine Optionen gefunden",
"renderingLocal": "Ein druckfähiges Bild wird in deinem Browser erzeugt — es wird nichts hochgeladen."
"renderingLocal": "Ein druckfähiges Bild wird in deinem Browser erzeugt — es wird nichts hochgeladen.",
"postersPerRow": "Poster pro Zeile"
}

View file

@ -41,5 +41,6 @@
"previewPrintPoster": "Preview & print the {label} poster",
"clearSelection": "Clear selection",
"noOptions": "No options found",
"renderingLocal": "Rendering a print-quality image in your browser — nothing is uploaded."
"renderingLocal": "Rendering a print-quality image in your browser — nothing is uploaded.",
"postersPerRow": "Posters per row"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "Borrar la selección",
"noOptions": "No se encontraron opciones",
"renderingLocal": "Se está generando una imagen con calidad de impresión en tu navegador: no se sube nada."
"renderingLocal": "Se está generando una imagen con calidad de impresión en tu navegador: no se sube nada.",
"postersPerRow": "Pósteres por fila"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "Effacer la sélection",
"noOptions": "Aucune option trouvée",
"renderingLocal": "Une image de qualité impression est générée dans votre navigateur — rien n’est envoyé."
"renderingLocal": "Une image de qualité impression est générée dans votre navigateur — rien n’est envoyé.",
"postersPerRow": "Affiches par ligne"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "चयन हटाएँ",
"noOptions": "कोई विकल्प नहीं मिला",
"renderingLocal": "आपके ब्राउज़र में प्रिंट-गुणवत्ता वाली छवि बन रही है — कुछ भी अपलोड नहीं किया जाता।"
"renderingLocal": "आपके ब्राउज़र में प्रिंट-गुणवत्ता वाली छवि बन रही है — कुछ भी अपलोड नहीं किया जाता।",
"postersPerRow": "प्रति पंक्ति पोस्टर"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "Cancella la selezione",
"noOptions": "Nessuna opzione trovata",
"renderingLocal": "Un’immagine con qualità di stampa viene generata nel tuo browser: nulla viene caricato."
"renderingLocal": "Un’immagine con qualità di stampa viene generata nel tuo browser: nulla viene caricato.",
"postersPerRow": "Poster per riga"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "Limpar a seleção",
"noOptions": "Nenhuma opção encontrada",
"renderingLocal": "Uma imagem com qualidade de impressão está a ser gerada no seu navegador — nada é enviado."
"renderingLocal": "Uma imagem com qualidade de impressão está a ser gerada no seu navegador — nada é enviado.",
"postersPerRow": "Cartazes por linha"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "Șterge selecția",
"noOptions": "Nicio opțiune găsită",
"renderingLocal": "O imagine de calitate pentru tipar este generată în browserul tău — nimic nu este încărcat."
"renderingLocal": "O imagine de calitate pentru tipar este generată în browserul tău — nimic nu este încărcat.",
"postersPerRow": "Postere pe rând"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "Снять выделение",
"noOptions": "Ничего не найдено",
"renderingLocal": "Изображение типографского качества создаётся в вашем браузере — ничего не загружается на сервер."
"renderingLocal": "Изображение типографского качества создаётся в вашем браузере — ничего не загружается на сервер.",
"postersPerRow": "Плакатов в ряду"
}

View file

@ -41,5 +41,6 @@
],
"clearSelection": "清除选择",
"noOptions": "未找到选项",
"renderingLocal": "正在您的浏览器中生成可打印质量的图片——不会上传任何内容。"
"renderingLocal": "正在您的浏览器中生成可打印质量的图片——不会上传任何内容。",
"postersPerRow": "每行海报数"
}

View file

@ -669,6 +669,15 @@ useShadowStyles(
and the print UX here must be identical. deliverPoster() branches on that one
prop and routes BOTH the shipped-.webp and the browser-rasterised path through
openPrintFrame, so this is configuration — not a second implementation. -->
<!-- ★ TWO PER ROW, AND A KNOB. The Driver, verbatim: "i need two posters per row on
the regiosn posters and witha setitn got icnreat eh number of poswers per row".
The wall's own default is an auto-fill grid at minmax(210px,1fr), which lays out
five across a region card; two is a deliberate, larger card, and the control lets
a reader put it back.
Both props are OPT-IN on the shared component, so country-posters and
my-upg-100-list keep the auto-fill they have always had.
The comment sits ABOVE the tag because an HTML comment inside an attribute list is
a parse error — which is how the first attempt at this failed. -->
<PosterWall
:items="postersFor(region)"
:group-by="posterGroupBy"
@ -683,6 +692,8 @@ useShadowStyles(
:collapsible="false"
:embedded="true"
:section-heads="false"
:columns="2"
:columns-control="true"
:unsupported="posterUnsupported"
download-prefix="doxa-country"
poster-action="print"

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" integrity="sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-CONItvVegTgNTDURbgn8e3HcQ6rHwPbFja2DEuSlzX3ZHh5S0vNc8VnnV0QSAT4j" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -26,7 +26,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" integrity="sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-CONItvVegTgNTDURbgn8e3HcQ6rHwPbFja2DEuSlzX3ZHh5S0vNc8VnnV0QSAT4j" 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 <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-CONItvVegTgNTDURbgn8e3HcQ6rHwPbFja2DEuSlzX3ZHh5S0vNc8VnnV0QSAT4j" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -158,7 +158,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "doxa-maps/country-posters/country-posters.js",
"integrity": "sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7",
"integrity": "sha384-CONItvVegTgNTDURbgn8e3HcQ6rHwPbFja2DEuSlzX3ZHh5S0vNc8VnnV0QSAT4j",
"elements": [
"country-posters-map"
],
@ -178,7 +178,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/countries-map/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=\"./country-posters/country-posters.js\" integrity=\"sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-CONItvVegTgNTDURbgn8e3HcQ6rHwPbFja2DEuSlzX3ZHh5S0vNc8VnnV0QSAT4j\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
},
{
@ -192,7 +192,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/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=\"./country-posters/country-posters.js\" integrity=\"sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-CONItvVegTgNTDURbgn8e3HcQ6rHwPbFja2DEuSlzX3ZHh5S0vNc8VnnV0QSAT4j\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
},
{
@ -206,7 +206,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-posters-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=\"./country-posters/country-posters.js\" integrity=\"sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-CONItvVegTgNTDURbgn8e3HcQ6rHwPbFja2DEuSlzX3ZHh5S0vNc8VnnV0QSAT4j\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
}
]
@ -879,7 +879,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-zorvkN5CO/YDU8sOPg5wlcDDL8l/apAjvwSvyrKz4t28/kZU7HFr2uAOZxpwRpRp",
"integrity": "sha384-f0saWo0w/M5QsdVssuZErE234tQH8CRxHpAaHtQ8oSVaHGV2e3O9HCOUfP4SKg4B",
"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-zorvkN5CO/YDU8sOPg5wlcDDL8l/apAjvwSvyrKz4t28/kZU7HFr2uAOZxpwRpRp\" 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-f0saWo0w/M5QsdVssuZErE234tQH8CRxHpAaHtQ8oSVaHGV2e3O9HCOUfP4SKg4B\" 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-zorvkN5CO/YDU8sOPg5wlcDDL8l/apAjvwSvyrKz4t28/kZU7HFr2uAOZxpwRpRp\" 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-f0saWo0w/M5QsdVssuZErE234tQH8CRxHpAaHtQ8oSVaHGV2e3O9HCOUfP4SKg4B\" 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-zorvkN5CO/YDU8sOPg5wlcDDL8l/apAjvwSvyrKz4t28/kZU7HFr2uAOZxpwRpRp\" 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-f0saWo0w/M5QsdVssuZErE234tQH8CRxHpAaHtQ8oSVaHGV2e3O9HCOUfP4SKg4B\" 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-zorvkN5CO/YDU8sOPg5wlcDDL8l/apAjvwSvyrKz4t28/kZU7HFr2uAOZxpwRpRp" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-f0saWo0w/M5QsdVssuZErE234tQH8CRxHpAaHtQ8oSVaHGV2e3O9HCOUfP4SKg4B" 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-zorvkN5CO/YDU8sOPg5wlcDDL8l/apAjvwSvyrKz4t28/kZU7HFr2uAOZxpwRpRp" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-f0saWo0w/M5QsdVssuZErE234tQH8CRxHpAaHtQ8oSVaHGV2e3O9HCOUfP4SKg4B" 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-zorvkN5CO/YDU8sOPg5wlcDDL8l/apAjvwSvyrKz4t28/kZU7HFr2uAOZxpwRpRp" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-f0saWo0w/M5QsdVssuZErE234tQH8CRxHpAaHtQ8oSVaHGV2e3O9HCOUfP4SKg4B" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: