The gallery is Deep Research, and a host can hide its Experimental folder

DX Life publishes the gallery shell on a hidden page named Deep Research, so that is now the
default heading (profile-config.heading or the heading prop still override it), and the meta,
instance and demo page say the same.

profile-config experimental:false (or "hidden") hides the Experimental folder: the manifest is not
mined for experimental tabs, the folder has no rows, and a tab= request for one falls back to the
first visible tab. It is off only on request, so every other host keeps the folder as before.
This commit is contained in:
Doxa Maps 2026-09-29 18:37:12 +00:00
parent feb75f0f44
commit b435a7a548
4 changed files with 18 additions and 7 deletions

View file

@ -4,12 +4,12 @@
"instances": [
{
"id": "app",
"title": "Research Gallery — Big Picture + every research map (app-shell)",
"title": "Deep Research — Big Picture + every research map (app-shell)",
"props": {
"profile": "doxa-maps-spa",
"provider": "maplibre",
"instanceId": "doxa-maps-spa-app",
"title": "Research Gallery"
"title": "Deep Research"
}
}
]

View file

@ -10,5 +10,5 @@
"cities-internet/connectivity-map",
"gospel-resources/resources-map"
],
"label": "Research Gallery (vertical-tab app shell: the seven production maps)"
"label": "Deep Research (vertical-tab app shell: the seven production maps)"
}

View file

@ -60,7 +60,7 @@
:dir="uiDir"
:lang="uiLocale"
:labels="layoutLabels"
:title="heading"
:title="headingText"
:nav-label="t('navLabel')"
:header="showHeader"
:groups="navGroups"
@ -759,7 +759,9 @@ export default defineComponent({
// mount that it will overwrite the native one. Both capability-5 shells had the same
// declaration, which is the same duplicate-implementation pattern that turned one resolver
// assumption into two separate outages — when one shell is fixed, grep for its twin.
heading: { type: String, default: 'DX-Maps' },
// DX Life publishes this gallery as "Deep Research" (a hidden page on its site), so that is the
// default name. A host may still pass its own, as this prop or as profile-config.heading.
heading: { type: String, default: 'Deep Research' },
// Optional: pin the Mapbox token / token URL forwarded to each tab's element via profile-config.
tokenUrl: { type: String, default: '' },
tk: { type: String, default: '' },
@ -924,6 +926,14 @@ export default defineComponent({
// gone — every row is in the rail on every width, same order, always). The ONLY width-driven
// thing left is which row is DISABLED (Big Picture, on mobile — see isDesktopOnly) and
// which row auto-opens (see firstVisibleIndex) — both presentation, neither touches NAV_MODEL.
headingText() { return String(this.cfg.heading || this.heading || '').trim() || 'Deep Research' },
// profile-config `experimental: false` (or "hidden") hides the Experimental folder: no discovery, no
// rows, and a tab= request for an experimental map falls back to the first visible tab. OFF only on
// request, so every other host keeps the folder exactly as before.
showExperimental() {
const v = this.cfg.experimental
return !(v === false || v === 'false' || v === 'hidden' || v === 'off')
},
navGroups() {
const byId = Object.fromEntries(this.tabs.map(t => [t.id, t]))
// ONE `seen` set threaded across ALL groups (not per-group): the rail must hold one node per tab
@ -954,6 +964,7 @@ export default defineComponent({
// The Experimental folder is not authored — it is FILLED with every discovered tab (any
// built bundle no curated section placed). This is the one group whose rows come from the
// manifest rather than NAV_MODEL, which is what makes a new plugin appear by itself.
if (g.key === 'experimental' && !this.showExperimental) return { key: g.key, rows: [] }
if (g.key === 'experimental') {
// Discovered rows go through the SAME de-dup gate as curated ones. Belt-and-braces: a
// discovered bundle should already be excluded by curatedBundles()/NOT_EXPERIMENTAL, but
@ -1262,7 +1273,7 @@ export default defineComponent({
kept.push(t)
}
const have = new Set(kept.map(t => t.id))
for (const d of experimentalTabsFromManifest(m)) {
if (this.showExperimental) for (const d of experimentalTabsFromManifest(m)) {
if (have.has(d.id)) continue
kept.push({ ...d, resolved: true, mounted: false, state: 'idle', error: '' })
}

View file

@ -35,7 +35,7 @@
with no page reload; each map tab loads lazily on first open.</p>
</div>
<div class="frame">
<doxa-maps-spa id="dms" title="DX-Maps"></doxa-maps-spa>
<doxa-maps-spa id="dms" heading="Deep Research"></doxa-maps-spa>
</div>
</div>