From d329a3a612e507e2c090a84b02126a268e4a6085 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 18:35:12 +0000 Subject: [PATCH 1/2] Posterverse: the Bless India Posters rail label is the plugin's own title The rail row now uses the plugin's own title in all 11 locales, copied from its catalogue (blessIndiaPosters.title), so the rail and the plugin name it the same way. Copied rather than read at runtime: naming that catalogue area from the shell would ship the plugin's whole catalogue inside posterverse.js. check:posterverse-shelf arm F asserts the two stay equal in every locale; its self-test plants a drifted label. --- .../scripts/check-posterverse-shelf.mjs | 28 +++++++++++++++++-- plugin-designs/posterverse/src/strings.js | 20 ++++++------- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs b/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs index de21094f8..957f89670 100644 --- a/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs +++ b/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs @@ -20,6 +20,7 @@ * D. posterverse.meta.json `composes` == the bundle/profile of every row whose bundle exists in * plugin-designs/ (two-sided: nothing declared that the rail cannot show, nothing shown undeclared). * E. strings: every locale carries every English key, and every key the shell reads exists in English. + * F. a rail label named in LABEL_FOLLOWS equals that plugin's own catalogue title, in every locale. * * Headless, no browser. Exit 0 pass · 1 fail · 75 not measured (no built manifest). */ @@ -40,10 +41,14 @@ const GATED = 'key-cities' // Rows whose plugin is a natural-height page: mounted unpinned so the pane scrolls them. Named, because a // pinned scroll page traps its own content and nothing else would notice. const EXPECT_SCROLL = ['bless-india-posters'] +// Rail labels that must EQUAL the plugin's own title (vocabulary follows the plugin), per locale: +// row id -> [catalogue area file under library/i18n/locales//, key inside it]. Copied, not read at +// runtime: naming the area from the shell would ship the plugin's whole catalogue inside posterverse.js. +const LABEL_FOLLOWS = { 'bless-india-posters': ['blessIndiaPosters.json', 'title'] } const sameList = (a, b) => a.length === b.length && a.every((x, i) => x === b[i]) -export function checkShelf({ SECTIONS, TABS, NEVER, resolveTabs, manifest, meta, bundleExists, STRINGS }) { +export function checkShelf({ SECTIONS, TABS, NEVER, resolveTabs, manifest, meta, bundleExists, STRINGS, pluginTitles = {} }) { const errs = [] const notes = [] // A. exact membership, per section, in order @@ -104,6 +109,14 @@ export function checkShelf({ SECTIONS, TABS, NEVER, resolveTabs, manifest, meta, const v = STRINGS[l][k] if (typeof v !== 'string' || !v.trim()) errs.push(`E: ${l} is missing "${k}"`) } + // F. labels that follow a plugin's own title, per locale + for (const [id, byLocale] of Object.entries(pluginTitles)) { + for (const [l, want] of Object.entries(byLocale)) { + const got = (STRINGS[l] || {})['tab.' + id] + if (want === undefined) errs.push(`F: ${l}: the plugin's own title for ${id} is missing from its catalogue`) + else if (got !== want) errs.push(`F: ${l}: tab.${id} is ${JSON.stringify(got)}, the plugin's own title is ${JSON.stringify(want)}`) + } + } return { errs, notes, counts: { rows: TABS.length, resolved: resolved.length, composes: composes.length, locales: locales.length, keys: Object.keys(en).length } } } @@ -115,7 +128,17 @@ async function load() { const mf = join(ROOT, 'public', TREE_NAME, 'manifest.json') const manifest = existsSync(mf) ? JSON.parse(readFileSync(mf, 'utf8')) : null const bundleExists = (b, p) => existsSync(join(ROOT, 'plugin-designs', b, `${p}.vue`)) - return { ...tabs, STRINGS, meta, manifest, bundleExists } + const pluginTitles = {} + for (const [id, [file, key]] of Object.entries(LABEL_FOLLOWS)) { + pluginTitles[id] = {} + for (const l of Object.keys(STRINGS)) { + const f = join(ROOT, 'library/i18n/locales', l, file) + let v + try { const j = JSON.parse(readFileSync(f, 'utf8')); v = key.split('.').reduce((o, k) => (o == null ? o : o[k]), j) } catch { v = undefined } + pluginTitles[id][l] = v + } + } + return { ...tabs, STRINGS, meta, manifest, bundleExists, pluginTitles } } function selfTest(base) { @@ -130,6 +153,7 @@ function selfTest(base) { ['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/], ['D: composes drift', (c) => { c.meta = { ...c.meta, composes: c.meta.composes.slice(1) } }, /^D: the rail shows/], ['D: composes a ref the rail cannot show', (c) => { c.meta = { ...c.meta, composes: [...c.meta.composes, 'key-cities/key-cities'] } }, /^D: meta composes/], + ['F: a rail label drifts from the plugin title', (c) => { c.STRINGS = clone(c.STRINGS); c.STRINGS.ar['tab.bless-india-posters'] = 'باركوا الهند: ملصقات' }, /^F: ar: tab\.bless-india-posters is/], ['E: a locale loses a key', (c) => { c.STRINGS = clone(c.STRINGS); delete c.STRINGS.ar['tab.upg-100'] }, /^E: ar is missing "tab.upg-100"/], ['E: a row without an English label', (c) => { c.STRINGS = clone(c.STRINGS); delete c.STRINGS.en['tab.bible-posters'] }, /^E: the shell reads "tab.bible-posters"/], ] diff --git a/plugin-designs/posterverse/src/strings.js b/plugin-designs/posterverse/src/strings.js index 1456e526a..c2c31c12c 100644 --- a/plugin-designs/posterverse/src/strings.js +++ b/plugin-designs/posterverse/src/strings.js @@ -35,7 +35,7 @@ export const STRINGS = { 'tab.poster-design': 'Diseño de carteles', 'sub.poster-design': 'todos los estilos y tamaños de cartel', 'tab.wall-of-people-groups': 'Muro de los pueblos', 'tab.bible-posters': 'Carteles bíblicos', - 'tab.bless-india-posters': 'Bendigan a la India: carteles', + 'tab.bless-india-posters': 'Pósteres «Bendice a la India»', 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.', @@ -50,7 +50,7 @@ export const STRINGS = { 'tab.poster-design': 'Conception d’affiches', 'sub.poster-design': 'tous les styles et formats d’affiche', 'tab.wall-of-people-groups': 'Mur des peuples', 'tab.bible-posters': 'Affiches bibliques', - 'tab.bless-india-posters': 'Bénissez l’Inde : affiches', + 'tab.bless-india-posters': 'Affiches « Bénis l’Inde »', 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.", @@ -65,7 +65,7 @@ export const STRINGS = { 'tab.poster-design': 'Postergestaltung', 'sub.poster-design': 'alle Posterstile und -größen', 'tab.wall-of-people-groups': 'Wand der Volksgruppen', 'tab.bible-posters': 'Bibelposter', - 'tab.bless-india-posters': 'Segnet Indien: Poster', + 'tab.bless-india-posters': '„Segne Indien“-Poster', experimentalSub: 'experimentelle Karte', lab: 'Beta', loading: '{label} wird geladen…', loadFailed: '{label} konnte nicht geladen werden.', manifestHint: 'Dieser Tab wird aus manifest.json zusammengesetzt – bauen Sie den Baum oder stellen Sie den gebauten Baum bereit, um ihn zu laden.', @@ -80,7 +80,7 @@ export const STRINGS = { 'tab.poster-design': 'Design de cartazes', 'sub.poster-design': 'todos os estilos e tamanhos de cartaz', 'tab.wall-of-people-groups': 'Mural dos povos', 'tab.bible-posters': 'Cartazes bíblicos', - 'tab.bless-india-posters': 'Abençoem a Índia: cartazes', + 'tab.bless-india-posters': 'Pôsteres «Abençoe a Índia»', 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.', @@ -95,7 +95,7 @@ export const STRINGS = { 'tab.poster-design': 'Design dei poster', 'sub.poster-design': 'tutti gli stili e i formati dei poster', 'tab.wall-of-people-groups': 'Muro dei popoli', 'tab.bible-posters': 'Poster biblici', - 'tab.bless-india-posters': 'Benedite l’India: poster', + 'tab.bless-india-posters': 'Poster «Benedici l’India»', 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.", @@ -110,7 +110,7 @@ export const STRINGS = { 'tab.poster-design': 'Design de afișe', 'sub.poster-design': 'toate stilurile și dimensiunile de afiș', 'tab.wall-of-people-groups': 'Zidul popoarelor', 'tab.bible-posters': 'Afișe biblice', - 'tab.bless-india-posters': 'Binecuvântați India: afișe', + 'tab.bless-india-posters': 'Postere „Binecuvântează India”', 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.', @@ -125,7 +125,7 @@ export const STRINGS = { 'tab.poster-design': 'Дизайн плакатов', 'sub.poster-design': 'все стили и размеры плакатов', 'tab.wall-of-people-groups': 'Стена народов', 'tab.bible-posters': 'Библейские плакаты', - 'tab.bless-india-posters': 'Благословляйте Индию: плакаты', + 'tab.bless-india-posters': 'Плакаты «Благослови Индию»', experimentalSub: 'экспериментальная карта', lab: 'бета', loading: 'Загрузка: {label}…', loadFailed: 'Не удалось загрузить: {label}.', manifestHint: 'Эта вкладка собирается из manifest.json — соберите дерево или разместите собранное дерево, чтобы загрузить её.', @@ -140,7 +140,7 @@ export const STRINGS = { 'tab.poster-design': 'تصميم الملصقات', 'sub.poster-design': 'كل أنماط الملصقات وأحجامها', 'tab.wall-of-people-groups': 'جدار الشعوب', 'tab.bible-posters': 'ملصقات الكتاب المقدس', - 'tab.bless-india-posters': 'باركوا الهند: ملصقات', + 'tab.bless-india-posters': 'ملصقات باركوا الهند', experimentalSub: 'خريطة تجريبية', lab: 'تجريبي', loading: 'جارٍ تحميل {label}…', loadFailed: 'تعذّر تحميل {label}.', manifestHint: 'تُبنى علامة التبويب هذه من manifest.json — ابنِ الشجرة أو قدّم الشجرة المبنية لتحميلها.', @@ -155,7 +155,7 @@ export const STRINGS = { 'tab.poster-design': 'पोस्टर डिज़ाइन', 'sub.poster-design': 'हर पोस्टर शैली और आकार', 'tab.wall-of-people-groups': 'जनसमूहों की दीवार', 'tab.bible-posters': 'बाइबल पोस्टर', - 'tab.bless-india-posters': 'भारत को आशीष दो: पोस्टर', + 'tab.bless-india-posters': 'भारत को आशीष दें — पोस्टर', experimentalSub: 'प्रायोगिक मानचित्र', lab: 'बीटा', loading: '{label} लोड हो रहा है…', loadFailed: '{label} लोड नहीं हो सका।', manifestHint: 'यह टैब manifest.json से बनता है — इसे लोड करने के लिए ट्री बनाएँ या बना हुआ ट्री सर्व करें।', @@ -170,7 +170,7 @@ export const STRINGS = { 'tab.poster-design': '海报设计', 'sub.poster-design': '所有海报样式与尺寸', 'tab.wall-of-people-groups': '民族之墙', 'tab.bible-posters': '圣经海报', - 'tab.bless-india-posters': '祝福印度:海报', + 'tab.bless-india-posters': '祝福印度海报', experimentalSub: '实验性地图', lab: '测试版', loading: '正在加载{label}…', loadFailed: '无法加载{label}。', manifestHint: '此标签页由 manifest.json 组成——请构建目录树或提供已构建的目录树以加载它。', From 9652986c1a218c6b2cccb18f189f38d2626c0447 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 18:35:25 +0000 Subject: [PATCH 2/2] Rebuild posterverse for the Bless India rail label, 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 f60c90164..aed3bfece 100644 --- a/public/dx-maps/doxa-maps-spa/manifest.json +++ b/public/dx-maps/doxa-maps-spa/manifest.json @@ -1382,7 +1382,7 @@ "bundle": "posterverse", "scriptUrl": "./posterverse/posterverse.js", "output": "dx-maps/posterverse/posterverse.js", - "integrity": "sha384-HTRxdoXjuz/Pt8Z0ReAFj1n2FoKHopWMbxkQ0Ph3lmaonh3ux0r5Gd4z7F8MoIj9", + "integrity": "sha384-fhGrEVacRshXwvvIkRf5ki1FVUD3KZ+f5BoNMKO/n7AnkUnjRzhQsZb5/N9zO7Lq", "elements": [ "posterverse-app" ], @@ -1409,7 +1409,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 f60c90164..aed3bfece 100644 --- a/public/dx-maps/manifest.json +++ b/public/dx-maps/manifest.json @@ -1382,7 +1382,7 @@ "bundle": "posterverse", "scriptUrl": "./posterverse/posterverse.js", "output": "dx-maps/posterverse/posterverse.js", - "integrity": "sha384-HTRxdoXjuz/Pt8Z0ReAFj1n2FoKHopWMbxkQ0Ph3lmaonh3ux0r5Gd4z7F8MoIj9", + "integrity": "sha384-fhGrEVacRshXwvvIkRf5ki1FVUD3KZ+f5BoNMKO/n7AnkUnjRzhQsZb5/N9zO7Lq", "elements": [ "posterverse-app" ], @@ -1409,7 +1409,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 d827d5e54..2bed324c5 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","tab.bless-india-posters":"Bless India Posters",experimentalSub:"experimental bundle",lab:"lab",loading:"Loading {label}…",loadFailed:"Could not load {label}.",manifestHint:"This tab is composed from manifest.json — build the tree, or serve the built tree, to load it.",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","tab.bless-india-posters":"Bendigan a la India: carteles",experimentalSub:"mapa experimental",lab:"beta",loading:"Cargando {label}…",loadFailed:"No se pudo cargar {label}.",manifestHint:"Esta pestaña se compone a partir de manifest.json: compila el árbol o sirve el árbol compilado para cargarla.",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","tab.bless-india-posters":"Bénissez l’Inde : affiches",experimentalSub:"carte expérimentale",lab:"bêta",loading:"Chargement de {label}…",loadFailed:"Impossible de charger {label}.",manifestHint:"Cet onglet est composé à partir de manifest.json : construisez l'arborescence ou servez l'arborescence construite pour le charger.",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","tab.bless-india-posters":"Segnet Indien: Poster",experimentalSub:"experimentelle Karte",lab:"Beta",loading:"{label} wird geladen…",loadFailed:"{label} konnte nicht geladen werden.",manifestHint:"Dieser Tab wird aus manifest.json zusammengesetzt – bauen Sie den Baum oder stellen Sie den gebauten Baum bereit, um ihn zu laden.",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","tab.bless-india-posters":"Abençoem a Índia: cartazes",experimentalSub:"mapa experimental",lab:"beta",loading:"Carregando {label}…",loadFailed:"Não foi possível carregar {label}.",manifestHint:"Esta aba é composta a partir do manifest.json — compile a árvore ou sirva a árvore compilada para carregá-la.",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","tab.bless-india-posters":"Benedite l’India: poster",experimentalSub:"mappa sperimentale",lab:"beta",loading:"Caricamento di {label}…",loadFailed:"Impossibile caricare {label}.",manifestHint:"Questa scheda è composta da manifest.json: compila l'albero o pubblica l'albero compilato per caricarla.",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","tab.bless-india-posters":"Binecuvântați India: afișe",experimentalSub:"hartă experimentală",lab:"beta",loading:"Se încarcă {label}…",loadFailed:"{label} nu a putut fi încărcat.",manifestHint:"Această filă este compusă din manifest.json — construiți arborele sau serviți arborele construit pentru a o încărca.",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":"Библейские плакаты","tab.bless-india-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":"ملصقات الكتاب المقدس","tab.bless-india-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":"बाइबल पोस्टर","tab.bless-india-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":"圣经海报","tab.bless-india-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"},{id:"bless-india-posters",section:"experimental",icon:"flask",bundle:"bless-india-posters",profile:"bless-india-posters",scroll:!0}],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=t.scroll?"display:block;position:static;width:100%;height:auto;":"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","tab.bless-india-posters":"Bless India Posters",experimentalSub:"experimental bundle",lab:"lab",loading:"Loading {label}…",loadFailed:"Could not load {label}.",manifestHint:"This tab is composed from manifest.json — build the tree, or serve the built tree, to load it.",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","tab.bless-india-posters":"Pósteres «Bendice a la India»",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","tab.bless-india-posters":"Affiches « Bénis l’Inde »",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","tab.bless-india-posters":"„Segne Indien“-Poster",experimentalSub:"experimentelle Karte",lab:"Beta",loading:"{label} wird geladen…",loadFailed:"{label} konnte nicht geladen werden.",manifestHint:"Dieser Tab wird aus manifest.json zusammengesetzt – bauen Sie den Baum oder stellen Sie den gebauten Baum bereit, um ihn zu laden.",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","tab.bless-india-posters":"Pôsteres «Abençoe a Índia»",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","tab.bless-india-posters":"Poster «Benedici l’India»",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","tab.bless-india-posters":"Postere „Binecuvântează India”",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":"Библейские плакаты","tab.bless-india-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":"ملصقات الكتاب المقدس","tab.bless-india-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":"बाइबल पोस्टर","tab.bless-india-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":"圣经海报","tab.bless-india-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"},{id:"bless-india-posters",section:"experimental",icon:"flask",bundle:"bless-india-posters",profile:"bless-india-posters",scroll:!0}],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=t.scroll?"display:block;position:static;width:100%;height:auto;":"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 58288ca94..e5c74f558 100644 --- a/public/dx-maps/posterverse/posterverse/app/index.html +++ b/public/dx-maps/posterverse/posterverse/app/index.html @@ -67,7 +67,7 @@ - + - +