This commit is contained in:
commit
bc18753985
15 changed files with 278 additions and 196 deletions
99
internal/check-deck-click.mjs
Normal file
99
internal/check-deck-click.mjs
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
// check-deck-click — click the REAL Card Deck button and read what it prints.
|
||||
//
|
||||
// Every other packet/card gate drives the RENDERERS directly. This one drives the
|
||||
// UI: it finds the button in the shadow root, clicks it, and captures the document
|
||||
// that reaches the print frame. That is the only path that proves the wiring —
|
||||
// records provider, stock picker, language, shared composable, print frame — is
|
||||
// connected end to end. A renderer can be perfect while the button that calls it
|
||||
// passes the wrong stock, or nothing at all.
|
||||
//
|
||||
// ⚠ IT INTERCEPTS THE PRINTED HTML rather than reading the iframe back.
|
||||
// openPrintFrame calls window.print(), which BLOCKS in headless Chromium, and the
|
||||
// frame self-removes on afterprint — reading it back measures a frame that has
|
||||
// already gone and reports 0 cards for a correct deck.
|
||||
//
|
||||
// Usage: node internal/check-deck-click.mjs <wallUrl> [stockId] [expectedPage]
|
||||
import { chromium } from 'playwright'
|
||||
|
||||
const URL_ = process.argv[2]
|
||||
if (!URL_) { console.error('usage: check-deck-click.mjs <wallUrl> [stock] [expectedPage]'); process.exit(2) }
|
||||
const STOCK = process.argv[3] || ''
|
||||
const EXPECT_PAGE = process.argv[4] || (STOCK === 'pokerLandscape' ? '3.5in 2.5in' : '2.5in 3.5in')
|
||||
|
||||
const b = await chromium.launch({ args: ['--use-gl=swiftshader', '--enable-unsafe-swiftshader'] })
|
||||
const pg = await b.newPage({ viewport: { width: 1280, height: 1000 } })
|
||||
const errs = []
|
||||
pg.on('pageerror', (e) => errs.push(String(e).slice(0, 140)))
|
||||
await pg.goto(URL_, { waitUntil: 'load', timeout: 45000 })
|
||||
await pg.waitForTimeout(9000)
|
||||
|
||||
await pg.evaluate(() => {
|
||||
window.__printed = ''
|
||||
const real = document.createElement.bind(document)
|
||||
document.createElement = (t) => {
|
||||
const el = real(t)
|
||||
if (t === 'iframe') {
|
||||
Object.defineProperty(el, 'contentDocument', {
|
||||
get: () => ({ open() {}, close() {}, write(h) { window.__printed += h } }),
|
||||
})
|
||||
Object.defineProperty(el, 'contentWindow', {
|
||||
get: () => ({ addEventListener() {}, focus() {}, print() {} }),
|
||||
})
|
||||
}
|
||||
return el
|
||||
}
|
||||
})
|
||||
|
||||
const r = await pg.evaluate(async (stock) => {
|
||||
const host = [...document.querySelectorAll('*')]
|
||||
.find((e) => e.shadowRoot && e.shadowRoot.querySelector('.pbtn'))
|
||||
if (!host) return { error: 'no poster wall found on this page' }
|
||||
const sr = host.shadowRoot
|
||||
const btns = [...sr.querySelectorAll('.pbtn')]
|
||||
const deck = btns.find((x) => /card deck/i.test(x.textContent))
|
||||
if (!deck) return { error: 'no Card Deck button', buttons: btns.map((x) => x.textContent.trim()) }
|
||||
if (stock) {
|
||||
const sel = sr.querySelector('.pstock')
|
||||
if (!sel) return { error: 'no card-stock picker to drive' }
|
||||
sel.value = stock
|
||||
sel.dispatchEvent(new Event('change', { bubbles: true }))
|
||||
await new Promise((res) => setTimeout(res, 400))
|
||||
}
|
||||
deck.click()
|
||||
await new Promise((res) => setTimeout(res, 9000))
|
||||
const doc = new DOMParser().parseFromString(window.__printed, 'text/html')
|
||||
return {
|
||||
cards: doc.querySelectorAll('.card').length,
|
||||
qrs: doc.querySelectorAll('.qr svg').length,
|
||||
imgs: doc.querySelectorAll('img.ph').length,
|
||||
page: (window.__printed.match(/@page\{size:([^;}]*)/) || [])[1] || '',
|
||||
}
|
||||
}, STOCK)
|
||||
await b.close()
|
||||
|
||||
if (r.error) {
|
||||
console.error(`DECK-CLICK: FAIL — ${r.error}`
|
||||
+ (r.buttons ? ` (buttons present: ${r.buttons.join(' | ')})` : ''))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const fails = []
|
||||
if (!r.cards) fails.push('the click printed no cards at all — the button is not wired to the renderer')
|
||||
if (r.page.trim() !== EXPECT_PAGE) {
|
||||
fails.push(`@page size is "${r.page.trim()}", expected "${EXPECT_PAGE}"`
|
||||
+ (STOCK ? ' — the stock picker is not reaching the renderer' : ''))
|
||||
}
|
||||
if (r.qrs !== r.cards) fails.push(`${r.qrs} QR code(s) for ${r.cards} cards`)
|
||||
if (errs.length) fails.push(`${errs.length} page error(s): ${errs[0]}`)
|
||||
|
||||
console.log(` stock : ${STOCK || '(default)'}`)
|
||||
console.log(` cards printed : ${r.cards} (${r.imgs} portraits, ${r.qrs} QR codes)`)
|
||||
console.log(` @page size : ${r.page.trim()} (want ${EXPECT_PAGE})`)
|
||||
console.log(` page errors : ${errs.length}`)
|
||||
|
||||
if (fails.length) {
|
||||
console.error(`\nDECK-CLICK: FAIL — ${fails.length} problem(s)`)
|
||||
for (const f of fails) console.error(' - ' + f)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`\nDECK-CLICK: PASS — the real button printed ${r.cards} cards at ${r.page.trim()}.`)
|
||||
|
|
@ -45,7 +45,7 @@ const DESIGNS = join(REPO, 'plugin-designs')
|
|||
const POLICY = {
|
||||
'doxa-simple-map': 'own-button', // Prayer Progress — the embed flagship
|
||||
'doxa-research-map': 'own-button',
|
||||
'country-posters': 'own-button',
|
||||
'country-posters': 'header', // country-posters-mfe header owns it
|
||||
'cities-internet': 'own-button',
|
||||
'gospel-resources': 'own-button',
|
||||
'demo-map': 'own-button',
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@
|
|||
"build:unlocked": "bun run gates:pre && bun run library-index && bun run check:library-index && bun run clean && bun run token && bun run build:bundles && bun run tree && bun run gates:post && bun run gallery",
|
||||
"check:card-deck": "node internal/check-card-deck.mjs",
|
||||
"check:poster-raster": "node internal/check-poster-raster.mjs",
|
||||
"check:deck-click": "node internal/check-deck-click.mjs",
|
||||
"check:poster-prints": "node internal/check-poster-prints.mjs",
|
||||
"check:provider-switch": "node internal/check-provider-switch.mjs",
|
||||
"check:mfe-two-tab": "node internal/check-mfe-two-tab.mjs",
|
||||
|
|
|
|||
|
|
@ -441,7 +441,11 @@ const mapTheme = useMapTheme(uiStore)
|
|||
const FEATURES = {
|
||||
doxaRegions: true,
|
||||
adoption: false, // Adoption tab hidden per UX request; wiring kept warm (flip to true to restore)
|
||||
share: true, // Share button enabled — parameterized share control on every map
|
||||
// The map-level ShareButton is GONE, not flagged off — country-posters-mfe.vue's
|
||||
// header owns sharing for this bundle. See the note at its former site in the
|
||||
// toolbar. This flag is kept only so the FEATURES shape stays stable for any
|
||||
// other consumer reading it.
|
||||
share: false,
|
||||
hamburgerMenu: false, // canonical default — emit/listen mismatch + drawer surplus
|
||||
// Per QA building-round-1 R3 A4: clear the geocoder text on tab switch by
|
||||
// default; flip to true to preserve the previous tab's query when returning.
|
||||
|
|
@ -2137,9 +2141,14 @@ onBeforeUnmount(() => {
|
|||
<LocationButton :map="map" :is-dark="isDark" />
|
||||
<FullscreenButton :map-container="mapContainer" :is-dark="isDark" />
|
||||
<ThemeToggleButton :is-dark="isDark" @toggle="handleToggleTheme" />
|
||||
<!-- Share button hidden behind FEATURES.share (glitch — PR gate). All
|
||||
ShareButton code kept warm; flip FEATURES.share=true to restore. -->
|
||||
<ShareButton v-if="FEATURES.share" :is-dark="isDark" :embed-path="'country-posters/countries-map/index.html'" />
|
||||
<!-- ShareButton intentionally OMITTED; country-posters-mfe.vue's header owns
|
||||
sharing for this bundle, exactly as upg-100-mfe does for the 100-list.
|
||||
Rendering both gave the bundle TWO share affordances on one surface — the
|
||||
BUG-UPG100-DOUBLE-SHARE state the 100-list already fixed once, caught here
|
||||
by check:share-policy rather than by a reader seeing two buttons.
|
||||
REMOVED, not flag-gated: a `v-if="false"` button is dead code that still
|
||||
reads as an affordance to every reader and every counter. A map embedded
|
||||
WITHOUT the MFE header would add one back deliberately. -->
|
||||
</MapToolbar>
|
||||
|
||||
<!-- Fly + Clusters floating toolbar — sibling of the legend card, mounted
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@
|
|||
*/
|
||||
import { computed, inject, ref, watch, onBeforeUnmount } from 'vue'
|
||||
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
|
||||
import { usePosterPrints } from '@map/composables/usePosterPrints.js'
|
||||
import { openPrintFrame } from '@map/composables/printInPlace.js'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
// Export-modal geometry — see the note at .modal-scrim below, and library/utils/viewportScrim.js.
|
||||
import { useViewportScrim } from '@map/utils/viewportScrim.js'
|
||||
|
|
@ -339,34 +341,13 @@ const { scrimRef, scrimStyle } = useViewportScrim(exportState)
|
|||
// "popup blocked -> fall back to opening the raw image" branch every caller carried is now dead.
|
||||
// The returned object keeps a truthy `.document`-less shape only so existing `if (!w)` guards stay
|
||||
// harmless; callers should no longer rely on a popup-blocked null.
|
||||
function openPrintWindow(title, bodyHtml, { autoprint = false } = {}) {
|
||||
const frame = document.createElement('iframe')
|
||||
// Off-screen rather than display:none — a display:none iframe does not lay out in every engine,
|
||||
// and a zero-height layout can print a blank first page.
|
||||
frame.setAttribute('aria-hidden', 'true')
|
||||
frame.style.cssText = 'position:fixed;right:0;bottom:0;width:1px;height:1px;opacity:0;border:0'
|
||||
document.body.appendChild(frame)
|
||||
|
||||
const doc = frame.contentDocument
|
||||
if (!doc) { frame.remove(); return null } // no document -> caller keeps its fallback
|
||||
doc.open()
|
||||
doc.write(bodyHtml)
|
||||
if (autoprint) {
|
||||
// Appended AFTER the caller's markup so it runs once the document is parsed —
|
||||
// matches the <img onload> timing the poster path already relies on.
|
||||
doc.write(
|
||||
'<script>window.addEventListener("load",function(){setTimeout(function(){window.focus();window.print()},150)})</' + 'script>')
|
||||
}
|
||||
doc.close()
|
||||
|
||||
// Reclaim the node once the dialog has been dismissed. `afterprint` is the honest signal; the
|
||||
// timeout is a floor for engines that never fire it, so a click can never leak a frame per press.
|
||||
const drop = () => { if (frame.parentNode) frame.remove() }
|
||||
try { frame.contentWindow.addEventListener('afterprint', () => setTimeout(drop, 0)) } catch { /* cross-doc guard */ }
|
||||
setTimeout(drop, 60000)
|
||||
|
||||
return frame.contentWindow
|
||||
}
|
||||
// ★ ONE FRAME MECHANISM, not a fourth copy. This was a local reimplementation of
|
||||
// library/composables/printInPlace.js — same off-screen iframe, same doc.write,
|
||||
// same autoprint script, differing only in an unused `title` argument. Four copies
|
||||
// of one mechanism is how a fix to the blank-first-page behaviour reaches one
|
||||
// caller and not the others. The shared helper takes (bodyHtml, opts), so the
|
||||
// title is dropped here: it was never used, the document's own <title> carries it.
|
||||
const openPrintWindow = (title, bodyHtml, opts) => openPrintFrame(bodyHtml, opts);
|
||||
|
||||
// Escape the handful of characters that break out of an HTML text node or a "..." attribute.
|
||||
// Print-window markup is built by string concatenation (no template-literal/backtick rule for
|
||||
|
|
@ -533,43 +514,35 @@ async function printList100(list) {
|
|||
// pre-baked PDF pointer exists there, `prayer-card-{country}-{lang}.pdf`, not a per-PG
|
||||
// generator). Styling below borrows the poster-wall's own vocabulary (tape header, thin
|
||||
// card border, Material Light palette) instead of inventing a fourth visual language.
|
||||
// ── CARD DECK: the SHARED action ────────────────────────────────────────────
|
||||
// This function used to be a second, hand-maintained copy of the deck print —
|
||||
// same renderer call, same stock, same language resolution — living beside the
|
||||
// composable's. Two copies of one fact drift: a fix to either was invisible to
|
||||
// the other, which is the whole reason the wall was being consolidated.
|
||||
//
|
||||
// It now delegates to library/composables/usePosterPrints.js, sharing THIS wall's
|
||||
// exportState so the HUD keeps rendering one surface. The bundle still owns the
|
||||
// part that cannot be shared — fetchListRecords knows the people-groups API, the
|
||||
// selector evaluator and the pg_slugs special case — and hands it over as the
|
||||
// `records` provider.
|
||||
const prints = usePosterPrints({
|
||||
state: exportState,
|
||||
records: (list) => fetchListRecords(list),
|
||||
lang: () => deckLang(),
|
||||
stock: () => deckStock.value,
|
||||
label: (list) => list?.label || list?.id || '',
|
||||
})
|
||||
|
||||
async function printCardDeck(list) {
|
||||
if (exportState.value) return
|
||||
exportState.value = { label: list.label, kind: 'Card Deck', phase: 'fetch',
|
||||
message: 'fetching people-group records', pct: 30 }
|
||||
try {
|
||||
const rows = await fetchListRecords(list)
|
||||
// ★ THE PAGE IS THE CARD. This used to set @page{size:letter portrait} and give
|
||||
// each card height:100%, so a "deck" printed as 95 mostly-empty 8.5x11 sheets
|
||||
// with no photo. The Driver: "the print dialog that opens up needs to show all
|
||||
// the cards not in a paper format but a CARD format, the aspect ratio that is
|
||||
// used in the card generator."
|
||||
//
|
||||
// The pages now come from library/packet/card-render.js — one renderer, every
|
||||
// caller — which sets @page to the card stock's own inches, so one card is
|
||||
// exactly one page at 2.5x3.5in. Print on cardstock and cut, or send the PDF
|
||||
// to a card printer.
|
||||
const [{ createCardRenderer }, strings] = await Promise.all([
|
||||
import('@map/packet/card-render.js'),
|
||||
import('@map/scripts/posters/packet-strings.json').then((m) => m.default || m),
|
||||
])
|
||||
const R = createCardRenderer({ strings, lang: deckLang(), stock: deckStock.value })
|
||||
const title = `Doxa UPG prayer cards — ${escapeHtml(list.label || list.id)}`
|
||||
exportState.value = { ...exportState.value, phase: 'render',
|
||||
message: `laying out ${rows.length} cards`, pct: 70 }
|
||||
const w = openPrintWindow(title, R.buildDeck(list, rows), { autoprint: true })
|
||||
if (!w) {
|
||||
// See the note in the list path: an iframe cannot be pop-up blocked.
|
||||
exportState.value = { label: list.label, kind: 'Card Deck', phase: 'error',
|
||||
message: 'Could not open the print dialog in this view — try the Download button.', pct: 0 }
|
||||
return
|
||||
}
|
||||
exportState.value = { ...exportState.value, phase: 'done', message: 'print dialog opened', pct: 100 }
|
||||
setTimeout(() => { exportState.value = null }, 900)
|
||||
} catch (e) {
|
||||
exportState.value = { label: list.label, kind: 'Card Deck', phase: 'error',
|
||||
message: String(e?.message || e).slice(0, 140) + (API_BASE ? '' :
|
||||
' (no API configured in this preview — set window.MAP_APP_API_URL)'), pct: 0 }
|
||||
await prints.printCardDeck(list)
|
||||
// Keep the preview-specific hint the shared action cannot know about: in a
|
||||
// dropped tree with no API configured the failure is a CONFIGURATION problem,
|
||||
// not a broken button, and saying so is the difference between "this is broken"
|
||||
// and "this needs a URL".
|
||||
const st = exportState.value
|
||||
if (st && st.phase === 'error' && !API_BASE && !/MAP_APP_API_URL/.test(st.message)) {
|
||||
exportState.value = { ...st,
|
||||
message: `${st.message} (no API configured in this preview — set window.MAP_APP_API_URL)` }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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-KCb+2VIX0x0RZlPudE1oeY64Wp7UPNmJo8Zx7EkADp5+BYHfB2KsRlzS6ssYZMIF" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-MpUL/82/3klzGisdJDdX7UQ6z/9ZX9r6GZzoKohNHeokCEtq9bPAwqHIPTupp8DG" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-KCb+2VIX0x0RZlPudE1oeY64Wp7UPNmJo8Zx7EkADp5+BYHfB2KsRlzS6ssYZMIF" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-MpUL/82/3klzGisdJDdX7UQ6z/9ZX9r6GZzoKohNHeokCEtq9bPAwqHIPTupp8DG" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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-KCb+2VIX0x0RZlPudE1oeY64Wp7UPNmJo8Zx7EkADp5+BYHfB2KsRlzS6ssYZMIF" crossorigin="anonymous"></script>
|
||||
<script src="../country-posters.js" integrity="sha384-MpUL/82/3klzGisdJDdX7UQ6z/9ZX9r6GZzoKohNHeokCEtq9bPAwqHIPTupp8DG" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
78
public/doxa-maps/country-posters/country-posters.js
generated
78
public/doxa-maps/country-posters/country-posters.js
generated
File diff suppressed because one or more lines are too long
2
public/doxa-maps/index.html
generated
2
public/doxa-maps/index.html
generated
File diff suppressed because one or more lines are too long
16
public/doxa-maps/manifest.json
generated
16
public/doxa-maps/manifest.json
generated
|
|
@ -154,7 +154,7 @@
|
|||
"bundle": "country-posters",
|
||||
"scriptUrl": "./country-posters/country-posters.js",
|
||||
"output": "doxa-maps/country-posters/country-posters.js",
|
||||
"integrity": "sha384-KCb+2VIX0x0RZlPudE1oeY64Wp7UPNmJo8Zx7EkADp5+BYHfB2KsRlzS6ssYZMIF",
|
||||
"integrity": "sha384-MpUL/82/3klzGisdJDdX7UQ6z/9ZX9r6GZzoKohNHeokCEtq9bPAwqHIPTupp8DG",
|
||||
"elements": [
|
||||
"country-posters-map"
|
||||
],
|
||||
|
|
@ -174,7 +174,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-KCb+2VIX0x0RZlPudE1oeY64Wp7UPNmJo8Zx7EkADp5+BYHfB2KsRlzS6ssYZMIF\" 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-MpUL/82/3klzGisdJDdX7UQ6z/9ZX9r6GZzoKohNHeokCEtq9bPAwqHIPTupp8DG\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -188,7 +188,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-KCb+2VIX0x0RZlPudE1oeY64Wp7UPNmJo8Zx7EkADp5+BYHfB2KsRlzS6ssYZMIF\" 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-MpUL/82/3klzGisdJDdX7UQ6z/9ZX9r6GZzoKohNHeokCEtq9bPAwqHIPTupp8DG\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -202,7 +202,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-KCb+2VIX0x0RZlPudE1oeY64Wp7UPNmJo8Zx7EkADp5+BYHfB2KsRlzS6ssYZMIF\" 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-MpUL/82/3klzGisdJDdX7UQ6z/9ZX9r6GZzoKohNHeokCEtq9bPAwqHIPTupp8DG\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -658,7 +658,7 @@
|
|||
"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-9MM9Wm9yP7JwtlWBL0+xuJ2yHwHD/trEHYrsk0kEKgR4pXXdTNguIE50TqRCUbK2",
|
||||
"integrity": "sha384-VYXU1i1xnVyXAsxLHy565gD+tQp090jzfT6YPRJAYAKAmYIIqr1KqUtQZnO/zv0A",
|
||||
"elements": [
|
||||
"my-upg-100-list-map"
|
||||
],
|
||||
|
|
@ -678,7 +678,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/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=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-9MM9Wm9yP7JwtlWBL0+xuJ2yHwHD/trEHYrsk0kEKgR4pXXdTNguIE50TqRCUbK2\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-VYXU1i1xnVyXAsxLHy565gD+tQp090jzfT6YPRJAYAKAmYIIqr1KqUtQZnO/zv0A\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -692,7 +692,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-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=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-9MM9Wm9yP7JwtlWBL0+xuJ2yHwHD/trEHYrsk0kEKgR4pXXdTNguIE50TqRCUbK2\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-VYXU1i1xnVyXAsxLHy565gD+tQp090jzfT6YPRJAYAKAmYIIqr1KqUtQZnO/zv0A\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -706,7 +706,7 @@
|
|||
"scriptUrl": "./my-upg-100-list/my-upg-100-list.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./my-upg-100-list/upg-100-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=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-9MM9Wm9yP7JwtlWBL0+xuJ2yHwHD/trEHYrsk0kEKgR4pXXdTNguIE50TqRCUbK2\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./my-upg-100-list/my-upg-100-list.js\" integrity=\"sha384-VYXU1i1xnVyXAsxLHy565gD+tQp090jzfT6YPRJAYAKAmYIIqr1KqUtQZnO/zv0A\" crossorigin=\"anonymous\"></script>\n<my-upg-100-list-map profile-config='{\"profile\":\"upg-100-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></my-upg-100-list-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
146
public/doxa-maps/my-upg-100-list/my-upg-100-list.js
generated
146
public/doxa-maps/my-upg-100-list/my-upg-100-list.js
generated
File diff suppressed because one or more lines are too long
|
|
@ -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" integrity="sha384-9MM9Wm9yP7JwtlWBL0+xuJ2yHwHD/trEHYrsk0kEKgR4pXXdTNguIE50TqRCUbK2" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-VYXU1i1xnVyXAsxLHy565gD+tQp090jzfT6YPRJAYAKAmYIIqr1KqUtQZnO/zv0A" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -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" integrity="sha384-9MM9Wm9yP7JwtlWBL0+xuJ2yHwHD/trEHYrsk0kEKgR4pXXdTNguIE50TqRCUbK2" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-VYXU1i1xnVyXAsxLHy565gD+tQp090jzfT6YPRJAYAKAmYIIqr1KqUtQZnO/zv0A" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,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" integrity="sha384-9MM9Wm9yP7JwtlWBL0+xuJ2yHwHD/trEHYrsk0kEKgR4pXXdTNguIE50TqRCUbK2" crossorigin="anonymous"></script>
|
||||
<script src="../my-upg-100-list.js" integrity="sha384-VYXU1i1xnVyXAsxLHy565gD+tQp090jzfT6YPRJAYAKAmYIIqr1KqUtQZnO/zv0A" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
Loading…
Reference in a new issue