Posterverse: the Experimental folder starts open

Closed, the folder sat mid-drawer under the one short Posters section with
empty space below, so it read as a caption with nothing under it and was easy
to miss on a phone. Open, its plugins show like any section's rows; a reader
can still collapse it. check:posterverse-shelf asserts the open default, and
its self-test plants a closed folder.
This commit is contained in:
Doxa Maps 2026-10-02 11:08:33 +00:00
parent 2fc9b94f0e
commit 7eb05ee77f
2 changed files with 11 additions and 3 deletions

View file

@ -8,7 +8,7 @@
* GATED. The allow-list lives in src/tabs.js; this gate is what keeps it one.
*
* WHAT IT ASSERTS (each arm is poisoned by --self-test before a pass is trusted):
* A. the rail's rows are exactly the named sets: Posters = upg-100, country-posters, poster-design;
* 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,
* every row in a declared section.
* B. no row names a NEVER bundle (key-cities, the shells themselves), and resolving the built
@ -52,6 +52,9 @@ export function checkShelf({ SECTIONS, TABS, NEVER, resolveTabs, manifest, meta,
const got = TABS.filter((t) => t.section === sec).map((t) => t.id)
if (!sameList(got, want)) errs.push(`A: section ${sec} rows are [${got.join(', ')}], expected [${want.join(', ')}]`)
}
// 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 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
@ -114,6 +117,7 @@ function selfTest(base) {
const clone = (o) => JSON.parse(JSON.stringify(o))
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: 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/],

View file

@ -20,10 +20,14 @@
* composite is the plugin as its owner designed it (and it is what makes Posterverse capability 5).
*/
// The rail's sections, in order. `folder` renders collapsible and starts closed, like the gallery's.
// The rail's sections, in order. Experimental is a collapsible folder, like the gallery's, but it starts
// OPEN: the gallery's closed folder sits at the foot of a long rail, while Posterverse has one short
// section above it, so a closed folder sat mid-drawer with empty space below and read as a caption with
// nothing under it (measured at 390: the heading at y 335 in an 800px drawer, ~500px empty below).
// Open, its plugins show like any section's rows; a reader can still collapse it.
export const SECTIONS = [
{ key: 'posters', i18n: 'sec.posters', icon: 'poster' },
{ key: 'experimental', i18n: 'sec.experimental', icon: 'flask', folder: true, open: false },
{ key: 'experimental', i18n: 'sec.experimental', icon: 'flask', folder: true, open: true },
]
// Every row Posterverse can show, in rail order.