From 544ffed652618d5357bbc7603fd6be07df03db72 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 11:08:33 +0000 Subject: [PATCH 1/2] 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. --- .../posterverse/scripts/check-posterverse-shelf.mjs | 6 +++++- plugin-designs/posterverse/src/tabs.js | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs b/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs index 922d007c2..b87e55992 100644 --- a/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs +++ b/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs @@ -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/], diff --git a/plugin-designs/posterverse/src/tabs.js b/plugin-designs/posterverse/src/tabs.js index c251b6605..97966b7c4 100644 --- a/plugin-designs/posterverse/src/tabs.js +++ b/plugin-designs/posterverse/src/tabs.js @@ -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. From 3c50c14ec19d3badea66b476642897469da79d1d Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 11:09:34 +0000 Subject: [PATCH 2/2] Rebuild posterverse for the open Experimental folder, and regenerate the tree BUNDLE=posterverse vite build, then bun run tree and fix:sri. Only the posterverse entry changes in the manifest (its integrity). --- public/dx-maps/doxa-maps-spa/manifest.json | 4 ++-- public/dx-maps/manifest.json | 4 ++-- public/dx-maps/posterverse/posterverse.js | 2 +- public/dx-maps/posterverse/posterverse/app/index.html | 2 +- public/dx-maps/posterverse/posterverse/index.html | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/dx-maps/doxa-maps-spa/manifest.json b/public/dx-maps/doxa-maps-spa/manifest.json index aa80bbdb6..8a69bc84e 100644 --- a/public/dx-maps/doxa-maps-spa/manifest.json +++ b/public/dx-maps/doxa-maps-spa/manifest.json @@ -1345,7 +1345,7 @@ "bundle": "posterverse", "scriptUrl": "./posterverse/posterverse.js", "output": "dx-maps/posterverse/posterverse.js", - "integrity": "sha384-ymAlpF3AiStPvnMzBJXPb3e5cBzsnNEGAlcy8Q+FwJhFrT5McyPEjPHFLjuuXWTn", + "integrity": "sha384-Eu6xYVd6sm1N+Jmlt9wMiWk/f3TdS/KyyTmkKu6ClKdwwFzRGenJTXpLGgFxGHrV", "elements": [ "posterverse-app" ], @@ -1371,7 +1371,7 @@ "scriptUrl": "./posterverse/posterverse.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" }, "instances": [ { diff --git a/public/dx-maps/manifest.json b/public/dx-maps/manifest.json index aa80bbdb6..8a69bc84e 100644 --- a/public/dx-maps/manifest.json +++ b/public/dx-maps/manifest.json @@ -1345,7 +1345,7 @@ "bundle": "posterverse", "scriptUrl": "./posterverse/posterverse.js", "output": "dx-maps/posterverse/posterverse.js", - "integrity": "sha384-ymAlpF3AiStPvnMzBJXPb3e5cBzsnNEGAlcy8Q+FwJhFrT5McyPEjPHFLjuuXWTn", + "integrity": "sha384-Eu6xYVd6sm1N+Jmlt9wMiWk/f3TdS/KyyTmkKu6ClKdwwFzRGenJTXpLGgFxGHrV", "elements": [ "posterverse-app" ], @@ -1371,7 +1371,7 @@ "scriptUrl": "./posterverse/posterverse.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" }, "instances": [ { diff --git a/public/dx-maps/posterverse/posterverse.js b/public/dx-maps/posterverse/posterverse.js index be01bae6e..2c6ec472c 100644 --- a/public/dx-maps/posterverse/posterverse.js +++ b/public/dx-maps/posterverse/posterverse.js @@ -160,4 +160,4 @@ @media (prefers-reduced-motion: reduce) { .vtl-nav, .vtl-collapse-ic, .vtl-tab, .vtl-tier, .vtl-pbar, .vtl-phone-menu, .vtl-rail-end, .vtl-scrim { transition: none !important; animation: none !important; } } -`,Fl=nn({name:"VerticalTabsLayout",components:{BackToTopButton:ba},props:{active:{type:String,default:""},title:{type:String,default:""},items:{type:Array,default:()=>[]},groups:{type:Array,default:()=>[]},navLabel:{type:String,default:"Sections"},labels:{type:Object,default:()=>({})},initialNavOpen:{type:Boolean,default:!0},header:{type:Boolean,default:!0},initialRailCollapsed:{type:Boolean,default:!1},homeHref:{type:String,default:""},homeLabel:{type:String,default:""},shellMode:{type:String,default:"auto"}},emits:["update:active"],setup(){return wl(Cl,"vertical-tabs-layout"),{T:Ol}},data(){const e=(()=>{try{return typeof window<"u"&&!!window.matchMedia&&window.matchMedia("(max-width: 760px)").matches}catch{return!1}})();return{navOpen:this.initialNavOpen&&!e,railCollapsed:e?!1:this.initialRailCollapsed,_tabEls:{},folderOverride:{},narrow:e,_mql:null,_onMedia:null,activatedKeys:{},hostState:{},hostError:{},_hostSlots:{},_hostMounted:{},hostEls:{},mode:"app"}},computed:{phoneBarShown(){return this.narrow&&!this.header},railEndShown(){return!this.narrow&&!this.header},activeHostEl(){return this.hostEls[this.active]||null},railShown(){return this.narrow?this.navOpen:!0},homeLink(){const e=String(this.homeHref||"").trim();return!e||/^(javascript|data|vbscript):/i.test(e.replace(/[\u0000- ]/g,""))?"":e},homeText(){return this.homeLabel||this.label("home")},allRows(){if(this.groups&&this.groups.length){const e=[];for(const t of this.groups)for(const o of t.rows||[])e.push(o);return e}return this.items},orderedKeys(){return this.allRows.map(e=>e.key)},elementRows(){return this.allRows.filter(e=>e&&e.element)},mountedElementRows(){return this.elementRows.filter(e=>this.activatedKeys[e.key])}},watch:{shellMode(){this.resolveShellMode()},active:{immediate:!0,handler(e){this.activateElement(e)}}},mounted(){this.resolveShellMode();try{window.matchMedia&&(this._mql=window.matchMedia("(max-width: 760px)"),this.narrow=this._mql.matches,this.reconcileForWidth(),this._onMedia=e=>{this.narrow=e.matches,this.reconcileForWidth()},this._mql.addEventListener?this._mql.addEventListener("change",this._onMedia):this._mql.addListener&&this._mql.addListener(this._onMedia))}catch{}this.$nextTick(()=>this.activateElement(this.active))},beforeUnmount(){try{this._mql&&this._onMedia&&(this._mql.removeEventListener?this._mql.removeEventListener("change",this._onMedia):this._mql.removeListener&&this._mql.removeListener(this._onMedia))}catch{}this._mql=null,this._onMedia=null},methods:{resolveShellMode(){const e=o=>o==="web"||o==="app"?o:null;let t=e(this.shellMode);if(!t)try{const o=this.$el&&this.$el.getRootNode?this.$el.getRootNode():null,n=o&&o.host;t=e(n&&n.getAttribute?n.getAttribute("shell-mode"):null)}catch{}if(!t)try{const o=window.matchMedia&&window.matchMedia("(display-mode: standalone)").matches||navigator.standalone===!0;t=window.Capacitor||o||window.MAP_OWNS_PAGE===!0?"app":"web"}catch{t="app"}this.mode=t},registerTab(e,t){t&&(this._tabEls[e]=t)},isNarrow(){return this.narrow},reconcileForWidth(){this.narrow?(this.navOpen=!1,this.railCollapsed=!1):this.navOpen=!0},label(e){const t={toggleList:"Toggle list",openViews:"Open the list of views",expandList:"Expand list",collapseList:"Collapse list",collapse:"Collapse",home:"Back to homepage"};return this.labels&&this.labels[e]||t[e]},expandRail(){!this.narrow&&this.railCollapsed&&(this.railCollapsed=!1)},toggleRail(){this.narrow?this.navOpen=!this.navOpen:this.railCollapsed=!this.railCollapsed},setHostSlot(e,t){t&&(this._hostSlots[e]=t,this.$nextTick(()=>this.mountHostElement(e)))},activateElement(e){!e||!this.elementRows.find(o=>o.key===e)||(this.activatedKeys[e]||(this.activatedKeys={...this.activatedKeys,[e]:!0},this.$nextTick(()=>this.watchContextLoss(e)),this.hostState={...this.hostState,[e]:"loading"}),this.$nextTick(()=>this.mountHostElement(e)))},deepCanvases(e,t=[]){if(!e)return t;for(const o of e.querySelectorAll("*"))o.tagName==="CANVAS"&&t.push(o),o.shadowRoot&&this.deepCanvases(o.shadowRoot,t);return t},watchContextLoss(e){const t=this._hostSlots[e];if(t)for(const o of this.deepCanvases(t))o.__vtlLossBound||(o.__vtlLossBound=!0,o.addEventListener("webglcontextlost",()=>{this.hostState={...this.hostState,[e]:"lost"}},{once:!0}))},reloadHostElement(e){const t=this._hostSlots[e];t&&(t.innerHTML=""),this._hostMounted[e]=!1,this.hostState={...this.hostState,[e]:"loading"},this.$nextTick(()=>this.mountHostElement(e))},mountHostElement(e){if(this._hostMounted[e])return;const t=this.elementRows.find(n=>n.key===e),o=this._hostSlots[e];!t||!o||(this._hostMounted[e]=!0,this.hostState={...this.hostState,[e]:"loading"},Al(t.src).then(()=>Pl(t.element)).then(()=>{Tl(t.element,t.src),o.innerHTML="";const n=document.createElement(t.element),s=t.attrs||{};for(const a in s){const i=s[a],r=i!=null&&typeof i=="object"?JSON.stringify(i):String(i);try{n[a]=i}catch{}try{n.setAttribute(a,r)}catch{}}n.style.cssText="display:block;position:absolute;inset:0;width:100%;height:100%;",o.appendChild(n);for(const a of[0,250,1500])setTimeout(()=>this.watchContextLoss(e),a);this.hostState={...this.hostState,[e]:"ready"}}).catch(n=>{this._hostMounted[e]=!1,this.hostState={...this.hostState,[e]:"error"},this.hostError={...this.hostError,[e]:n&&n.message||String(n)}}))},iconSvg(e){return e?Sa(e):""},initial(e){const t=(e||"").trim();return t?t.charAt(0).toUpperCase():"•"},isFolderClosed(e){const t=this.folderOverride[e.key];return t!=null?!t:e.open!==!0},toggleFolder(e){const t=this.folderOverride[e],o=(this.groups||[]).find(s=>s.key===e),n=t??(o&&o.open===!0);this.folderOverride={...this.folderOverride,[e]:!n}},pick(e){this.$emit("update:active",e),this.narrow&&(this.navOpen=!1)},onKey(e){const t=this.orderedKeys;if(!t.length)return;const o=t.indexOf(this.active);let n=-1;if(e.key==="ArrowDown"||e.key==="ArrowRight")n=(o+1)%t.length;else if(e.key==="ArrowUp"||e.key==="ArrowLeft")n=(o-1+t.length)%t.length;else if(e.key==="Home")n=0;else if(e.key==="End")n=t.length-1;else return;e.preventDefault();const s=t[n];this.pick(s),this.$nextTick(()=>{const a=this._tabEls[s];a&&a.focus&&a.focus()})}}}),Il={key:0,class:"vtl-top"},Nl=["aria-expanded","aria-label"],El={class:"vtl-brand"},Rl={class:"vtl-title"},Wl={class:"vtl-meta"},Dl=["aria-expanded","aria-label"],zl={class:"vtl-pbar-end"},Hl={class:"vtl-body"},Bl=["aria-label","aria-hidden","role","aria-orientation"],Ul=["href","aria-label","title"],jl=["innerHTML"],Vl={class:"vtl-home-tx"},ql=["aria-expanded","aria-label"],Gl=["innerHTML"],Kl={class:"vtl-collapse-tx"},Jl=["aria-expanded","onClick"],Xl={key:0,class:"vtl-cap"},Zl={class:"vtl-tl"},Yl={key:1,class:"vtl-td"},Ql=["innerHTML"],ec={key:1,class:"vtl-tier"},tc={key:0,class:"vtl-cap"},oc={class:"vtl-tl"},nc={key:1,class:"vtl-td"},sc={class:"vtl-rows"},ac=["aria-selected","aria-disabled","tabindex","onClick"],rc=["innerHTML"],ic={key:1,class:"vtl-tab-emoji","aria-hidden":"true"},lc={key:2,class:"vtl-tab-fallback","aria-hidden":"true"},cc={class:"vtl-tab-text"},dc={class:"vtl-tab-label"},pc={key:0,class:"vtl-tab-badge"},uc={key:0,class:"vtl-tab-sub"},fc=["innerHTML"],gc=["aria-selected","aria-disabled","tabindex","onClick"],hc=["innerHTML"],$c={key:1,class:"vtl-tab-emoji","aria-hidden":"true"},mc={key:2,class:"vtl-tab-fallback","aria-hidden":"true"},_c={class:"vtl-tab-text"},bc={class:"vtl-tab-label"},vc={key:0,class:"vtl-tab-sub"},yc={key:4,class:"vtl-rail-end"},wc={class:"vtl-main"},xc={class:"vtl-content"},kc=["hidden"],Tc={key:0,class:"vtl-host-hint"},Sc={key:1,class:"vtl-host-hint"},Mc=["onClick"],Lc={key:2,class:"vtl-host-hint err"};function Oc(e,t,o,n,s,a){const i=fo("BackToTopButton");return M(),C("div",{class:Te(["vtl",{"nav-open":e.navOpen,"rail-collapsed":e.railCollapsed,"no-header":!e.header,"has-phone-bar":e.phoneBarShown}])},[e.header?(M(),C("header",Il,[I("button",{class:"vtl-menu",type:"button","aria-expanded":String(e.navOpen),onClick:t[0]||(t[0]=r=>e.navOpen=!e.navOpen),"aria-label":e.label("toggleList")},"☰",8,Nl),I("span",El,[tt(e.$slots,"brand")]),I("b",Rl,E(e.title),1),I("span",Wl,[tt(e.$slots,"meta")])])):ne("",!0),e.phoneBarShown?(M(),C("div",{key:1,class:Te(["vtl-pbar",{"is-web":e.mode==="web"}])},[I("button",{class:"vtl-phone-menu",type:"button","aria-expanded":String(e.navOpen),onClick:t[1]||(t[1]=r=>e.navOpen=!e.navOpen),"aria-label":e.label("toggleList")},"☰",8,Dl),I("span",zl,[tt(e.$slots,"phone-end")])],2)):ne("",!0),e.narrow?(M(),Pt(i,{key:2,target:e.activeHostEl,labels:{backToTop:e.T("actions.backToTop","Back to top")}},null,8,["target","labels"])):ne("",!0),I("div",Hl,[I("nav",{class:Te(["vtl-nav",{"has-rail-end":e.railEndShown&&!!e.$slots["rail-end"]}]),"aria-label":e.navLabel,"aria-hidden":String(!e.railShown),role:e.$slots.rail?null:"tablist","aria-orientation":e.$slots.rail?null:"vertical"},[e.homeLink?(M(),C("a",{key:0,class:"vtl-home",href:e.homeLink,target:"_top","aria-label":e.homeText,title:e.railCollapsed&&!e.narrow?e.homeText:null},[I("span",{class:"vtl-home-ic","aria-hidden":"true",innerHTML:e.iconSvg("home")},null,8,jl),I("span",Vl,E(e.homeText),1)],8,Ul)):ne("",!0),I("button",{type:"button",class:"vtl-collapse","aria-expanded":String(!e.railCollapsed),"aria-label":e.railCollapsed?e.label("expandList"):e.label("collapseList"),onClick:t[2]||(t[2]=(...r)=>e.toggleRail&&e.toggleRail(...r))},[I("span",{class:"vtl-collapse-ic","aria-hidden":"true",innerHTML:e.iconSvg("chevron")},null,8,Gl),I("span",Kl,E(e.label("collapse")),1)],8,ql),e.$slots.rail?tt(e.$slots,"rail",{collapsed:e.railCollapsed&&!e.narrow,expand:e.expandRail,pick:e.pick},void 0,void 0,1):e.groups&&e.groups.length?(M(!0),C(ee,{key:2},ft(e.groups,r=>(M(),C("div",{class:"vtl-grp",key:r.key},[r.folder?(M(),C("button",{key:0,type:"button",class:"vtl-tier vtl-tier-btn","aria-expanded":String(!e.isFolderClosed(r)),onClick:l=>e.toggleFolder(r.key)},[r.badge?(M(),C("span",Xl,E(r.badge),1)):ne("",!0),I("span",Zl,E(r.label),1),r.count!=null?(M(),C("span",Yl,E(r.count),1)):ne("",!0),I("span",{class:Te(["vtl-chev",{open:!e.isFolderClosed(r)}]),"aria-hidden":"true",innerHTML:e.iconSvg("chevron")},null,10,Ql)],8,Jl)):(M(),C("div",ec,[r.badge?(M(),C("span",tc,E(r.badge),1)):ne("",!0),I("span",oc,E(r.label),1),r.count!=null?(M(),C("span",nc,E(r.count),1)):ne("",!0)])),en(I("div",sc,[(M(!0),C(ee,null,ft(r.rows,l=>(M(),C("button",{key:l.key,type:"button",role:"tab",class:Te(["vtl-tab",{active:l.key===e.active,disabled:l.disabled}]),"aria-selected":String(l.key===e.active),"aria-disabled":l.disabled?"true":null,tabindex:l.key===e.active?0:-1,ref_for:!0,ref:d=>e.registerTab(l.key,d),onClick:d=>e.pick(l.key),onKeydown:t[3]||(t[3]=d=>e.onKey(d))},[l.icon?(M(),C("span",{key:0,class:"vtl-tab-ic","aria-hidden":"true",innerHTML:e.iconSvg(l.icon)},null,8,rc)):l.emoji?(M(),C("span",ic,E(l.emoji),1)):(M(),C("span",lc,E(e.initial(l.label)),1)),I("span",cc,[I("span",dc,[$t(E(l.label),1),l.badge?(M(),C("span",pc,E(l.badge),1)):ne("",!0)]),l.sub?(M(),C("span",uc,[I("span",{innerHTML:l.sub},null,8,fc)])):ne("",!0)])],42,ac))),128))],512),[[bn,!r.folder||!e.isFolderClosed(r)]])]))),128)):(M(!0),C(ee,{key:3},ft(e.items,r=>(M(),C("button",{key:r.key,type:"button",role:"tab",class:Te(["vtl-tab",{active:r.key===e.active,disabled:r.disabled}]),"aria-selected":String(r.key===e.active),"aria-disabled":r.disabled?"true":null,tabindex:r.key===e.active?0:-1,ref_for:!0,ref:l=>e.registerTab(r.key,l),onClick:l=>e.pick(r.key),onKeydown:t[4]||(t[4]=l=>e.onKey(l))},[r.icon?(M(),C("span",{key:0,class:"vtl-tab-ic","aria-hidden":"true",innerHTML:e.iconSvg(r.icon)},null,8,hc)):r.emoji?(M(),C("span",$c,E(r.emoji),1)):(M(),C("span",mc,E(e.initial(r.label)),1)),I("span",_c,[I("span",bc,E(r.label),1),r.sub?(M(),C("span",vc,E(r.sub),1)):ne("",!0)])],42,gc))),128)),e.railEndShown&&e.$slots["rail-end"]?(M(),C("div",yc,[tt(e.$slots,"rail-end",{collapsed:e.railCollapsed})])):ne("",!0)],10,Bl),I("main",wc,[e.header?tt(e.$slots,"toolbar",{},void 0,void 0,0):ne("",!0),I("div",xc,[(M(!0),C(ee,null,ft(e.mountedElementRows,r=>en((M(),C("section",{key:r.key,class:"vtl-host",hidden:r.key!==e.active,ref_for:!0,ref:l=>{l?e.hostEls[r.key]=l:delete e.hostEls[r.key]}},[I("div",{class:"vtl-host-slot",ref_for:!0,ref:l=>e.setHostSlot(r.key,l)},null,512),e.hostState[r.key]==="loading"?(M(),C("div",Tc,E(e.T("messages.loadingNamed","Loading {name}…").replace("{name}",r.label)),1)):e.hostState[r.key]==="lost"?(M(),C("div",Sc,[$t(E(e.T("messages.mapContextLost","This map was unloaded to free graphics memory."))+" ",1),I("button",{type:"button",class:"vtl-host-reload",onClick:l=>e.reloadHostElement(r.key)},E(e.T("buttons.reloadMap","Reload Map")),9,Mc)])):e.hostState[r.key]==="error"?(M(),C("div",Lc,[$t(E(e.T("messages.couldNotLoadNamed","Could not load {name}.").replace("{name}",r.label)),1),t[5]||(t[5]=I("br",null,null,-1)),I("small",null,E(e.hostError[r.key]),1)])):ne("",!0)],8,kc)),[[bn,r.key===e.active]])),128)),tt(e.$slots,"default")])])])],2)}const Ac=xo(Fl,[["render",Oc],["styles",[Ll]]]),Pa=[{code:"en",name:"English",nativeName:"English",flag:"🇺🇸"},{code:"es",name:"Spanish",nativeName:"Español",flag:"🇪🇸"},{code:"fr",name:"French",nativeName:"Français",flag:"🇫🇷"},{code:"pt",name:"Portuguese",nativeName:"Português",flag:"🇵🇹"},{code:"ar",name:"Arabic",nativeName:"العربية",flag:"🇸🇦",dir:"rtl"},{code:"ru",name:"Russian",nativeName:"Русский",flag:"🇷🇺"},{code:"de",name:"German",nativeName:"Deutsch",flag:"🇩🇪",hideFromSwitcher:!0},{code:"hi",name:"Hindi",nativeName:"हिन्दी",flag:"🇮🇳",hideFromSwitcher:!0},{code:"it",name:"Italian",nativeName:"Italiano",flag:"🇮🇹",hideFromSwitcher:!0},{code:"ro",name:"Romanian",nativeName:"Română",flag:"🇷🇴",hideFromSwitcher:!0},{code:"zh",name:"Chinese",nativeName:"中文",flag:"🇨🇳",hideFromSwitcher:!0}],Pc=Pa.filter(e=>!e.hideFromSwitcher);function Ca(e){return Pa.find(t=>t.code===e)}const Cc="doxa-maps:locale";function Fc(e){try{localStorage.setItem(Cc,e)}catch{}}const Ic="doxa-language-request";function Nc(e){try{const t=e&&e.getRootNode&&e.getRootNode();if(t&&t.host)return t.host}catch{}return e||null}function Ec(e,t){const o=Nc(e);return!o||typeof o.dispatchEvent!="function"?!0:o.dispatchEvent(new CustomEvent(Ic,{detail:{language:t},bubbles:!0,composed:!0,cancelable:!0}))}function Rc(e,t=typeof window<"u"?window:null){try{if(!t||t.MAP_OWNS_PAGE!==!0||!t.history||!t.location)return!1;const o=new URL(t.location.href);return o.searchParams.set("lang",e),t.history.replaceState(t.history.state,"",o.toString()),!0}catch{return!1}}const Wc=".slm[data-v-12760774]{position:relative;display:inline-flex;align-items:center;min-height:44px;max-width:100%;box-sizing:border-box;border-radius:8px;color:#3b463d}.slm-face[data-v-12760774]{display:inline-flex;align-items:center;gap:6px;padding-inline:10px;min-width:0;font-size:13px;font-weight:500;line-height:1.2}.slm-ic[data-v-12760774]{flex:0 0 auto;display:inline-flex;color:var(--vtl-muted, #6d766e)}.slm-ic[data-v-12760774] svg{width:18px;height:18px}.slm-name[data-v-12760774]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.slm-code[data-v-12760774]{font-weight:600;font-size:12px;letter-spacing:.03em}.slm-caret[data-v-12760774]{flex:0 0 auto;color:var(--vtl-muted, #6d766e);font-size:11px}.slm.collapsed .slm-face[data-v-12760774]{flex-direction:column;gap:2px;padding-inline:4px}.slm-select[data-v-12760774]{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;margin:0;border:0;cursor:pointer;font-size:16px}.slm[data-v-12760774]:hover{background:var(--vtl-accented, #d1d4cd)}.slm[data-v-12760774]:focus-within{outline:2px solid var(--vtl-accent, #92b195);outline-offset:-2px}@media (prefers-reduced-motion: reduce){.slm[data-v-12760774]{transition:none}}",Dc={class:"slm-face","aria-hidden":"true"},zc=["innerHTML"],Hc={key:0,class:"slm-code"},Bc=["lang","dir"],Uc={key:2,class:"slm-caret"},jc=["value","aria-label","title"],Vc=["value","lang","dir"],qc=xo({__name:"ShellLanguageMenu",props:{current:{type:String,default:"en"},collapsed:{type:Boolean,default:!1}},emits:["switch"],setup(e,{emit:t}){const o=e,n=t,s=Et(()=>{const d=Pc.slice();if(o.current&&!d.some(p=>p.code===o.current)){const p=Ca(o.current);p&&d.push(p)}return d}),a=Et(()=>Ca(o.current)||{code:o.current,nativeName:o.current}),i=Et(()=>ka("controls.language",o.current)||"Language"),r=Sa("globe");function l(d){const p=d.target,f=p.value;!f||f===o.current||(Ec(p,f)?(n("switch",f),Rc(f)):p.value=o.current)}return(d,p)=>(M(),C("span",{class:Te(["slm",{collapsed:e.collapsed}])},[I("span",Dc,[I("span",{class:"slm-ic",innerHTML:Zo(r)},null,8,zc),e.collapsed?(M(),C("span",Hc,E(String(e.current).toUpperCase()),1)):(M(),C("span",{key:1,class:"slm-name",lang:a.value.code,dir:a.value.dir||null},E(a.value.nativeName),9,Bc)),e.collapsed?ne("",!0):(M(),C("span",Uc,"▾"))]),I("select",{class:"slm-select",value:e.current,"aria-label":i.value,title:i.value,onChange:l},[(M(!0),C(ee,null,ft(s.value,f=>(M(),C("option",{key:f.code,value:f.code,lang:f.code,dir:f.dir||null},E(f.nativeName),9,Vc))),128))],40,jc)],2))}},[["styles",[Wc]],["__scopeId","data-v-12760774"]]),ko={en:{"sec.posters":"Posters","sec.experimental":"Experimental","tab.upg-100":"UPG 100 List Posters","sub.upg-100":"my unreached list + posters","tab.country-posters":"Country Posters","sub.country-posters":"a poster for every country","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",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.",backToTop:"Back to top",home:"Back to homepage",toggleList:"Toggle list",openViews:"Open the list of views",expandList:"Expand list",collapseList:"Collapse list",collapse:"Collapse"},es:{"sec.posters":"Carteles","sec.experimental":"Experimental","tab.upg-100":"Carteles de la lista UPG 100","sub.upg-100":"mi lista de no alcanzados + carteles","tab.country-posters":"Carteles por país","sub.country-posters":"un cartel para cada país","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",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.",backToTop:"Volver arriba",home:"Volver a la página de inicio",toggleList:"Mostrar u ocultar la lista",openViews:"Abrir la lista de vistas",expandList:"Expandir la lista",collapseList:"Contraer la lista",collapse:"Contraer"},fr:{"sec.posters":"Affiches","sec.experimental":"Expérimental","tab.upg-100":"Affiches de la liste UPG 100","sub.upg-100":"ma liste des non atteints + affiches","tab.country-posters":"Affiches par pays","sub.country-posters":"une affiche pour chaque pays","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",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.",backToTop:"Retour en haut",home:"Retour à l’accueil",toggleList:"Afficher ou masquer la liste",openViews:"Ouvrir la liste des vues",expandList:"Déplier la liste",collapseList:"Replier la liste",collapse:"Replier"},de:{"sec.posters":"Poster","sec.experimental":"Experimentell","tab.upg-100":"Poster der UPG 100 Liste","sub.upg-100":"meine Liste der Unerreichten + Poster","tab.country-posters":"Länderposter","sub.country-posters":"ein Poster für jedes Land","tab.poster-design":"Postergestaltung","sub.poster-design":"alle Posterstile und -größen","tab.wall-of-people-groups":"Wand der Volksgruppen","tab.bible-posters":"Bibelposter",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.",backToTop:"Nach oben",home:"Zurück zur Startseite",toggleList:"Liste ein-/ausblenden",openViews:"Ansichtsliste öffnen",expandList:"Liste ausklappen",collapseList:"Liste einklappen",collapse:"Einklappen"},pt:{"sec.posters":"Cartazes","sec.experimental":"Experimental","tab.upg-100":"Cartazes da lista UPG 100","sub.upg-100":"minha lista de não alcançados + cartazes","tab.country-posters":"Cartazes por país","sub.country-posters":"um cartaz para cada país","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",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.",backToTop:"Voltar ao topo",home:"Voltar à página inicial",toggleList:"Mostrar ou ocultar a lista",openViews:"Abrir a lista de visualizações",expandList:"Expandir a lista",collapseList:"Recolher a lista",collapse:"Recolher"},it:{"sec.posters":"Poster","sec.experimental":"Sperimentale","tab.upg-100":"Poster della lista UPG 100","sub.upg-100":"la mia lista dei non raggiunti + poster","tab.country-posters":"Poster per paese","sub.country-posters":"un poster per ogni paese","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",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.",backToTop:"Torna su",home:"Torna alla home page",toggleList:"Mostra o nascondi l’elenco",openViews:"Apri l’elenco delle viste",expandList:"Espandi l’elenco",collapseList:"Comprimi l’elenco",collapse:"Comprimi"},ro:{"sec.posters":"Afișe","sec.experimental":"Experimental","tab.upg-100":"Afișe din lista UPG 100","sub.upg-100":"lista mea de neatinși + afișe","tab.country-posters":"Afișe pe țări","sub.country-posters":"un afiș pentru fiecare țară","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",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.",backToTop:"Sus",home:"Înapoi la pagina principală",toggleList:"Afișează sau ascunde lista",openViews:"Deschide lista de vizualizări",expandList:"Extinde lista",collapseList:"Restrânge lista",collapse:"Restrânge"},ru:{"sec.posters":"Плакаты","sec.experimental":"Экспериментальное","tab.upg-100":"Плакаты списка UPG 100","sub.upg-100":"мой список недостигнутых + плакаты","tab.country-posters":"Плакаты по странам","sub.country-posters":"плакат для каждой страны","tab.poster-design":"Дизайн плакатов","sub.poster-design":"все стили и размеры плакатов","tab.wall-of-people-groups":"Стена народов","tab.bible-posters":"Библейские плакаты",experimentalSub:"экспериментальная карта",lab:"бета",loading:"Загрузка: {label}…",loadFailed:"Не удалось загрузить: {label}.",manifestHint:"Эта вкладка собирается из manifest.json — соберите дерево или разместите собранное дерево, чтобы загрузить её.",backToTop:"Наверх",home:"На главную страницу",toggleList:"Показать или скрыть список",openViews:"Открыть список представлений",expandList:"Развернуть список",collapseList:"Свернуть список",collapse:"Свернуть"},ar:{"sec.posters":"ملصقات","sec.experimental":"تجريبي","tab.upg-100":"ملصقات قائمة UPG 100","sub.upg-100":"قائمتي لغير المُبشَّرين + ملصقات","tab.country-posters":"ملصقات الدول","sub.country-posters":"ملصق لكل دولة","tab.poster-design":"تصميم الملصقات","sub.poster-design":"كل أنماط الملصقات وأحجامها","tab.wall-of-people-groups":"جدار الشعوب","tab.bible-posters":"ملصقات الكتاب المقدس",experimentalSub:"خريطة تجريبية",lab:"تجريبي",loading:"جارٍ تحميل {label}…",loadFailed:"تعذّر تحميل {label}.",manifestHint:"تُبنى علامة التبويب هذه من manifest.json — ابنِ الشجرة أو قدّم الشجرة المبنية لتحميلها.",backToTop:"إلى الأعلى",home:"العودة إلى الصفحة الرئيسية",toggleList:"إظهار القائمة أو إخفاؤها",openViews:"فتح قائمة العروض",expandList:"توسيع القائمة",collapseList:"طي القائمة",collapse:"طي"},hi:{"sec.posters":"पोस्टर","sec.experimental":"प्रायोगिक","tab.upg-100":"UPG 100 सूची पोस्टर","sub.upg-100":"मेरी अप्राप्त सूची + पोस्टर","tab.country-posters":"देश पोस्टर","sub.country-posters":"हर देश के लिए एक पोस्टर","tab.poster-design":"पोस्टर डिज़ाइन","sub.poster-design":"हर पोस्टर शैली और आकार","tab.wall-of-people-groups":"जनसमूहों की दीवार","tab.bible-posters":"बाइबल पोस्टर",experimentalSub:"प्रायोगिक मानचित्र",lab:"बीटा",loading:"{label} लोड हो रहा है…",loadFailed:"{label} लोड नहीं हो सका।",manifestHint:"यह टैब manifest.json से बनता है — इसे लोड करने के लिए ट्री बनाएँ या बना हुआ ट्री सर्व करें।",backToTop:"ऊपर जाएँ",home:"होमपेज पर वापस जाएँ",toggleList:"सूची दिखाएँ या छिपाएँ",openViews:"दृश्यों की सूची खोलें",expandList:"सूची फैलाएँ",collapseList:"सूची संक्षिप्त करें",collapse:"संक्षिप्त करें"},zh:{"sec.posters":"海报","sec.experimental":"实验性","tab.upg-100":"UPG 100 名单海报","sub.upg-100":"我的未得之民名单 + 海报","tab.country-posters":"国家海报","sub.country-posters":"每个国家一张海报","tab.poster-design":"海报设计","sub.poster-design":"所有海报样式与尺寸","tab.wall-of-people-groups":"民族之墙","tab.bible-posters":"圣经海报",experimentalSub:"实验性地图",lab:"测试版",loading:"正在加载{label}…",loadFailed:"无法加载{label}。",manifestHint:"此标签页由 manifest.json 组成——请构建目录树或提供已构建的目录树以加载它。",backToTop:"回到顶部",home:"返回首页",toggleList:"显示或隐藏列表",openViews:"打开视图列表",expandList:"展开列表",collapseList:"折叠列表",collapse:"折叠"}},Tn=Object.keys(ko);function Gc(e,t,o){let s=(ko[e]||ko.en)[t]??ko.en[t]??t;if(o)for(const a in o)s=s.split("{"+a+"}").join(String(o[a]));return s}const Kc=[{key:"posters",i18n:"sec.posters",icon:"poster"},{key:"experimental",i18n:"sec.experimental",icon:"flask",folder:!0,open:!1}],Fa=[{id:"upg-100",section:"posters",icon:"list",bundle:"my-upg-100-list",profile:"upg-100-mfe"},{id:"country-posters",section:"posters",icon:"map",bundle:"country-posters",profile:"country-posters-mfe"},{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"}],Jc=new Set(["key-cities","posterverse","doxa-maps-spa","plugin-studio"]),Xc=new Set(["my-upg-100-list-map","country-posters-map"]);function Zc(e,t=()=>{}){const o=e&&Array.isArray(e.bundles)?e.bundles:[],n=Object.fromEntries(o.map(a=>[a&&a.bundle,a])),s=[];for(const a of Fa){if(Jc.has(a.bundle))continue;const i=n[a.bundle];if(!i)continue;const r=Array.isArray(i.profiles)?i.profiles:[];let l=r.find(f=>f&&f.profile===a.profile);if(!l){if(l=r.find(f=>f&&f.profile===a.bundle)||r[0],!l)continue;t(`[posterverse] ${a.bundle} has no profile "${a.profile}"; row "${a.id}" opens "${l.profile}" instead`)}const d=l.element||Array.isArray(i.elements)&&i.elements[0]||a.bundle,p=i.scriptUrl||l.scriptUrl||"";p&&s.push({...a,tag:d,scriptUrl:p,profile:l.profile,heavy:Xc.has(d)||!!l.isMap})}return s}const Yc=":host{display:block;position:relative;height:var(--posterverse-height, 85vh);min-height:480px}:host{font-size:16px;line-height:normal;font-weight:400;font-style:normal;font-variant:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;text-align:start;text-indent:0;text-shadow:none;white-space:normal;-webkit-hyphens:manual;hyphens:manual;visibility:visible;cursor:auto}:host([hidden]){display:none}.pv-pane{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;--profile-min-h: 0}.pv-slot{position:relative;min-height:100%}.pv-hint{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;text-align:center;color:#6d766e;font-size:13px;padding:20px}.pv-hint.err{color:#b3261e}.pv-hint small{color:#6d766e}";function Ia(){try{const e=new URLSearchParams(location.search),t=(e.get("lang")||e.get("locale")||"").split("-")[0].toLowerCase();if(Tn.includes(t))return t}catch{}try{const e=(document.documentElement.lang||"").split("-")[0].toLowerCase();if(Tn.includes(e))return e}catch{}return""}const Na=e=>({...e,tag:e.tag||"",scriptUrl:e.scriptUrl||"",heavy:!!e.heavy,mounted:!1,state:"idle",error:""}),Qc=nn({name:"Posterverse",inheritAttrs:!1,components:{VerticalTabsLayout:Ac,BackToTopButton:ba,ShellLanguageMenu:qc},props:{treeBase:{type:String,default:""},profileConfig:{type:[String,Object],default:""},heading:{type:String,default:"Posterverse"},tokenUrl:{type:String,default:""},tk:{type:String,default:""},language:{type:String,default:""},apiBaseUrl:{type:String,default:""},provider:{type:String,default:""},tab:{type:String,default:""},homeHref:{type:String,default:""},homeLabel:{type:String,default:""}},emits:["tab-change"],setup(){return{injectedBase:St("pvTreeBase","")}},data(){return{paneEls:{},activeIndex:0,manifestError:"",manifestBase:"",runtime:{},hostLang:Ia(),localPick:"",pickBase:null,tabs:Fa.filter(e=>!e.provisional).map(Na)}},computed:{cfg(){let e=this.profileConfig;if(typeof e=="string")try{e=e?JSON.parse(e):{}}catch{e={}}return e&&typeof e=="object"?e:{}},base(){const e=String(this.treeBase||this.cfg.treeBase||this.injectedBase||"").trim();return e?e.replace(/\/+$/,"")+"/":""},assetsBase(){const e=String(this.cfg.assetsBase||"").trim();return/^https?:\/\//i.test(e)||e.startsWith("/")?e.replace(/\/+$/,""):this.manifestBase?this.manifestBase.replace(/\/+$/,"")+"/assets":""},headingText(){return String(this.cfg.heading||this.heading||"").trim()||"Posterverse"},hostLanguage(){return String(this.language||this.cfg.language||this.cfg.locale||this.cfg.lang||"").trim()},effectiveLocale(){return this.localPick&&this.hostLanguage===this.pickBase?this.localPick:(this.hostLanguage||this.hostLang||"en").split("-")[0].toLowerCase()},uiLocale(){return Tn.includes(this.effectiveLocale)?this.effectiveLocale:"en"},defaultHomeHref(){return"https://doxa.life"+(this.uiLocale&&this.uiLocale!=="en"?"/"+this.uiLocale:"")},uiDir(){return this.uiLocale==="ar"?"rtl":"ltr"},layoutLabels(){const e={};for(const t of["toggleList","openViews","expandList","collapseList","collapse","home"])e[t]=this.tr(t);return e},effectiveProvider(){const e=String(this.provider||this.cfg.provider||"").trim().toLowerCase();return e==="maplibre"||e==="mapbox"?e:""},activeKey(){const e=this.tabs[this.activeIndex];return e?e.id:""},activePaneEl(){return this.paneEls[this.activeIndex]||null},navGroups(){return Kc.map(e=>({key:e.key,label:this.tr(e.i18n),icon:e.icon,folder:!!e.folder,open:e.open,rows:this.tabs.filter(t=>t.section===e.key).map(t=>({key:t.id,label:this.tabLabel(t),sub:this.tabSub(t),icon:t.icon,badge:e.folder?this.tr("lab"):void 0}))})).filter(e=>e.rows.length)}},watch:{effectiveLocale(){const e=(o,n)=>{try{const s=this._slots&&this._slots[o];s&&(s.innerHTML="")}catch{}n.mounted=!1,n.state="idle",n.error=""};this.tabs.forEach((o,n)=>{o.mounted&&n!==this.activeIndex&&e(n,o)});const t=this.tabs[this.activeIndex];!t||!t.mounted||(e(this.activeIndex,t),this.mountElement(this.activeIndex))},tab(e){e&&this.onSelect(e)},hostLanguage(e){e!==this.pickBase&&(this.localPick="",this.pickBase=null)}},mounted(){this.watchHostLang(),this.select(this.initialIndex()),this.loadManifest()},beforeUnmount(){this._langObs&&(this._langObs.disconnect(),this._langObs=null)},methods:{tr(e,t){return Gc(this.uiLocale,e,t)},setLocale(e){this.pickBase=this.hostLanguage,this.localPick=e,Fc(e)},tabLabel(e){return this.tr("tab."+e.id)},tabSub(e){return e.section==="experimental"?this.tr("experimentalSub"):this.tr("sub."+e.id)},setSlot(e,t){t&&(this._slots=Object.assign(this._slots||{},{[e]:t}))},watchHostLang(){typeof MutationObserver>"u"||typeof document>"u"||(this._langObs=new MutationObserver(()=>{this.hostLang=Ia()}),this._langObs.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]}))},requestedTab(){let e="";try{e=new URLSearchParams(location.search).get("tab")||""}catch{}return String(this.tab||this.cfg.tab||e||"").trim()},initialIndex(){const e=this.tabs.findIndex(t=>t.id===this.requestedTab());return e>=0?e:0},loadManifest(){const e=d=>{try{return new URL(d,location.href).href.replace(/[^/]*$/,"")}catch{return""}},t=this.resolve("manifest.json"),o={url:t,root:e(t)},n={url:this.resolve("doxa-maps-spa/manifest.json"),root:o.root};let s=!1;try{s=new URL(t,location.href).origin!==location.origin}catch{}const a=s?[n,o]:[o,n],i="/public/dx-maps/manifest.json";a.some(d=>d.url===i)||a.push({url:i,root:e(i)});const r=[],l=d=>{if(d>=a.length){this.manifestError="manifest.json not found (tried "+r.join(", ")+")",console.error("[posterverse] "+this.manifestError+" — every tab is composed from it.");return}const{url:p,root:f}=a[d];return r.push(p),fetch(p,{credentials:"same-origin"}).then(w=>{if(!w||!w.ok)throw new Error(p+" → HTTP "+(w?w.status:"?"));return w.json()}).then(w=>{if(!w)throw new Error(p+" → empty");this.manifestError="",this.manifestBase=f||"",this.applyManifest(w)}).catch(()=>l(d+1))};try{l(0)}catch{}},applyManifest(e){this.runtime=e&&e.runtime&&typeof e.runtime=="object"?e.runtime:{},this.applyPageGlobals();const t=this.activeKey;this.tabs=Zc(e,a=>console.warn(a)).map(Na);const o=this.requestedTab(),n=!this._honouredTab&&o?this.tabs.findIndex(a=>a.id===o):-1,s=this.tabs.findIndex(a=>a.id===t);this._honouredTab=!0,this.select(n>=0?n:s>=0?s:0)},onSelect(e){const t=this.tabs.findIndex(o=>o.id===e);t!==-1&&this.select(t)},resolve(e){const t=String(e);if(/^(https?:)?\/\//.test(t)||t.startsWith("/"))return t;const o=t.replace(/^\.\//,"");return this.manifestBase?this.manifestBase.replace(/\/+$/,"")+"/"+o:this.base?this.base.replace(/\/+$/,"")+"/"+o:"../"+o},select(e){const t=this.activeIndex;if(this.activeIndex=e,t!==e&&t>=0){const n=this.tabs[t];n&&n.heavy&&n.mounted&&this.releaseTab(t,n)}const o=this.tabs[e];o&&((t!==e||!this._announced)&&(this._announced=!0,this.$emit("tab-change",{id:o.id,label:this.tabLabel(o)})),o.scriptUrl&&(o.mounted||this.$nextTick(()=>{this.activeIndex===e&&this.mountElement(e)})))},releaseTab(e,t){try{const o=this._slots&&this._slots[e];o&&(o.innerHTML="")}catch{}this._slots&&delete this._slots[e],t.mounted=!1,t.state="idle",t.error=""},childConfig(e){const t={profile:e.profile||e.id,instanceId:"pv-"+e.id};this.effectiveLocale&&(t.locale=this.effectiveLocale);const o=this.tk||this.cfg.tk||this.runtime.token;return o&&(t.tk=o),(this.tokenUrl||this.cfg.tokenUrl)&&(t.tokenUrl=this.tokenUrl||this.cfg.tokenUrl),this.effectiveProvider&&(t.provider=this.effectiveProvider),this.base&&(t.treeBase=this.base),this.assetsBase&&(t.assetsBase=this.assetsBase),t.urlSync=!1,t.mapTitle=this.tabLabel(e),t},applyPageGlobals(){if(typeof window>"u")return;const e=String(this.apiBaseUrl||this.cfg.apiBaseUrl||this.runtime.apiBaseUrl||"").trim();e&&!window.MAP_APP_API_URL&&(window.MAP_APP_API_URL=e.replace(/\/+$/,""));const t=this.tk||this.cfg.tk||this.runtime.token;t&&!window.MAP_TOKEN&&(window.MAP_TOKEN=t),this.effectiveProvider&&!window.MAP_PROVIDER&&(window.MAP_PROVIDER=this.effectiveProvider)},mountElement(e){const t=this.tabs[e];t.mounted=!0,t.state="loading",Aa(this.resolve(t.scriptUrl)).then(()=>Sl(t.tag)).then(()=>{try{if(t.heavy&&this.activeIndex!==e){t.mounted=!1,t.state="idle";return}const o=this._slots&&this._slots[e];if(!o){t.state="error",t.error="no slot";return}o.innerHTML="";const n=document.createElement(t.tag);n.setAttribute("profile-config",JSON.stringify(this.childConfig(t))),this.base&&n.setAttribute("tree-base",this.base.replace(/\/+$/,"")),n.style.cssText="display:block;position:absolute;inset:0;width:100%;height:100%;min-height:0;",o.appendChild(n),t.state="ready"}catch(o){t.state="error",t.error="mount failed: "+(o&&o.message||String(o))}}).catch(o=>{t.state="error",t.error=o&&o.message||String(o)})}}}),ed=["hidden"],td={key:0,class:"pv-hint"},od={key:1,class:"pv-hint err"},nd={key:2,class:"pv-hint err"};function sd(e,t,o,n,s,a){const i=fo("ShellLanguageMenu"),r=fo("BackToTopButton"),l=fo("VerticalTabsLayout");return M(),Pt(l,{dir:e.uiDir,lang:e.uiLocale,labels:e.layoutLabels,title:e.headingText,"nav-label":e.tr("sec.posters"),header:!1,"home-href":e.homeHref||e.cfg.homeHref||e.defaultHomeHref,"home-label":e.homeLabel||e.cfg.homeLabel||"",groups:e.navGroups,active:e.activeKey,"onUpdate:active":e.onSelect},{"phone-end":io(()=>[ge(i,{current:e.uiLocale,onSwitch:e.setLocale},null,8,["current","onSwitch"])]),"rail-end":io(({collapsed:d})=>[ge(i,{current:e.uiLocale,collapsed:d,onSwitch:e.setLocale},null,8,["current","collapsed","onSwitch"])]),default:io(()=>[(M(!0),C(ee,null,ft(e.tabs,(d,p)=>en((M(),C("section",{key:d.id,class:"pv-pane",ref_for:!0,ref:f=>{f?e.paneEls[p]=f:delete e.paneEls[p]},hidden:p!==e.activeIndex},[!d.heavy||p===e.activeIndex?(M(),C(ee,{key:0},[I("div",{class:"pv-slot",ref_for:!0,ref:f=>e.setSlot(p,f)},null,512),d.state==="loading"?(M(),C("div",td,E(e.tr("loading",{label:e.tabLabel(d)})),1)):d.state==="error"?(M(),C("div",od,[$t(E(e.tr("loadFailed",{label:e.tabLabel(d)})),1),t[0]||(t[0]=I("br",null,null,-1)),I("small",null,E(d.error),1)])):d.state==="idle"&&!d.scriptUrl&&e.manifestError?(M(),C("div",nd,[$t(E(e.tr("loadFailed",{label:e.tabLabel(d)})),1),t[1]||(t[1]=I("br",null,null,-1)),I("small",null,E(e.manifestError),1),t[2]||(t[2]=I("br",null,null,-1)),I("small",null,E(e.tr("manifestHint")),1)])):ne("",!0)],64)):ne("",!0)],8,ed)),[[bn,p===e.activeIndex]])),128)),ge(r,{target:e.activePaneEl,labels:{backToTop:e.tr("backToTop")}},null,8,["target","labels"])]),_:1},8,["dir","lang","labels","title","nav-label","home-href","home-label","groups","active","onUpdate:active"])}const ad=xo(Qc,[["render",sd],["styles",[Yc]]]),rd=Ml(),id=il(ad,{configureApp(e){e.provide("pvTreeBase",rd)}});typeof customElements<"u"&&!customElements.get("posterverse-app")&&customElements.define("posterverse-app",id)})(); +`,Fl=nn({name:"VerticalTabsLayout",components:{BackToTopButton:ba},props:{active:{type:String,default:""},title:{type:String,default:""},items:{type:Array,default:()=>[]},groups:{type:Array,default:()=>[]},navLabel:{type:String,default:"Sections"},labels:{type:Object,default:()=>({})},initialNavOpen:{type:Boolean,default:!0},header:{type:Boolean,default:!0},initialRailCollapsed:{type:Boolean,default:!1},homeHref:{type:String,default:""},homeLabel:{type:String,default:""},shellMode:{type:String,default:"auto"}},emits:["update:active"],setup(){return wl(Cl,"vertical-tabs-layout"),{T:Ol}},data(){const e=(()=>{try{return typeof window<"u"&&!!window.matchMedia&&window.matchMedia("(max-width: 760px)").matches}catch{return!1}})();return{navOpen:this.initialNavOpen&&!e,railCollapsed:e?!1:this.initialRailCollapsed,_tabEls:{},folderOverride:{},narrow:e,_mql:null,_onMedia:null,activatedKeys:{},hostState:{},hostError:{},_hostSlots:{},_hostMounted:{},hostEls:{},mode:"app"}},computed:{phoneBarShown(){return this.narrow&&!this.header},railEndShown(){return!this.narrow&&!this.header},activeHostEl(){return this.hostEls[this.active]||null},railShown(){return this.narrow?this.navOpen:!0},homeLink(){const e=String(this.homeHref||"").trim();return!e||/^(javascript|data|vbscript):/i.test(e.replace(/[\u0000- ]/g,""))?"":e},homeText(){return this.homeLabel||this.label("home")},allRows(){if(this.groups&&this.groups.length){const e=[];for(const t of this.groups)for(const o of t.rows||[])e.push(o);return e}return this.items},orderedKeys(){return this.allRows.map(e=>e.key)},elementRows(){return this.allRows.filter(e=>e&&e.element)},mountedElementRows(){return this.elementRows.filter(e=>this.activatedKeys[e.key])}},watch:{shellMode(){this.resolveShellMode()},active:{immediate:!0,handler(e){this.activateElement(e)}}},mounted(){this.resolveShellMode();try{window.matchMedia&&(this._mql=window.matchMedia("(max-width: 760px)"),this.narrow=this._mql.matches,this.reconcileForWidth(),this._onMedia=e=>{this.narrow=e.matches,this.reconcileForWidth()},this._mql.addEventListener?this._mql.addEventListener("change",this._onMedia):this._mql.addListener&&this._mql.addListener(this._onMedia))}catch{}this.$nextTick(()=>this.activateElement(this.active))},beforeUnmount(){try{this._mql&&this._onMedia&&(this._mql.removeEventListener?this._mql.removeEventListener("change",this._onMedia):this._mql.removeListener&&this._mql.removeListener(this._onMedia))}catch{}this._mql=null,this._onMedia=null},methods:{resolveShellMode(){const e=o=>o==="web"||o==="app"?o:null;let t=e(this.shellMode);if(!t)try{const o=this.$el&&this.$el.getRootNode?this.$el.getRootNode():null,n=o&&o.host;t=e(n&&n.getAttribute?n.getAttribute("shell-mode"):null)}catch{}if(!t)try{const o=window.matchMedia&&window.matchMedia("(display-mode: standalone)").matches||navigator.standalone===!0;t=window.Capacitor||o||window.MAP_OWNS_PAGE===!0?"app":"web"}catch{t="app"}this.mode=t},registerTab(e,t){t&&(this._tabEls[e]=t)},isNarrow(){return this.narrow},reconcileForWidth(){this.narrow?(this.navOpen=!1,this.railCollapsed=!1):this.navOpen=!0},label(e){const t={toggleList:"Toggle list",openViews:"Open the list of views",expandList:"Expand list",collapseList:"Collapse list",collapse:"Collapse",home:"Back to homepage"};return this.labels&&this.labels[e]||t[e]},expandRail(){!this.narrow&&this.railCollapsed&&(this.railCollapsed=!1)},toggleRail(){this.narrow?this.navOpen=!this.navOpen:this.railCollapsed=!this.railCollapsed},setHostSlot(e,t){t&&(this._hostSlots[e]=t,this.$nextTick(()=>this.mountHostElement(e)))},activateElement(e){!e||!this.elementRows.find(o=>o.key===e)||(this.activatedKeys[e]||(this.activatedKeys={...this.activatedKeys,[e]:!0},this.$nextTick(()=>this.watchContextLoss(e)),this.hostState={...this.hostState,[e]:"loading"}),this.$nextTick(()=>this.mountHostElement(e)))},deepCanvases(e,t=[]){if(!e)return t;for(const o of e.querySelectorAll("*"))o.tagName==="CANVAS"&&t.push(o),o.shadowRoot&&this.deepCanvases(o.shadowRoot,t);return t},watchContextLoss(e){const t=this._hostSlots[e];if(t)for(const o of this.deepCanvases(t))o.__vtlLossBound||(o.__vtlLossBound=!0,o.addEventListener("webglcontextlost",()=>{this.hostState={...this.hostState,[e]:"lost"}},{once:!0}))},reloadHostElement(e){const t=this._hostSlots[e];t&&(t.innerHTML=""),this._hostMounted[e]=!1,this.hostState={...this.hostState,[e]:"loading"},this.$nextTick(()=>this.mountHostElement(e))},mountHostElement(e){if(this._hostMounted[e])return;const t=this.elementRows.find(n=>n.key===e),o=this._hostSlots[e];!t||!o||(this._hostMounted[e]=!0,this.hostState={...this.hostState,[e]:"loading"},Al(t.src).then(()=>Pl(t.element)).then(()=>{Tl(t.element,t.src),o.innerHTML="";const n=document.createElement(t.element),s=t.attrs||{};for(const a in s){const i=s[a],r=i!=null&&typeof i=="object"?JSON.stringify(i):String(i);try{n[a]=i}catch{}try{n.setAttribute(a,r)}catch{}}n.style.cssText="display:block;position:absolute;inset:0;width:100%;height:100%;",o.appendChild(n);for(const a of[0,250,1500])setTimeout(()=>this.watchContextLoss(e),a);this.hostState={...this.hostState,[e]:"ready"}}).catch(n=>{this._hostMounted[e]=!1,this.hostState={...this.hostState,[e]:"error"},this.hostError={...this.hostError,[e]:n&&n.message||String(n)}}))},iconSvg(e){return e?Sa(e):""},initial(e){const t=(e||"").trim();return t?t.charAt(0).toUpperCase():"•"},isFolderClosed(e){const t=this.folderOverride[e.key];return t!=null?!t:e.open!==!0},toggleFolder(e){const t=this.folderOverride[e],o=(this.groups||[]).find(s=>s.key===e),n=t??(o&&o.open===!0);this.folderOverride={...this.folderOverride,[e]:!n}},pick(e){this.$emit("update:active",e),this.narrow&&(this.navOpen=!1)},onKey(e){const t=this.orderedKeys;if(!t.length)return;const o=t.indexOf(this.active);let n=-1;if(e.key==="ArrowDown"||e.key==="ArrowRight")n=(o+1)%t.length;else if(e.key==="ArrowUp"||e.key==="ArrowLeft")n=(o-1+t.length)%t.length;else if(e.key==="Home")n=0;else if(e.key==="End")n=t.length-1;else return;e.preventDefault();const s=t[n];this.pick(s),this.$nextTick(()=>{const a=this._tabEls[s];a&&a.focus&&a.focus()})}}}),Il={key:0,class:"vtl-top"},Nl=["aria-expanded","aria-label"],El={class:"vtl-brand"},Rl={class:"vtl-title"},Wl={class:"vtl-meta"},Dl=["aria-expanded","aria-label"],zl={class:"vtl-pbar-end"},Hl={class:"vtl-body"},Bl=["aria-label","aria-hidden","role","aria-orientation"],Ul=["href","aria-label","title"],jl=["innerHTML"],Vl={class:"vtl-home-tx"},ql=["aria-expanded","aria-label"],Gl=["innerHTML"],Kl={class:"vtl-collapse-tx"},Jl=["aria-expanded","onClick"],Xl={key:0,class:"vtl-cap"},Zl={class:"vtl-tl"},Yl={key:1,class:"vtl-td"},Ql=["innerHTML"],ec={key:1,class:"vtl-tier"},tc={key:0,class:"vtl-cap"},oc={class:"vtl-tl"},nc={key:1,class:"vtl-td"},sc={class:"vtl-rows"},ac=["aria-selected","aria-disabled","tabindex","onClick"],rc=["innerHTML"],ic={key:1,class:"vtl-tab-emoji","aria-hidden":"true"},lc={key:2,class:"vtl-tab-fallback","aria-hidden":"true"},cc={class:"vtl-tab-text"},dc={class:"vtl-tab-label"},pc={key:0,class:"vtl-tab-badge"},uc={key:0,class:"vtl-tab-sub"},fc=["innerHTML"],gc=["aria-selected","aria-disabled","tabindex","onClick"],hc=["innerHTML"],$c={key:1,class:"vtl-tab-emoji","aria-hidden":"true"},mc={key:2,class:"vtl-tab-fallback","aria-hidden":"true"},_c={class:"vtl-tab-text"},bc={class:"vtl-tab-label"},vc={key:0,class:"vtl-tab-sub"},yc={key:4,class:"vtl-rail-end"},wc={class:"vtl-main"},xc={class:"vtl-content"},kc=["hidden"],Tc={key:0,class:"vtl-host-hint"},Sc={key:1,class:"vtl-host-hint"},Mc=["onClick"],Lc={key:2,class:"vtl-host-hint err"};function Oc(e,t,o,n,s,a){const i=fo("BackToTopButton");return M(),C("div",{class:Te(["vtl",{"nav-open":e.navOpen,"rail-collapsed":e.railCollapsed,"no-header":!e.header,"has-phone-bar":e.phoneBarShown}])},[e.header?(M(),C("header",Il,[I("button",{class:"vtl-menu",type:"button","aria-expanded":String(e.navOpen),onClick:t[0]||(t[0]=r=>e.navOpen=!e.navOpen),"aria-label":e.label("toggleList")},"☰",8,Nl),I("span",El,[tt(e.$slots,"brand")]),I("b",Rl,E(e.title),1),I("span",Wl,[tt(e.$slots,"meta")])])):ne("",!0),e.phoneBarShown?(M(),C("div",{key:1,class:Te(["vtl-pbar",{"is-web":e.mode==="web"}])},[I("button",{class:"vtl-phone-menu",type:"button","aria-expanded":String(e.navOpen),onClick:t[1]||(t[1]=r=>e.navOpen=!e.navOpen),"aria-label":e.label("toggleList")},"☰",8,Dl),I("span",zl,[tt(e.$slots,"phone-end")])],2)):ne("",!0),e.narrow?(M(),Pt(i,{key:2,target:e.activeHostEl,labels:{backToTop:e.T("actions.backToTop","Back to top")}},null,8,["target","labels"])):ne("",!0),I("div",Hl,[I("nav",{class:Te(["vtl-nav",{"has-rail-end":e.railEndShown&&!!e.$slots["rail-end"]}]),"aria-label":e.navLabel,"aria-hidden":String(!e.railShown),role:e.$slots.rail?null:"tablist","aria-orientation":e.$slots.rail?null:"vertical"},[e.homeLink?(M(),C("a",{key:0,class:"vtl-home",href:e.homeLink,target:"_top","aria-label":e.homeText,title:e.railCollapsed&&!e.narrow?e.homeText:null},[I("span",{class:"vtl-home-ic","aria-hidden":"true",innerHTML:e.iconSvg("home")},null,8,jl),I("span",Vl,E(e.homeText),1)],8,Ul)):ne("",!0),I("button",{type:"button",class:"vtl-collapse","aria-expanded":String(!e.railCollapsed),"aria-label":e.railCollapsed?e.label("expandList"):e.label("collapseList"),onClick:t[2]||(t[2]=(...r)=>e.toggleRail&&e.toggleRail(...r))},[I("span",{class:"vtl-collapse-ic","aria-hidden":"true",innerHTML:e.iconSvg("chevron")},null,8,Gl),I("span",Kl,E(e.label("collapse")),1)],8,ql),e.$slots.rail?tt(e.$slots,"rail",{collapsed:e.railCollapsed&&!e.narrow,expand:e.expandRail,pick:e.pick},void 0,void 0,1):e.groups&&e.groups.length?(M(!0),C(ee,{key:2},ft(e.groups,r=>(M(),C("div",{class:"vtl-grp",key:r.key},[r.folder?(M(),C("button",{key:0,type:"button",class:"vtl-tier vtl-tier-btn","aria-expanded":String(!e.isFolderClosed(r)),onClick:l=>e.toggleFolder(r.key)},[r.badge?(M(),C("span",Xl,E(r.badge),1)):ne("",!0),I("span",Zl,E(r.label),1),r.count!=null?(M(),C("span",Yl,E(r.count),1)):ne("",!0),I("span",{class:Te(["vtl-chev",{open:!e.isFolderClosed(r)}]),"aria-hidden":"true",innerHTML:e.iconSvg("chevron")},null,10,Ql)],8,Jl)):(M(),C("div",ec,[r.badge?(M(),C("span",tc,E(r.badge),1)):ne("",!0),I("span",oc,E(r.label),1),r.count!=null?(M(),C("span",nc,E(r.count),1)):ne("",!0)])),en(I("div",sc,[(M(!0),C(ee,null,ft(r.rows,l=>(M(),C("button",{key:l.key,type:"button",role:"tab",class:Te(["vtl-tab",{active:l.key===e.active,disabled:l.disabled}]),"aria-selected":String(l.key===e.active),"aria-disabled":l.disabled?"true":null,tabindex:l.key===e.active?0:-1,ref_for:!0,ref:d=>e.registerTab(l.key,d),onClick:d=>e.pick(l.key),onKeydown:t[3]||(t[3]=d=>e.onKey(d))},[l.icon?(M(),C("span",{key:0,class:"vtl-tab-ic","aria-hidden":"true",innerHTML:e.iconSvg(l.icon)},null,8,rc)):l.emoji?(M(),C("span",ic,E(l.emoji),1)):(M(),C("span",lc,E(e.initial(l.label)),1)),I("span",cc,[I("span",dc,[$t(E(l.label),1),l.badge?(M(),C("span",pc,E(l.badge),1)):ne("",!0)]),l.sub?(M(),C("span",uc,[I("span",{innerHTML:l.sub},null,8,fc)])):ne("",!0)])],42,ac))),128))],512),[[bn,!r.folder||!e.isFolderClosed(r)]])]))),128)):(M(!0),C(ee,{key:3},ft(e.items,r=>(M(),C("button",{key:r.key,type:"button",role:"tab",class:Te(["vtl-tab",{active:r.key===e.active,disabled:r.disabled}]),"aria-selected":String(r.key===e.active),"aria-disabled":r.disabled?"true":null,tabindex:r.key===e.active?0:-1,ref_for:!0,ref:l=>e.registerTab(r.key,l),onClick:l=>e.pick(r.key),onKeydown:t[4]||(t[4]=l=>e.onKey(l))},[r.icon?(M(),C("span",{key:0,class:"vtl-tab-ic","aria-hidden":"true",innerHTML:e.iconSvg(r.icon)},null,8,hc)):r.emoji?(M(),C("span",$c,E(r.emoji),1)):(M(),C("span",mc,E(e.initial(r.label)),1)),I("span",_c,[I("span",bc,E(r.label),1),r.sub?(M(),C("span",vc,E(r.sub),1)):ne("",!0)])],42,gc))),128)),e.railEndShown&&e.$slots["rail-end"]?(M(),C("div",yc,[tt(e.$slots,"rail-end",{collapsed:e.railCollapsed})])):ne("",!0)],10,Bl),I("main",wc,[e.header?tt(e.$slots,"toolbar",{},void 0,void 0,0):ne("",!0),I("div",xc,[(M(!0),C(ee,null,ft(e.mountedElementRows,r=>en((M(),C("section",{key:r.key,class:"vtl-host",hidden:r.key!==e.active,ref_for:!0,ref:l=>{l?e.hostEls[r.key]=l:delete e.hostEls[r.key]}},[I("div",{class:"vtl-host-slot",ref_for:!0,ref:l=>e.setHostSlot(r.key,l)},null,512),e.hostState[r.key]==="loading"?(M(),C("div",Tc,E(e.T("messages.loadingNamed","Loading {name}…").replace("{name}",r.label)),1)):e.hostState[r.key]==="lost"?(M(),C("div",Sc,[$t(E(e.T("messages.mapContextLost","This map was unloaded to free graphics memory."))+" ",1),I("button",{type:"button",class:"vtl-host-reload",onClick:l=>e.reloadHostElement(r.key)},E(e.T("buttons.reloadMap","Reload Map")),9,Mc)])):e.hostState[r.key]==="error"?(M(),C("div",Lc,[$t(E(e.T("messages.couldNotLoadNamed","Could not load {name}.").replace("{name}",r.label)),1),t[5]||(t[5]=I("br",null,null,-1)),I("small",null,E(e.hostError[r.key]),1)])):ne("",!0)],8,kc)),[[bn,r.key===e.active]])),128)),tt(e.$slots,"default")])])])],2)}const Ac=xo(Fl,[["render",Oc],["styles",[Ll]]]),Pa=[{code:"en",name:"English",nativeName:"English",flag:"🇺🇸"},{code:"es",name:"Spanish",nativeName:"Español",flag:"🇪🇸"},{code:"fr",name:"French",nativeName:"Français",flag:"🇫🇷"},{code:"pt",name:"Portuguese",nativeName:"Português",flag:"🇵🇹"},{code:"ar",name:"Arabic",nativeName:"العربية",flag:"🇸🇦",dir:"rtl"},{code:"ru",name:"Russian",nativeName:"Русский",flag:"🇷🇺"},{code:"de",name:"German",nativeName:"Deutsch",flag:"🇩🇪",hideFromSwitcher:!0},{code:"hi",name:"Hindi",nativeName:"हिन्दी",flag:"🇮🇳",hideFromSwitcher:!0},{code:"it",name:"Italian",nativeName:"Italiano",flag:"🇮🇹",hideFromSwitcher:!0},{code:"ro",name:"Romanian",nativeName:"Română",flag:"🇷🇴",hideFromSwitcher:!0},{code:"zh",name:"Chinese",nativeName:"中文",flag:"🇨🇳",hideFromSwitcher:!0}],Pc=Pa.filter(e=>!e.hideFromSwitcher);function Ca(e){return Pa.find(t=>t.code===e)}const Cc="doxa-maps:locale";function Fc(e){try{localStorage.setItem(Cc,e)}catch{}}const Ic="doxa-language-request";function Nc(e){try{const t=e&&e.getRootNode&&e.getRootNode();if(t&&t.host)return t.host}catch{}return e||null}function Ec(e,t){const o=Nc(e);return!o||typeof o.dispatchEvent!="function"?!0:o.dispatchEvent(new CustomEvent(Ic,{detail:{language:t},bubbles:!0,composed:!0,cancelable:!0}))}function Rc(e,t=typeof window<"u"?window:null){try{if(!t||t.MAP_OWNS_PAGE!==!0||!t.history||!t.location)return!1;const o=new URL(t.location.href);return o.searchParams.set("lang",e),t.history.replaceState(t.history.state,"",o.toString()),!0}catch{return!1}}const Wc=".slm[data-v-12760774]{position:relative;display:inline-flex;align-items:center;min-height:44px;max-width:100%;box-sizing:border-box;border-radius:8px;color:#3b463d}.slm-face[data-v-12760774]{display:inline-flex;align-items:center;gap:6px;padding-inline:10px;min-width:0;font-size:13px;font-weight:500;line-height:1.2}.slm-ic[data-v-12760774]{flex:0 0 auto;display:inline-flex;color:var(--vtl-muted, #6d766e)}.slm-ic[data-v-12760774] svg{width:18px;height:18px}.slm-name[data-v-12760774]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.slm-code[data-v-12760774]{font-weight:600;font-size:12px;letter-spacing:.03em}.slm-caret[data-v-12760774]{flex:0 0 auto;color:var(--vtl-muted, #6d766e);font-size:11px}.slm.collapsed .slm-face[data-v-12760774]{flex-direction:column;gap:2px;padding-inline:4px}.slm-select[data-v-12760774]{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;margin:0;border:0;cursor:pointer;font-size:16px}.slm[data-v-12760774]:hover{background:var(--vtl-accented, #d1d4cd)}.slm[data-v-12760774]:focus-within{outline:2px solid var(--vtl-accent, #92b195);outline-offset:-2px}@media (prefers-reduced-motion: reduce){.slm[data-v-12760774]{transition:none}}",Dc={class:"slm-face","aria-hidden":"true"},zc=["innerHTML"],Hc={key:0,class:"slm-code"},Bc=["lang","dir"],Uc={key:2,class:"slm-caret"},jc=["value","aria-label","title"],Vc=["value","lang","dir"],qc=xo({__name:"ShellLanguageMenu",props:{current:{type:String,default:"en"},collapsed:{type:Boolean,default:!1}},emits:["switch"],setup(e,{emit:t}){const o=e,n=t,s=Et(()=>{const d=Pc.slice();if(o.current&&!d.some(p=>p.code===o.current)){const p=Ca(o.current);p&&d.push(p)}return d}),a=Et(()=>Ca(o.current)||{code:o.current,nativeName:o.current}),i=Et(()=>ka("controls.language",o.current)||"Language"),r=Sa("globe");function l(d){const p=d.target,f=p.value;!f||f===o.current||(Ec(p,f)?(n("switch",f),Rc(f)):p.value=o.current)}return(d,p)=>(M(),C("span",{class:Te(["slm",{collapsed:e.collapsed}])},[I("span",Dc,[I("span",{class:"slm-ic",innerHTML:Zo(r)},null,8,zc),e.collapsed?(M(),C("span",Hc,E(String(e.current).toUpperCase()),1)):(M(),C("span",{key:1,class:"slm-name",lang:a.value.code,dir:a.value.dir||null},E(a.value.nativeName),9,Bc)),e.collapsed?ne("",!0):(M(),C("span",Uc,"▾"))]),I("select",{class:"slm-select",value:e.current,"aria-label":i.value,title:i.value,onChange:l},[(M(!0),C(ee,null,ft(s.value,f=>(M(),C("option",{key:f.code,value:f.code,lang:f.code,dir:f.dir||null},E(f.nativeName),9,Vc))),128))],40,jc)],2))}},[["styles",[Wc]],["__scopeId","data-v-12760774"]]),ko={en:{"sec.posters":"Posters","sec.experimental":"Experimental","tab.upg-100":"UPG 100 List Posters","sub.upg-100":"my unreached list + posters","tab.country-posters":"Country Posters","sub.country-posters":"a poster for every country","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",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.",backToTop:"Back to top",home:"Back to homepage",toggleList:"Toggle list",openViews:"Open the list of views",expandList:"Expand list",collapseList:"Collapse list",collapse:"Collapse"},es:{"sec.posters":"Carteles","sec.experimental":"Experimental","tab.upg-100":"Carteles de la lista UPG 100","sub.upg-100":"mi lista de no alcanzados + carteles","tab.country-posters":"Carteles por país","sub.country-posters":"un cartel para cada país","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",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.",backToTop:"Volver arriba",home:"Volver a la página de inicio",toggleList:"Mostrar u ocultar la lista",openViews:"Abrir la lista de vistas",expandList:"Expandir la lista",collapseList:"Contraer la lista",collapse:"Contraer"},fr:{"sec.posters":"Affiches","sec.experimental":"Expérimental","tab.upg-100":"Affiches de la liste UPG 100","sub.upg-100":"ma liste des non atteints + affiches","tab.country-posters":"Affiches par pays","sub.country-posters":"une affiche pour chaque pays","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",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.",backToTop:"Retour en haut",home:"Retour à l’accueil",toggleList:"Afficher ou masquer la liste",openViews:"Ouvrir la liste des vues",expandList:"Déplier la liste",collapseList:"Replier la liste",collapse:"Replier"},de:{"sec.posters":"Poster","sec.experimental":"Experimentell","tab.upg-100":"Poster der UPG 100 Liste","sub.upg-100":"meine Liste der Unerreichten + Poster","tab.country-posters":"Länderposter","sub.country-posters":"ein Poster für jedes Land","tab.poster-design":"Postergestaltung","sub.poster-design":"alle Posterstile und -größen","tab.wall-of-people-groups":"Wand der Volksgruppen","tab.bible-posters":"Bibelposter",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.",backToTop:"Nach oben",home:"Zurück zur Startseite",toggleList:"Liste ein-/ausblenden",openViews:"Ansichtsliste öffnen",expandList:"Liste ausklappen",collapseList:"Liste einklappen",collapse:"Einklappen"},pt:{"sec.posters":"Cartazes","sec.experimental":"Experimental","tab.upg-100":"Cartazes da lista UPG 100","sub.upg-100":"minha lista de não alcançados + cartazes","tab.country-posters":"Cartazes por país","sub.country-posters":"um cartaz para cada país","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",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.",backToTop:"Voltar ao topo",home:"Voltar à página inicial",toggleList:"Mostrar ou ocultar a lista",openViews:"Abrir a lista de visualizações",expandList:"Expandir a lista",collapseList:"Recolher a lista",collapse:"Recolher"},it:{"sec.posters":"Poster","sec.experimental":"Sperimentale","tab.upg-100":"Poster della lista UPG 100","sub.upg-100":"la mia lista dei non raggiunti + poster","tab.country-posters":"Poster per paese","sub.country-posters":"un poster per ogni paese","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",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.",backToTop:"Torna su",home:"Torna alla home page",toggleList:"Mostra o nascondi l’elenco",openViews:"Apri l’elenco delle viste",expandList:"Espandi l’elenco",collapseList:"Comprimi l’elenco",collapse:"Comprimi"},ro:{"sec.posters":"Afișe","sec.experimental":"Experimental","tab.upg-100":"Afișe din lista UPG 100","sub.upg-100":"lista mea de neatinși + afișe","tab.country-posters":"Afișe pe țări","sub.country-posters":"un afiș pentru fiecare țară","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",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.",backToTop:"Sus",home:"Înapoi la pagina principală",toggleList:"Afișează sau ascunde lista",openViews:"Deschide lista de vizualizări",expandList:"Extinde lista",collapseList:"Restrânge lista",collapse:"Restrânge"},ru:{"sec.posters":"Плакаты","sec.experimental":"Экспериментальное","tab.upg-100":"Плакаты списка UPG 100","sub.upg-100":"мой список недостигнутых + плакаты","tab.country-posters":"Плакаты по странам","sub.country-posters":"плакат для каждой страны","tab.poster-design":"Дизайн плакатов","sub.poster-design":"все стили и размеры плакатов","tab.wall-of-people-groups":"Стена народов","tab.bible-posters":"Библейские плакаты",experimentalSub:"экспериментальная карта",lab:"бета",loading:"Загрузка: {label}…",loadFailed:"Не удалось загрузить: {label}.",manifestHint:"Эта вкладка собирается из manifest.json — соберите дерево или разместите собранное дерево, чтобы загрузить её.",backToTop:"Наверх",home:"На главную страницу",toggleList:"Показать или скрыть список",openViews:"Открыть список представлений",expandList:"Развернуть список",collapseList:"Свернуть список",collapse:"Свернуть"},ar:{"sec.posters":"ملصقات","sec.experimental":"تجريبي","tab.upg-100":"ملصقات قائمة UPG 100","sub.upg-100":"قائمتي لغير المُبشَّرين + ملصقات","tab.country-posters":"ملصقات الدول","sub.country-posters":"ملصق لكل دولة","tab.poster-design":"تصميم الملصقات","sub.poster-design":"كل أنماط الملصقات وأحجامها","tab.wall-of-people-groups":"جدار الشعوب","tab.bible-posters":"ملصقات الكتاب المقدس",experimentalSub:"خريطة تجريبية",lab:"تجريبي",loading:"جارٍ تحميل {label}…",loadFailed:"تعذّر تحميل {label}.",manifestHint:"تُبنى علامة التبويب هذه من manifest.json — ابنِ الشجرة أو قدّم الشجرة المبنية لتحميلها.",backToTop:"إلى الأعلى",home:"العودة إلى الصفحة الرئيسية",toggleList:"إظهار القائمة أو إخفاؤها",openViews:"فتح قائمة العروض",expandList:"توسيع القائمة",collapseList:"طي القائمة",collapse:"طي"},hi:{"sec.posters":"पोस्टर","sec.experimental":"प्रायोगिक","tab.upg-100":"UPG 100 सूची पोस्टर","sub.upg-100":"मेरी अप्राप्त सूची + पोस्टर","tab.country-posters":"देश पोस्टर","sub.country-posters":"हर देश के लिए एक पोस्टर","tab.poster-design":"पोस्टर डिज़ाइन","sub.poster-design":"हर पोस्टर शैली और आकार","tab.wall-of-people-groups":"जनसमूहों की दीवार","tab.bible-posters":"बाइबल पोस्टर",experimentalSub:"प्रायोगिक मानचित्र",lab:"बीटा",loading:"{label} लोड हो रहा है…",loadFailed:"{label} लोड नहीं हो सका।",manifestHint:"यह टैब manifest.json से बनता है — इसे लोड करने के लिए ट्री बनाएँ या बना हुआ ट्री सर्व करें।",backToTop:"ऊपर जाएँ",home:"होमपेज पर वापस जाएँ",toggleList:"सूची दिखाएँ या छिपाएँ",openViews:"दृश्यों की सूची खोलें",expandList:"सूची फैलाएँ",collapseList:"सूची संक्षिप्त करें",collapse:"संक्षिप्त करें"},zh:{"sec.posters":"海报","sec.experimental":"实验性","tab.upg-100":"UPG 100 名单海报","sub.upg-100":"我的未得之民名单 + 海报","tab.country-posters":"国家海报","sub.country-posters":"每个国家一张海报","tab.poster-design":"海报设计","sub.poster-design":"所有海报样式与尺寸","tab.wall-of-people-groups":"民族之墙","tab.bible-posters":"圣经海报",experimentalSub:"实验性地图",lab:"测试版",loading:"正在加载{label}…",loadFailed:"无法加载{label}。",manifestHint:"此标签页由 manifest.json 组成——请构建目录树或提供已构建的目录树以加载它。",backToTop:"回到顶部",home:"返回首页",toggleList:"显示或隐藏列表",openViews:"打开视图列表",expandList:"展开列表",collapseList:"折叠列表",collapse:"折叠"}},Tn=Object.keys(ko);function Gc(e,t,o){let s=(ko[e]||ko.en)[t]??ko.en[t]??t;if(o)for(const a in o)s=s.split("{"+a+"}").join(String(o[a]));return s}const Kc=[{key:"posters",i18n:"sec.posters",icon:"poster"},{key:"experimental",i18n:"sec.experimental",icon:"flask",folder:!0,open:!0}],Fa=[{id:"upg-100",section:"posters",icon:"list",bundle:"my-upg-100-list",profile:"upg-100-mfe"},{id:"country-posters",section:"posters",icon:"map",bundle:"country-posters",profile:"country-posters-mfe"},{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"}],Jc=new Set(["key-cities","posterverse","doxa-maps-spa","plugin-studio"]),Xc=new Set(["my-upg-100-list-map","country-posters-map"]);function Zc(e,t=()=>{}){const o=e&&Array.isArray(e.bundles)?e.bundles:[],n=Object.fromEntries(o.map(a=>[a&&a.bundle,a])),s=[];for(const a of Fa){if(Jc.has(a.bundle))continue;const i=n[a.bundle];if(!i)continue;const r=Array.isArray(i.profiles)?i.profiles:[];let l=r.find(f=>f&&f.profile===a.profile);if(!l){if(l=r.find(f=>f&&f.profile===a.bundle)||r[0],!l)continue;t(`[posterverse] ${a.bundle} has no profile "${a.profile}"; row "${a.id}" opens "${l.profile}" instead`)}const d=l.element||Array.isArray(i.elements)&&i.elements[0]||a.bundle,p=i.scriptUrl||l.scriptUrl||"";p&&s.push({...a,tag:d,scriptUrl:p,profile:l.profile,heavy:Xc.has(d)||!!l.isMap})}return s}const Yc=":host{display:block;position:relative;height:var(--posterverse-height, 85vh);min-height:480px}:host{font-size:16px;line-height:normal;font-weight:400;font-style:normal;font-variant:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;text-align:start;text-indent:0;text-shadow:none;white-space:normal;-webkit-hyphens:manual;hyphens:manual;visibility:visible;cursor:auto}:host([hidden]){display:none}.pv-pane{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;--profile-min-h: 0}.pv-slot{position:relative;min-height:100%}.pv-hint{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;text-align:center;color:#6d766e;font-size:13px;padding:20px}.pv-hint.err{color:#b3261e}.pv-hint small{color:#6d766e}";function Ia(){try{const e=new URLSearchParams(location.search),t=(e.get("lang")||e.get("locale")||"").split("-")[0].toLowerCase();if(Tn.includes(t))return t}catch{}try{const e=(document.documentElement.lang||"").split("-")[0].toLowerCase();if(Tn.includes(e))return e}catch{}return""}const Na=e=>({...e,tag:e.tag||"",scriptUrl:e.scriptUrl||"",heavy:!!e.heavy,mounted:!1,state:"idle",error:""}),Qc=nn({name:"Posterverse",inheritAttrs:!1,components:{VerticalTabsLayout:Ac,BackToTopButton:ba,ShellLanguageMenu:qc},props:{treeBase:{type:String,default:""},profileConfig:{type:[String,Object],default:""},heading:{type:String,default:"Posterverse"},tokenUrl:{type:String,default:""},tk:{type:String,default:""},language:{type:String,default:""},apiBaseUrl:{type:String,default:""},provider:{type:String,default:""},tab:{type:String,default:""},homeHref:{type:String,default:""},homeLabel:{type:String,default:""}},emits:["tab-change"],setup(){return{injectedBase:St("pvTreeBase","")}},data(){return{paneEls:{},activeIndex:0,manifestError:"",manifestBase:"",runtime:{},hostLang:Ia(),localPick:"",pickBase:null,tabs:Fa.filter(e=>!e.provisional).map(Na)}},computed:{cfg(){let e=this.profileConfig;if(typeof e=="string")try{e=e?JSON.parse(e):{}}catch{e={}}return e&&typeof e=="object"?e:{}},base(){const e=String(this.treeBase||this.cfg.treeBase||this.injectedBase||"").trim();return e?e.replace(/\/+$/,"")+"/":""},assetsBase(){const e=String(this.cfg.assetsBase||"").trim();return/^https?:\/\//i.test(e)||e.startsWith("/")?e.replace(/\/+$/,""):this.manifestBase?this.manifestBase.replace(/\/+$/,"")+"/assets":""},headingText(){return String(this.cfg.heading||this.heading||"").trim()||"Posterverse"},hostLanguage(){return String(this.language||this.cfg.language||this.cfg.locale||this.cfg.lang||"").trim()},effectiveLocale(){return this.localPick&&this.hostLanguage===this.pickBase?this.localPick:(this.hostLanguage||this.hostLang||"en").split("-")[0].toLowerCase()},uiLocale(){return Tn.includes(this.effectiveLocale)?this.effectiveLocale:"en"},defaultHomeHref(){return"https://doxa.life"+(this.uiLocale&&this.uiLocale!=="en"?"/"+this.uiLocale:"")},uiDir(){return this.uiLocale==="ar"?"rtl":"ltr"},layoutLabels(){const e={};for(const t of["toggleList","openViews","expandList","collapseList","collapse","home"])e[t]=this.tr(t);return e},effectiveProvider(){const e=String(this.provider||this.cfg.provider||"").trim().toLowerCase();return e==="maplibre"||e==="mapbox"?e:""},activeKey(){const e=this.tabs[this.activeIndex];return e?e.id:""},activePaneEl(){return this.paneEls[this.activeIndex]||null},navGroups(){return Kc.map(e=>({key:e.key,label:this.tr(e.i18n),icon:e.icon,folder:!!e.folder,open:e.open,rows:this.tabs.filter(t=>t.section===e.key).map(t=>({key:t.id,label:this.tabLabel(t),sub:this.tabSub(t),icon:t.icon,badge:e.folder?this.tr("lab"):void 0}))})).filter(e=>e.rows.length)}},watch:{effectiveLocale(){const e=(o,n)=>{try{const s=this._slots&&this._slots[o];s&&(s.innerHTML="")}catch{}n.mounted=!1,n.state="idle",n.error=""};this.tabs.forEach((o,n)=>{o.mounted&&n!==this.activeIndex&&e(n,o)});const t=this.tabs[this.activeIndex];!t||!t.mounted||(e(this.activeIndex,t),this.mountElement(this.activeIndex))},tab(e){e&&this.onSelect(e)},hostLanguage(e){e!==this.pickBase&&(this.localPick="",this.pickBase=null)}},mounted(){this.watchHostLang(),this.select(this.initialIndex()),this.loadManifest()},beforeUnmount(){this._langObs&&(this._langObs.disconnect(),this._langObs=null)},methods:{tr(e,t){return Gc(this.uiLocale,e,t)},setLocale(e){this.pickBase=this.hostLanguage,this.localPick=e,Fc(e)},tabLabel(e){return this.tr("tab."+e.id)},tabSub(e){return e.section==="experimental"?this.tr("experimentalSub"):this.tr("sub."+e.id)},setSlot(e,t){t&&(this._slots=Object.assign(this._slots||{},{[e]:t}))},watchHostLang(){typeof MutationObserver>"u"||typeof document>"u"||(this._langObs=new MutationObserver(()=>{this.hostLang=Ia()}),this._langObs.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]}))},requestedTab(){let e="";try{e=new URLSearchParams(location.search).get("tab")||""}catch{}return String(this.tab||this.cfg.tab||e||"").trim()},initialIndex(){const e=this.tabs.findIndex(t=>t.id===this.requestedTab());return e>=0?e:0},loadManifest(){const e=d=>{try{return new URL(d,location.href).href.replace(/[^/]*$/,"")}catch{return""}},t=this.resolve("manifest.json"),o={url:t,root:e(t)},n={url:this.resolve("doxa-maps-spa/manifest.json"),root:o.root};let s=!1;try{s=new URL(t,location.href).origin!==location.origin}catch{}const a=s?[n,o]:[o,n],i="/public/dx-maps/manifest.json";a.some(d=>d.url===i)||a.push({url:i,root:e(i)});const r=[],l=d=>{if(d>=a.length){this.manifestError="manifest.json not found (tried "+r.join(", ")+")",console.error("[posterverse] "+this.manifestError+" — every tab is composed from it.");return}const{url:p,root:f}=a[d];return r.push(p),fetch(p,{credentials:"same-origin"}).then(w=>{if(!w||!w.ok)throw new Error(p+" → HTTP "+(w?w.status:"?"));return w.json()}).then(w=>{if(!w)throw new Error(p+" → empty");this.manifestError="",this.manifestBase=f||"",this.applyManifest(w)}).catch(()=>l(d+1))};try{l(0)}catch{}},applyManifest(e){this.runtime=e&&e.runtime&&typeof e.runtime=="object"?e.runtime:{},this.applyPageGlobals();const t=this.activeKey;this.tabs=Zc(e,a=>console.warn(a)).map(Na);const o=this.requestedTab(),n=!this._honouredTab&&o?this.tabs.findIndex(a=>a.id===o):-1,s=this.tabs.findIndex(a=>a.id===t);this._honouredTab=!0,this.select(n>=0?n:s>=0?s:0)},onSelect(e){const t=this.tabs.findIndex(o=>o.id===e);t!==-1&&this.select(t)},resolve(e){const t=String(e);if(/^(https?:)?\/\//.test(t)||t.startsWith("/"))return t;const o=t.replace(/^\.\//,"");return this.manifestBase?this.manifestBase.replace(/\/+$/,"")+"/"+o:this.base?this.base.replace(/\/+$/,"")+"/"+o:"../"+o},select(e){const t=this.activeIndex;if(this.activeIndex=e,t!==e&&t>=0){const n=this.tabs[t];n&&n.heavy&&n.mounted&&this.releaseTab(t,n)}const o=this.tabs[e];o&&((t!==e||!this._announced)&&(this._announced=!0,this.$emit("tab-change",{id:o.id,label:this.tabLabel(o)})),o.scriptUrl&&(o.mounted||this.$nextTick(()=>{this.activeIndex===e&&this.mountElement(e)})))},releaseTab(e,t){try{const o=this._slots&&this._slots[e];o&&(o.innerHTML="")}catch{}this._slots&&delete this._slots[e],t.mounted=!1,t.state="idle",t.error=""},childConfig(e){const t={profile:e.profile||e.id,instanceId:"pv-"+e.id};this.effectiveLocale&&(t.locale=this.effectiveLocale);const o=this.tk||this.cfg.tk||this.runtime.token;return o&&(t.tk=o),(this.tokenUrl||this.cfg.tokenUrl)&&(t.tokenUrl=this.tokenUrl||this.cfg.tokenUrl),this.effectiveProvider&&(t.provider=this.effectiveProvider),this.base&&(t.treeBase=this.base),this.assetsBase&&(t.assetsBase=this.assetsBase),t.urlSync=!1,t.mapTitle=this.tabLabel(e),t},applyPageGlobals(){if(typeof window>"u")return;const e=String(this.apiBaseUrl||this.cfg.apiBaseUrl||this.runtime.apiBaseUrl||"").trim();e&&!window.MAP_APP_API_URL&&(window.MAP_APP_API_URL=e.replace(/\/+$/,""));const t=this.tk||this.cfg.tk||this.runtime.token;t&&!window.MAP_TOKEN&&(window.MAP_TOKEN=t),this.effectiveProvider&&!window.MAP_PROVIDER&&(window.MAP_PROVIDER=this.effectiveProvider)},mountElement(e){const t=this.tabs[e];t.mounted=!0,t.state="loading",Aa(this.resolve(t.scriptUrl)).then(()=>Sl(t.tag)).then(()=>{try{if(t.heavy&&this.activeIndex!==e){t.mounted=!1,t.state="idle";return}const o=this._slots&&this._slots[e];if(!o){t.state="error",t.error="no slot";return}o.innerHTML="";const n=document.createElement(t.tag);n.setAttribute("profile-config",JSON.stringify(this.childConfig(t))),this.base&&n.setAttribute("tree-base",this.base.replace(/\/+$/,"")),n.style.cssText="display:block;position:absolute;inset:0;width:100%;height:100%;min-height:0;",o.appendChild(n),t.state="ready"}catch(o){t.state="error",t.error="mount failed: "+(o&&o.message||String(o))}}).catch(o=>{t.state="error",t.error=o&&o.message||String(o)})}}}),ed=["hidden"],td={key:0,class:"pv-hint"},od={key:1,class:"pv-hint err"},nd={key:2,class:"pv-hint err"};function sd(e,t,o,n,s,a){const i=fo("ShellLanguageMenu"),r=fo("BackToTopButton"),l=fo("VerticalTabsLayout");return M(),Pt(l,{dir:e.uiDir,lang:e.uiLocale,labels:e.layoutLabels,title:e.headingText,"nav-label":e.tr("sec.posters"),header:!1,"home-href":e.homeHref||e.cfg.homeHref||e.defaultHomeHref,"home-label":e.homeLabel||e.cfg.homeLabel||"",groups:e.navGroups,active:e.activeKey,"onUpdate:active":e.onSelect},{"phone-end":io(()=>[ge(i,{current:e.uiLocale,onSwitch:e.setLocale},null,8,["current","onSwitch"])]),"rail-end":io(({collapsed:d})=>[ge(i,{current:e.uiLocale,collapsed:d,onSwitch:e.setLocale},null,8,["current","collapsed","onSwitch"])]),default:io(()=>[(M(!0),C(ee,null,ft(e.tabs,(d,p)=>en((M(),C("section",{key:d.id,class:"pv-pane",ref_for:!0,ref:f=>{f?e.paneEls[p]=f:delete e.paneEls[p]},hidden:p!==e.activeIndex},[!d.heavy||p===e.activeIndex?(M(),C(ee,{key:0},[I("div",{class:"pv-slot",ref_for:!0,ref:f=>e.setSlot(p,f)},null,512),d.state==="loading"?(M(),C("div",td,E(e.tr("loading",{label:e.tabLabel(d)})),1)):d.state==="error"?(M(),C("div",od,[$t(E(e.tr("loadFailed",{label:e.tabLabel(d)})),1),t[0]||(t[0]=I("br",null,null,-1)),I("small",null,E(d.error),1)])):d.state==="idle"&&!d.scriptUrl&&e.manifestError?(M(),C("div",nd,[$t(E(e.tr("loadFailed",{label:e.tabLabel(d)})),1),t[1]||(t[1]=I("br",null,null,-1)),I("small",null,E(e.manifestError),1),t[2]||(t[2]=I("br",null,null,-1)),I("small",null,E(e.tr("manifestHint")),1)])):ne("",!0)],64)):ne("",!0)],8,ed)),[[bn,p===e.activeIndex]])),128)),ge(r,{target:e.activePaneEl,labels:{backToTop:e.tr("backToTop")}},null,8,["target","labels"])]),_:1},8,["dir","lang","labels","title","nav-label","home-href","home-label","groups","active","onUpdate:active"])}const ad=xo(Qc,[["render",sd],["styles",[Yc]]]),rd=Ml(),id=il(ad,{configureApp(e){e.provide("pvTreeBase",rd)}});typeof customElements<"u"&&!customElements.get("posterverse-app")&&customElements.define("posterverse-app",id)})(); diff --git a/public/dx-maps/posterverse/posterverse/app/index.html b/public/dx-maps/posterverse/posterverse/app/index.html index 0fd273b8b..3af949a61 100644 --- a/public/dx-maps/posterverse/posterverse/app/index.html +++ b/public/dx-maps/posterverse/posterverse/app/index.html @@ -67,7 +67,7 @@ - + - +