Poster Design: production designs first; experimental ones in a collapsed group

Styles now lists the production designs by family, and puts every
experimental design last, in one Experimental (in progress) group that
starts collapsed (a click opens it). Experimental: the side-lane country
sheets (66x66, 36x60, and 60x96, still being designed), the map print (no
preview: it prints the live map), and every other plugin's design (made by
its own plugin, so not drawn here). templates.js marks them experimental;
posterDesign.family.experimental is new in all 11 locales.
This commit is contained in:
Doxa Maps 2026-10-03 04:19:37 +00:00
parent 547760b512
commit e043402006
19 changed files with 172 additions and 148 deletions

View file

@ -40,7 +40,8 @@
"cards": "بطاقات الصلاة",
"wall": "ألواح الجدار",
"mapPrint": "طباعة الخريطة",
"plugins": "من إضافات أخرى"
"plugins": "من إضافات أخرى",
"experimental": "تجريبية (قيد العمل)"
},
"tpl": {
"mapSheetCountry": "صفحة خريطة الدولة",

View file

@ -40,7 +40,8 @@
"cards": "Gebetskarten",
"wall": "Wandtafeln",
"mapPrint": "Kartendruck",
"plugins": "Aus anderen Plugins"
"plugins": "Aus anderen Plugins",
"experimental": "Experimentell (in Arbeit)"
},
"tpl": {
"mapSheetCountry": "Länder-Kartenblatt",

View file

@ -40,7 +40,8 @@
"cards": "Prayer cards",
"wall": "Wall panels",
"mapPrint": "Map print",
"plugins": "From other plugins"
"plugins": "From other plugins",
"experimental": "Experimental (in progress)"
},
"tpl": {
"mapSheetCountry": "Country map sheet",

View file

@ -40,7 +40,8 @@
"cards": "Tarjetas de oración",
"wall": "Paneles de pared",
"mapPrint": "Impresión del mapa",
"plugins": "De otros complementos"
"plugins": "De otros complementos",
"experimental": "Experimentales (en desarrollo)"
},
"tpl": {
"mapSheetCountry": "Hoja de mapa del país",

View file

@ -40,7 +40,8 @@
"cards": "Cartes de prière",
"wall": "Panneaux muraux",
"mapPrint": "Impression de la carte",
"plugins": "D’autres plugins"
"plugins": "D’autres plugins",
"experimental": "Expérimentaux (en cours)"
},
"tpl": {
"mapSheetCountry": "Feuille de carte du pays",

View file

@ -40,7 +40,8 @@
"cards": "प्रार्थना कार्ड",
"wall": "दीवार पैनल",
"mapPrint": "मानचित्र प्रिंट",
"plugins": "अन्य प्लगइन से"
"plugins": "अन्य प्लगइन से",
"experimental": "प्रयोगात्मक (काम जारी)"
},
"tpl": {
"mapSheetCountry": "देश का मानचित्र पृष्ठ",

View file

@ -40,7 +40,8 @@
"cards": "Schede di preghiera",
"wall": "Pannelli da parete",
"mapPrint": "Stampa della mappa",
"plugins": "Da altri plugin"
"plugins": "Da altri plugin",
"experimental": "Sperimentali (in corso)"
},
"tpl": {
"mapSheetCountry": "Foglio mappa del paese",

View file

@ -40,7 +40,8 @@
"cards": "Cartões de oração",
"wall": "Painéis de parede",
"mapPrint": "Impressão do mapa",
"plugins": "De outros plugins"
"plugins": "De outros plugins",
"experimental": "Experimentais (em andamento)"
},
"tpl": {
"mapSheetCountry": "Folha de mapa do país",

View file

@ -40,7 +40,8 @@
"cards": "Cartonașe de rugăciune",
"wall": "Panouri de perete",
"mapPrint": "Tipărirea hărții",
"plugins": "Din alte pluginuri"
"plugins": "Din alte pluginuri",
"experimental": "Experimentale (în lucru)"
},
"tpl": {
"mapSheetCountry": "Foaie de hartă a țării",

View file

@ -40,7 +40,8 @@
"cards": "Молитвенные карточки",
"wall": "Настенные панели",
"mapPrint": "Печать карты",
"plugins": "Из других плагинов"
"plugins": "Из других плагинов",
"experimental": "Экспериментальные (в работе)"
},
"tpl": {
"mapSheetCountry": "Лист карты страны",

View file

@ -40,7 +40,8 @@
"cards": "祷告卡",
"wall": "墙面展板",
"mapPrint": "地图打印",
"plugins": "来自其他插件"
"plugins": "来自其他插件",
"experimental": "实验性(进行中)"
},
"tpl": {
"mapSheetCountry": "国家地图页",

View file

@ -74,12 +74,21 @@ const pluginLabel = (d) => {
return `${pluginTitle(d)}: ${declaredSizeText(d.size, t)}`
}
// PRODUCTION designs first, by family. EXPERIMENTAL ones (marked in templates.js: still being designed, or no
// preview) and every other plugin's design (made by its own plugin, so drawn nowhere here) go last, in ONE
// Experimental group that starts collapsed.
const isExperimental = (id) => byPluginName.value.has(id) || byName.get(id)?.experimental === true
const experimentalHeading = computed(() => t('posterDesign.family.experimental'))
// No `count`: these are templates, not lists of people, so the sticker reads "Show full details" alone.
const items = computed(() => [
...configs.map((c) => ({ id: c.name, label: labelOf(c) })),
...pluginDesigns.value.map((d) => ({ id: d.name, label: pluginLabel(d) })),
])
const groupBy = (item) => (byPluginName.value.has(item.id) ? t('posterDesign.family.plugins') : t(FAMILY_KEYS[byName.get(item.id)?.family] || FAMILY_KEYS.mapSheet))
const items = computed(() => {
const all = [
...configs.map((c) => ({ id: c.name, label: labelOf(c) })),
...pluginDesigns.value.map((d) => ({ id: d.name, label: pluginLabel(d) })),
]
return [...all.filter((x) => !isExperimental(x.id)), ...all.filter((x) => isExperimental(x.id))]
})
const groupBy = (item) => (isExperimental(item.id) ? experimentalHeading.value : t(FAMILY_KEYS[byName.get(item.id)?.family] || FAMILY_KEYS.mapSheet))
const collapsedBy = (sec) => (sec && sec.name) === experimentalHeading.value // PosterWall passes the section
// ── drawing a configuration from the library ──────────────────────────────────────────────────
const countryById = (id) => (countryData.countries || []).find((c) => c.id === id)
@ -240,6 +249,7 @@ useShadowStyles(`
unit=""
item-count-key="posterDesign.templateCount"
:collapsible="true"
:collapsed-by="collapsedBy"
:header-action="{ labelKey: 'posterDesign.showFullDetails', ariaKey: 'posterDesign.showFullDetailsAria' }"
:preview-src="previewSrc"
:unsupported="withheld"

View file

@ -34,9 +34,10 @@ export const SAMPLE_COUNTRY_ID = 'country-npl'
export const SHEET_FORMATS = {
// `size` is the printed size as data (src/sizeText.js names it in the reader's language): inches, side lanes, paper.
'3x3': { size: { dims: [36, 36] }, px: [1500, 1500] },
'60x96': { size: { dims: [60, 96], lanes: true }, px: [2500, 4000], sample: 'country-ind' },
'66x66': { size: { dims: [66, 66], lanes: true }, px: [2750, 2750], sample: 'country-chn', missing: 'posterDesign.missing.noCountryAtSize' },
'36x60': { size: { dims: [36, 60], lanes: true }, px: [1500, 2500], sample: 'country-sdn', missing: 'posterDesign.missing.noCountryAtSize' },
// experimental: still being designed, or no drawable preview; Styles lists these in a collapsed Experimental group.
'60x96': { size: { dims: [60, 96], lanes: true }, px: [2500, 4000], sample: 'country-ind', experimental: true },
'66x66': { size: { dims: [66, 66], lanes: true }, px: [2750, 2750], sample: 'country-chn', missing: 'posterDesign.missing.noCountryAtSize', experimental: true },
'36x60': { size: { dims: [36, 60], lanes: true }, px: [1500, 2500], sample: 'country-sdn', missing: 'posterDesign.missing.noCountryAtSize', experimental: true },
'3x4': { size: { dims: [36, 48] }, px: [1500, 2000], legacy: true },
letter: { size: { paper: 'letter' }, px: [1500, 1941] },
packet: { size: { paper: 'letter', packetPage: true }, px: [1500, 1941] },
@ -61,6 +62,7 @@ function sheetEntry(format) {
size: f.size,
px: f.px,
legacy: !!f.legacy,
...(f.experimental ? { experimental: true } : {}),
...(f.missing ? { missing: f.missing } : {}),
renderer: 'library/packet/posterSheets.js generateCountrySheet → library/packet/poster-render.js',
settings: { format },
@ -117,6 +119,7 @@ export function listConfigurations() {
settings: {},
sample: null,
render: null,
experimental: true, // no preview: it prints the live map the reader is looking at
missing: 'posterDesign.missing.mapPrint',
},
]

View file

@ -1277,7 +1277,7 @@
"bundle": "poster-design",
"scriptUrl": "./poster-design/poster-design.js",
"output": "dx-maps/poster-design/poster-design.js",
"integrity": "sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE",
"integrity": "sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7",
"elements": [
"poster-design"
],
@ -1300,7 +1300,7 @@
"scriptUrl": "./poster-design/poster-design.js",
"embed": {
"iframe": "<iframe src=\"./poster-design/poster-design-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=\"./poster-design/poster-design.js\" integrity=\"sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-design-mfe\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./poster-design/poster-design.js\" integrity=\"sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-design-mfe\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
}
},
{
@ -1316,7 +1316,7 @@
"scriptUrl": "./poster-design/poster-design.js",
"embed": {
"iframe": "<iframe src=\"./poster-design/poster-sizes/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=\"./poster-design/poster-design.js\" integrity=\"sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-sizes\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./poster-design/poster-design.js\" integrity=\"sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-sizes\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
}
},
{
@ -1332,7 +1332,7 @@
"scriptUrl": "./poster-design/poster-design.js",
"embed": {
"iframe": "<iframe src=\"./poster-design/poster-styles/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=\"./poster-design/poster-design.js\" integrity=\"sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-styles\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./poster-design/poster-design.js\" integrity=\"sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-styles\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
}
}
]

View file

@ -1277,7 +1277,7 @@
"bundle": "poster-design",
"scriptUrl": "./poster-design/poster-design.js",
"output": "dx-maps/poster-design/poster-design.js",
"integrity": "sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE",
"integrity": "sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7",
"elements": [
"poster-design"
],
@ -1300,7 +1300,7 @@
"scriptUrl": "./poster-design/poster-design.js",
"embed": {
"iframe": "<iframe src=\"./poster-design/poster-design-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=\"./poster-design/poster-design.js\" integrity=\"sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-design-mfe\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./poster-design/poster-design.js\" integrity=\"sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-design-mfe\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
}
},
{
@ -1316,7 +1316,7 @@
"scriptUrl": "./poster-design/poster-design.js",
"embed": {
"iframe": "<iframe src=\"./poster-design/poster-sizes/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=\"./poster-design/poster-design.js\" integrity=\"sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-sizes\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./poster-design/poster-design.js\" integrity=\"sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-sizes\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
}
},
{
@ -1332,7 +1332,7 @@
"scriptUrl": "./poster-design/poster-design.js",
"embed": {
"iframe": "<iframe src=\"./poster-design/poster-styles/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=\"./poster-design/poster-design.js\" integrity=\"sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-styles\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./poster-design/poster-design.js\" integrity=\"sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<poster-design profile-config='{\"profile\":\"poster-styles\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></poster-design>"
}
}
]

View file

@ -73,7 +73,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <poster-design> custom element. -->
<script src="../poster-design.js" integrity="sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE" crossorigin="anonymous"></script>
<script src="../poster-design.js" integrity="sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7" 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

@ -67,7 +67,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <poster-design> custom element. -->
<script src="../poster-design.js" integrity="sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE" crossorigin="anonymous"></script>
<script src="../poster-design.js" integrity="sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -67,7 +67,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <poster-design> custom element. -->
<script src="../poster-design.js" integrity="sha384-kVf5O9aAROlIj262oQXNtH1vNc5BlieUEotbouNaKdiFsmAUqwmSIkVNRrYQqgGE" crossorigin="anonymous"></script>
<script src="../poster-design.js" integrity="sha384-8ma38d8X5WOwsDXKjPFFx8Edr7w6bDsrLjYQIf/m6zCu9VWO2uogLYWqDbaEIjj7" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: