Posterverse: a Bless India Posters row in Experimental, and unpinned mounting for scroll pages
The Experimental folder gains a bless-india-posters row, provisional until its bundle is in the tree (a missing bundle prunes the row, so nothing shows before it lands), with its label in all 11 locales. Its root is a natural-height page of poster cards, so a row may set scroll: the element is then mounted unpinned at its natural height and the pane scrolls it, instead of being pinned to the pane, which would trap the page's own content. check:posterverse-shelf expects the row and the scroll set by name; its self-test drops the row and drops the flag.
This commit is contained in:
parent
01197e2121
commit
00dbf9a79b
5 changed files with 31 additions and 6 deletions
|
|
@ -616,7 +616,7 @@
|
|||
"check:poster-layout-optin": "the composed poster sheet (header, map, legend beside it, footer) is OPT-IN: spec.layout === 'poster' asks for it, and every caller that does not gets the full-page map exactly as before, asserted by object identity, not just by value. Drives the real layout decisions with real spec objects. Headless, no browser.",
|
||||
"check:poster-print-fallback": "clicks the REAL poster print control with the served poster generator and every posters/*.webp aborted, and asserts the preview RASTERISES from posters/<id>.html instead of opening on \"Poster not available yet\". Needs a served tree built with posterSources:true; NOT MEASURED otherwise.",
|
||||
"check:posters-exportable": "every poster the tree offers can be printed. With posterSources on, the tree once shipped only the 28 zone sources, so 350 of 378 posters said \"poster not found (404)\". Each id, from data/posters and the wall's previews, must ship a real WebP (RIFF..WEBP) or a real poster source (its class=\"stage\" element), so a placeholder or a host's fallback page cannot pass. SKIPs when posters are off by config, which check:poster-degrades covers. Reads the built tree; no server.",
|
||||
"check:posterverse-shelf": "Posterverse (the capability-5 poster shell) shows exactly its allow-list and never a gated plugin. Asserts the rail rows per section (Posters: upg-100, country-posters, poster-design; Experimental: wall-of-people-groups, bible-posters), that no row names key-cities or a shell (a key-cities bundle is planted into the built manifest, because the real one withholds gated profiles), that every present row opens the profile it names (no silent fallback to a leaf), that posterverse.meta.json composes equals the rows whose bundle exists, and 11-locale parity of the shell strings. --self-test plants one defect per arm. Headless. Exit 0 pass, 1 fail, 75 no built manifest.",
|
||||
"check:posterverse-shelf": "Posterverse (the capability-5 poster shell) shows exactly its allow-list and never a gated plugin. Asserts the rail rows per section (Posters: upg-100, country-posters, poster-design; Experimental: wall-of-people-groups, bible-posters, bless-india-posters), that no row names key-cities or a shell (a key-cities bundle is planted into the built manifest, because the real one withholds gated profiles), that every present row opens the profile it names (no silent fallback to a leaf), that posterverse.meta.json composes equals the rows whose bundle exists, and 11-locale parity of the shell strings. --self-test plants one defect per arm. Headless. Exit 0 pass, 1 fail, 75 no built manifest.",
|
||||
"check:prayer-walk-planner": "the Prayer Walk Planner is a full-page tool that prints a real walking map: the map canvas fills the page below the toolbar in its own leaf AND inside the Research Gallery at 1280x800 and 390x844 (the gallery once collapsed it to 76px / 0px); a real zone (Balat, Istanbul) renders a >=2000px print map that is not blank, saved to OUT=<dir> so a human can read it; ?lang=es gives a Spanish toolbar; 0 page errors. Run inside the shared browser locks. Exit 2 = SKIP.",
|
||||
"check:preset-config-merge": "a preset page (<bundle>/<profile>/<instance>/index.html) keeps every default in its profile's .meta.json config, with the instance's props merged over them (upg-neighbor's presets lost pinHint:false when props replaced the config). Reads the built tree; SKIP without one.",
|
||||
"check:profile-table": "the prayer packet's profile TABLE (20 full-width rows: picture, generated description, three boxes; PER_PAGE stays 20): a row stays tall enough for a name plus a two-line description at the smallest fit size, and truncation happens only at a whole word. Character-count, not DOM, so Node and the browser agree. Cannot see the RENDERED row height: that is check:packet-render, a browser gate. By the UPG-100 owner; mutation-tested. Headless; in gates:pre.",
|
||||
|
|
|
|||
|
|
@ -387,9 +387,13 @@ export default defineComponent({
|
|||
el.setAttribute('profile-config', JSON.stringify(this.childConfig(t)))
|
||||
// Also as a plain attribute: an element without a ProfileLoader reads tree-base as a prop.
|
||||
if (this.base) el.setAttribute('tree-base', this.base.replace(/\/+$/, ''))
|
||||
// Pin the element to the pane. min-height:0 is load-bearing: a child's own floor (420-600px on
|
||||
// these plugins) otherwise wins over height:100% and the pane scrolls the whole plugin.
|
||||
el.style.cssText = 'display:block;position:absolute;inset:0;width:100%;height:100%;min-height:0;'
|
||||
// FIXED-VIEWPORT (the default): pin the element to the pane. min-height:0 is load-bearing: a
|
||||
// child's own floor (420-600px on these plugins) otherwise wins over height:100% and the pane
|
||||
// scrolls the whole plugin. SCROLL rows (t.scroll, a natural-height page) are NOT pinned: they
|
||||
// take their natural height and the pane (overflow-y:auto) scrolls them.
|
||||
el.style.cssText = t.scroll
|
||||
? 'display:block;position:static;width:100%;height:auto;'
|
||||
: 'display:block;position:absolute;inset:0;width:100%;height:100%;min-height:0;'
|
||||
slot.appendChild(el)
|
||||
t.state = 'ready'
|
||||
} catch (e) {
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
*
|
||||
* WHAT IT ASSERTS (each arm is poisoned by --self-test before a pass is trusted):
|
||||
* A. the Experimental folder starts open, and the rail's rows are exactly the named sets: Posters = upg-100, country-posters, poster-design;
|
||||
* Experimental = wall-of-people-groups, bible-posters (poster plugins only). Ids unique,
|
||||
* Experimental = wall-of-people-groups, bible-posters, bless-india-posters (poster plugins only). Ids unique,
|
||||
* every row in a declared section.
|
||||
* B. no row names a NEVER bundle (key-cities, the shells themselves), and resolving the built
|
||||
* manifest WITH a key-cities bundle planted in it yields no key-cities row (the real manifest
|
||||
|
|
@ -34,9 +34,12 @@ const ROOT = resolve(PLUGIN, '../..')
|
|||
|
||||
const EXPECT = {
|
||||
posters: ['upg-100', 'country-posters', 'poster-design'],
|
||||
experimental: ['wall-of-people-groups', 'bible-posters'],
|
||||
experimental: ['wall-of-people-groups', 'bible-posters', 'bless-india-posters'],
|
||||
}
|
||||
const GATED = 'key-cities'
|
||||
// Rows whose plugin is a natural-height page: mounted unpinned so the pane scrolls them. Named, because a
|
||||
// pinned scroll page traps its own content and nothing else would notice.
|
||||
const EXPECT_SCROLL = ['bless-india-posters']
|
||||
|
||||
const sameList = (a, b) => a.length === b.length && a.every((x, i) => x === b[i])
|
||||
|
||||
|
|
@ -55,6 +58,8 @@ export function checkShelf({ SECTIONS, TABS, NEVER, resolveTabs, manifest, meta,
|
|||
// The Experimental folder starts OPEN: closed, under one short section, it read as an empty caption.
|
||||
const exp = SECTIONS.find((g) => g.key === 'experimental')
|
||||
if (!exp || !exp.folder || exp.open !== true) errs.push('A: the Experimental folder must be declared folder:true, open:true (closed, it is easy to miss)')
|
||||
const scrollRows = TABS.filter((t) => t.scroll).map((t) => t.id)
|
||||
if (!sameList(scrollRows, EXPECT_SCROLL)) errs.push(`A: scroll (unpinned) rows are [${scrollRows.join(', ')}], expected [${EXPECT_SCROLL.join(', ')}]`)
|
||||
const extra = TABS.filter((t) => !EXPECT[t.section]).map((t) => t.id)
|
||||
if (extra.length) errs.push(`A: rows outside the allow-listed sections: ${extra.join(', ')}`)
|
||||
// B. never a gated bundle — by declaration and by resolution over the real manifest
|
||||
|
|
@ -118,6 +123,8 @@ function selfTest(base) {
|
|||
const cases = [
|
||||
['A: key-cities added to Experimental', (c) => { c.TABS = [...c.TABS, { id: 'key-cities', section: 'experimental', bundle: 'key-cities', profile: 'key-cities' }] }, /^A: section experimental|^B: row key-cities/],
|
||||
['A: the Experimental folder closed again', (c) => { c.SECTIONS = c.SECTIONS.map((g) => g.key === 'experimental' ? { ...g, open: false } : g) }, /^A: the Experimental folder must be/],
|
||||
['A: Bless India Posters dropped', (c) => { c.TABS = c.TABS.filter((t) => t.id !== 'bless-india-posters') }, /^A: section experimental/],
|
||||
['A: Bless India Posters pinned (scroll flag lost)', (c) => { c.TABS = c.TABS.map((t) => t.id === 'bless-india-posters' ? { ...t, scroll: false } : t) }, /^A: scroll \(unpinned\) rows/],
|
||||
['A: a row dropped', (c) => { c.TABS = c.TABS.filter((t) => t.id !== 'wall-of-people-groups') }, /^A: section experimental/],
|
||||
['B: resolver that shows whatever the manifest carries', (c) => { c.resolveTabs = (m) => (m.bundles || []).map((b) => ({ id: b.bundle, bundle: b.bundle, profile: b.bundle, tag: b.bundle, scriptUrl: b.scriptUrl })) }, /^B: resolution produced a key-cities row/],
|
||||
['C: a composite row falls back to a leaf', (c) => { c.manifest = clone(c.manifest); const b = c.manifest.bundles.find((x) => x.bundle === 'my-upg-100-list'); b.profiles = b.profiles.filter((p) => p.profile !== 'upg-100-mfe') }, /^C: row upg-100 opens/],
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'Poster Design', 'sub.poster-design': 'every poster style and size',
|
||||
'tab.wall-of-people-groups': 'Wall of People Groups',
|
||||
'tab.bible-posters': 'Bible Posters',
|
||||
'tab.bless-india-posters': 'Bless India Posters',
|
||||
experimentalSub: 'experimental bundle', lab: 'lab',
|
||||
loading: 'Loading {label}…', loadFailed: 'Could not load {label}.',
|
||||
manifestHint: 'This tab is composed from manifest.json — build the tree, or serve the built tree, to load it.',
|
||||
|
|
@ -34,6 +35,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'Diseño de carteles', 'sub.poster-design': 'todos los estilos y tamaños de cartel',
|
||||
'tab.wall-of-people-groups': 'Muro de los pueblos',
|
||||
'tab.bible-posters': 'Carteles bíblicos',
|
||||
'tab.bless-india-posters': 'Bendigan a la India: carteles',
|
||||
experimentalSub: 'mapa experimental', lab: 'beta',
|
||||
loading: 'Cargando {label}…', loadFailed: 'No se pudo cargar {label}.',
|
||||
manifestHint: 'Esta pestaña se compone a partir de manifest.json: compila el árbol o sirve el árbol compilado para cargarla.',
|
||||
|
|
@ -48,6 +50,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'Conception d’affiches', 'sub.poster-design': 'tous les styles et formats d’affiche',
|
||||
'tab.wall-of-people-groups': 'Mur des peuples',
|
||||
'tab.bible-posters': 'Affiches bibliques',
|
||||
'tab.bless-india-posters': 'Bénissez l’Inde : affiches',
|
||||
experimentalSub: 'carte expérimentale', lab: 'bêta',
|
||||
loading: 'Chargement de {label}…', loadFailed: 'Impossible de charger {label}.',
|
||||
manifestHint: "Cet onglet est composé à partir de manifest.json : construisez l'arborescence ou servez l'arborescence construite pour le charger.",
|
||||
|
|
@ -62,6 +65,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'Postergestaltung', 'sub.poster-design': 'alle Posterstile und -größen',
|
||||
'tab.wall-of-people-groups': 'Wand der Volksgruppen',
|
||||
'tab.bible-posters': 'Bibelposter',
|
||||
'tab.bless-india-posters': 'Segnet Indien: Poster',
|
||||
experimentalSub: 'experimentelle Karte', lab: 'Beta',
|
||||
loading: '{label} wird geladen…', loadFailed: '{label} konnte nicht geladen werden.',
|
||||
manifestHint: 'Dieser Tab wird aus manifest.json zusammengesetzt – bauen Sie den Baum oder stellen Sie den gebauten Baum bereit, um ihn zu laden.',
|
||||
|
|
@ -76,6 +80,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'Design de cartazes', 'sub.poster-design': 'todos os estilos e tamanhos de cartaz',
|
||||
'tab.wall-of-people-groups': 'Mural dos povos',
|
||||
'tab.bible-posters': 'Cartazes bíblicos',
|
||||
'tab.bless-india-posters': 'Abençoem a Índia: cartazes',
|
||||
experimentalSub: 'mapa experimental', lab: 'beta',
|
||||
loading: 'Carregando {label}…', loadFailed: 'Não foi possível carregar {label}.',
|
||||
manifestHint: 'Esta aba é composta a partir do manifest.json — compile a árvore ou sirva a árvore compilada para carregá-la.',
|
||||
|
|
@ -90,6 +95,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'Design dei poster', 'sub.poster-design': 'tutti gli stili e i formati dei poster',
|
||||
'tab.wall-of-people-groups': 'Muro dei popoli',
|
||||
'tab.bible-posters': 'Poster biblici',
|
||||
'tab.bless-india-posters': 'Benedite l’India: poster',
|
||||
experimentalSub: 'mappa sperimentale', lab: 'beta',
|
||||
loading: 'Caricamento di {label}…', loadFailed: 'Impossibile caricare {label}.',
|
||||
manifestHint: "Questa scheda è composta da manifest.json: compila l'albero o pubblica l'albero compilato per caricarla.",
|
||||
|
|
@ -104,6 +110,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'Design de afișe', 'sub.poster-design': 'toate stilurile și dimensiunile de afiș',
|
||||
'tab.wall-of-people-groups': 'Zidul popoarelor',
|
||||
'tab.bible-posters': 'Afișe biblice',
|
||||
'tab.bless-india-posters': 'Binecuvântați India: afișe',
|
||||
experimentalSub: 'hartă experimentală', lab: 'beta',
|
||||
loading: 'Se încarcă {label}…', loadFailed: '{label} nu a putut fi încărcat.',
|
||||
manifestHint: 'Această filă este compusă din manifest.json — construiți arborele sau serviți arborele construit pentru a o încărca.',
|
||||
|
|
@ -118,6 +125,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'Дизайн плакатов', 'sub.poster-design': 'все стили и размеры плакатов',
|
||||
'tab.wall-of-people-groups': 'Стена народов',
|
||||
'tab.bible-posters': 'Библейские плакаты',
|
||||
'tab.bless-india-posters': 'Благословляйте Индию: плакаты',
|
||||
experimentalSub: 'экспериментальная карта', lab: 'бета',
|
||||
loading: 'Загрузка: {label}…', loadFailed: 'Не удалось загрузить: {label}.',
|
||||
manifestHint: 'Эта вкладка собирается из manifest.json — соберите дерево или разместите собранное дерево, чтобы загрузить её.',
|
||||
|
|
@ -132,6 +140,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'تصميم الملصقات', 'sub.poster-design': 'كل أنماط الملصقات وأحجامها',
|
||||
'tab.wall-of-people-groups': 'جدار الشعوب',
|
||||
'tab.bible-posters': 'ملصقات الكتاب المقدس',
|
||||
'tab.bless-india-posters': 'باركوا الهند: ملصقات',
|
||||
experimentalSub: 'خريطة تجريبية', lab: 'تجريبي',
|
||||
loading: 'جارٍ تحميل {label}…', loadFailed: 'تعذّر تحميل {label}.',
|
||||
manifestHint: 'تُبنى علامة التبويب هذه من manifest.json — ابنِ الشجرة أو قدّم الشجرة المبنية لتحميلها.',
|
||||
|
|
@ -146,6 +155,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': 'पोस्टर डिज़ाइन', 'sub.poster-design': 'हर पोस्टर शैली और आकार',
|
||||
'tab.wall-of-people-groups': 'जनसमूहों की दीवार',
|
||||
'tab.bible-posters': 'बाइबल पोस्टर',
|
||||
'tab.bless-india-posters': 'भारत को आशीष दो: पोस्टर',
|
||||
experimentalSub: 'प्रायोगिक मानचित्र', lab: 'बीटा',
|
||||
loading: '{label} लोड हो रहा है…', loadFailed: '{label} लोड नहीं हो सका।',
|
||||
manifestHint: 'यह टैब manifest.json से बनता है — इसे लोड करने के लिए ट्री बनाएँ या बना हुआ ट्री सर्व करें।',
|
||||
|
|
@ -160,6 +170,7 @@ export const STRINGS = {
|
|||
'tab.poster-design': '海报设计', 'sub.poster-design': '所有海报样式与尺寸',
|
||||
'tab.wall-of-people-groups': '民族之墙',
|
||||
'tab.bible-posters': '圣经海报',
|
||||
'tab.bless-india-posters': '祝福印度:海报',
|
||||
experimentalSub: '实验性地图', lab: '测试版',
|
||||
loading: '正在加载{label}…', loadFailed: '无法加载{label}。',
|
||||
manifestHint: '此标签页由 manifest.json 组成——请构建目录树或提供已构建的目录树以加载它。',
|
||||
|
|
|
|||
|
|
@ -37,6 +37,9 @@ export const TABS = [
|
|||
{ id: 'poster-design', section: 'posters', icon: 'poster', bundle: 'poster-design', profile: 'poster-design-mfe' },
|
||||
{ id: 'wall-of-people-groups', section: 'experimental', icon: 'flask', bundle: 'wall-of-people-groups', profile: 'wall-of-people-groups' },
|
||||
{ id: 'bible-posters', section: 'experimental', icon: 'flask', bundle: 'bible-posters', profile: 'bible-posters' },
|
||||
// Provisional until its bundle lands: then `composes` gains it in the same PR and the flag goes. Its root
|
||||
// is a natural-height page of poster cards, so it mounts unpinned (`scroll`) and the pane scrolls it.
|
||||
{ id: 'bless-india-posters', section: 'experimental', icon: 'flask', bundle: 'bless-india-posters', profile: 'bless-india-posters', provisional: true, scroll: true },
|
||||
]
|
||||
|
||||
// Bundles that must never be a Posterverse row. The allow-list above already excludes them; this set
|
||||
|
|
|
|||
Loading…
Reference in a new issue