From 174385d75e2f9c0077ec080d199b9d54bf778393 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 16:18:41 +0000 Subject: [PATCH 1/6] Gallery: Bless India Posters mounts at natural height when it joins Experimental --- plugin-designs/doxa-maps-spa/doxa-maps-spa.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue b/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue index c4c1fcd7b..6e864a5f3 100644 --- a/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue +++ b/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue @@ -570,7 +570,9 @@ const HEAVY_ELEMENTS = new Set([ // The two composites here are exactly the two bundle ids that use StackLayout as their OWN root — // same identification method as HEAVY_ELEMENTS (measured against the tree, not guessed), and it is // not a coincidence that both entries already appear in that set too (they also nest a map). -const SCROLL_ELEMENTS = new Set(['dashboard-plus-grid', 'research-map-plus-grid']) +// bless-india-posters is a natural-height page of poster cards (its owner's mount note): pinned, the grid +// would be trapped in one viewport, so it scrolls in the pane like the two composites. +const SCROLL_ELEMENTS = new Set(['dashboard-plus-grid', 'research-map-plus-grid', 'bless-india-posters']) // The set of bundle ids the CURATED sections above already place, derived from NAV_MODEL + TAB_DEFS // rather than hand-written. Deriving it means the "is this already placed?" answer can never drift From 441fb6d92dc9c93bac98c419fc0f0a2e8112a158 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 16:31:01 +0000 Subject: [PATCH 2/6] Rebuild the gallery for the Bless India Posters mount, and regenerate the tree and SRI --- public/dx-maps/doxa-maps-spa/doxa-maps-spa.js | 2 +- public/dx-maps/doxa-maps-spa/doxa-maps-spa/app/index.html | 2 +- public/dx-maps/doxa-maps-spa/doxa-maps-spa/index.html | 2 +- public/dx-maps/doxa-maps-spa/manifest.json | 4 ++-- public/dx-maps/manifest.json | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/dx-maps/doxa-maps-spa/doxa-maps-spa.js b/public/dx-maps/doxa-maps-spa/doxa-maps-spa.js index 844a01dbd..401b5f043 100644 --- a/public/dx-maps/doxa-maps-spa/doxa-maps-spa.js +++ b/public/dx-maps/doxa-maps-spa/doxa-maps-spa.js @@ -286,4 +286,4 @@ .mi-pointer, .mi .mi-pointer.mi-ctl{ animation:none; } .mi-chev{ transition:none; } } -`,"map-info"),(k,K)=>(C(),N("div",{ref_key:"rootEl",ref:Ne,class:"mi",dir:v()?"rtl":"ltr",lang:n()},[Ra(O("button",{ref_key:"btnEl",ref:V,type:"button",class:Ge(["mi-btn",e.placement==="top-left"?"mi-at-left":"mi-at-right"]),"aria-label":ye(s)("mapInfo.open"),title:ye(s)("mapInfo.open"),"aria-haspopup":"dialog","aria-expanded":String(H.value),onClick:xe},[...K[1]||(K[1]=[O("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false"},[O("circle",{cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"2"}),O("path",{d:"M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}),O("circle",{cx:"12",cy:"17",r:"1.3",fill:"currentColor"})],-1)])],10,fh),[[Za,z()]]),W.value&&!H.value&&z()?(C(),N("div",{key:0,class:Ge(["mi-pointer",e.placement==="top-left"?"mi-at-left":"mi-at-right"]),"aria-hidden":"true"},[O("span",null,B(ye(s)("mapInfo.pointer")),1),(C(),N("svg",hh,[e.placement==="top-left"?(C(),N("path",bh)):(C(),N("path",$h))]))],2)):se("",!0),W.value&&!H.value&&!z()&&f.value?(C(),N("div",{key:1,class:Ge(["mi-pointer mi-ctl",["mi-ctl-"+f.value.side,{"mi-ctl-strip":f.value.strip}]]),style:Ea(x()),"aria-hidden":"true"},[O("span",{dir:v()?"rtl":"ltr"},B(ye(s)("mapInfo.pointer")),9,_h),(C(),N("svg",vh,[f.value.side==="left"?(C(),N("path",yh)):(C(),N("path",wh))]))],6)):se("",!0),H.value?(C(),N("div",{key:2,class:"mi-scrim",onClick:jo(nt,["self"]),onKeydown:L},[O("div",{ref_key:"dialogEl",ref:I,class:"mi-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"mi-title-"+e.storageKey},[O("div",xh,[O("h2",{id:"mi-title-"+e.storageKey,class:"mi-title"},B(ye(s)("mapInfo.title")),9,Sh),O("button",{ref_key:"closeEl",ref:fe,type:"button",class:"mi-close","aria-label":ye(s)("mapInfo.close"),onClick:nt},"×",8,Lh)]),O("div",Th,[e.leadKey||e.lead?(C(),N("section",{key:0,class:"mi-bluf","aria-labelledby":"mi-bluf-"+e.storageKey},[O("h3",{id:"mi-bluf-"+e.storageKey,class:"mi-bluf-h"},B(ye(s)("mapInfo.shortDescription")),9,Eh),O("p",Oh,B(r(e.leadKey,e.lead)),1)],8,Ph)):se("",!0),(e.takeawayKey||e.takeaway)&&!c()?(C(),N("p",Mh,[O("b",null,B(ye(s)("mapInfo.takeaway")),1),Kt(" "+B(r(e.takeawayKey,e.takeaway)),1)])):se("",!0),c()?(C(),N("details",{key:"st-"+o.value,class:"mi-strategy"},[O("summary",Ah,[O("span",null,B(ye(s)("mapInfo.tabStrategy")),1),K[2]||(K[2]=O("span",{class:"mi-chev","aria-hidden":"true"},"▾",-1))]),O("p",Ch,B(l()),1),p().length?(C(),N("ul",Ih,[(C(!0),N(ne,null,Xe(p(),(Y,oe)=>(C(),N("li",{key:oe},B(Y),1))),128))])):se("",!0)])):se("",!0),(C(!0),N(ne,null,Xe(e.examples,(Y,oe)=>Ra((C(),N("section",{key:oe,class:"mi-ex"},[O("h3",null,B(Te(Y)),1),Y.kind==="image"?(C(),N(ne,{key:0},[O("img",{class:"mi-img mi-poster",src:ce(Y.src),alt:Y.alt||Te(Y),decoding:"async",onError:ge=>Q[oe]=!0},null,40,Nh),Y.full?(C(),N("div",Fh,[O("a",{class:"mi-full",href:ce(Y.full),target:"_blank",rel:"noopener"},B(ye(s)("mapInfo.openFull")),9,Dh)])):se("",!0)],64)):Y.kind==="pages"&&(Y.pages||[]).length?(C(),N(ne,{key:1},[ke[oe]?(C(),N(ne,{key:1},[O("div",jh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"true",onClick:ge=>G(oe)},B(ye(s)("mapInfo.collapsePages")),9,Uh)]),O("div",Hh,[(C(!0),N(ne,null,Xe(Y.pages,(ge,Oe)=>(C(),N("button",{key:Oe,type:"button",class:"mi-hit mi-open mi-page","aria-label":ye(s)("mapInfo.collapsePages"),onClick:Ht=>G(oe)},[O("img",{class:"mi-img",src:ce(ge),alt:Te(Y)+" "+m(Oe+1),loading:"lazy",decoding:"async",onError:ee},null,40,Bh)],8,Vh))),128))]),O("div",Gh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"true",onClick:ge=>G(oe)},B(ye(s)("mapInfo.collapsePages")),9,Kh)])],64)):(C(),N(ne,{key:0},[O("button",{type:"button",class:Ge(["mi-hit mi-page",{"mi-stack":Y.pages.length>1}]),"aria-label":ye(s)("mapInfo.expandPages",{n:m(Y.pages.length)}),"aria-expanded":"false",onClick:ge=>G(oe)},[O("img",{class:"mi-img",src:ce(Y.pages[0]),alt:Te(Y),decoding:"async",onError:ge=>Q[oe]=!0},null,40,zh)],10,Rh),Y.pages.length>1?(C(),N("div",qh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"false",onClick:ge=>G(oe)},B(ye(s)("mapInfo.expandPages",{n:m(Y.pages.length)})),9,Wh)])):se("",!0)],64))],64)):Y.kind==="deck"&&(Y.cards||[]).length?(C(),N(ne,{key:2},[ke[oe]?(C(),N(ne,{key:1},[O("div",Qh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"true",onClick:ge=>G(oe)},B(ye(s)("mapInfo.collapseDeck")),9,eb)]),O("div",tb,[(C(!0),N(ne,null,Xe(Y.cards,(ge,Oe)=>(C(),N("img",{key:Oe,class:"mi-img",src:ce(ge),alt:Te(Y)+" "+m(Oe+1),loading:"lazy",decoding:"async",onError:ee},null,40,ab))),128))]),O("div",ob,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"true",onClick:ge=>G(oe)},B(ye(s)("mapInfo.collapseDeck")),9,nb)])],64)):(C(),N(ne,{key:0},[O("button",{type:"button",class:"mi-hit mi-deck","aria-label":ye(s)("mapInfo.expandDeck",{n:m(Y.cards.length)}),"aria-expanded":"false",onClick:ge=>G(oe)},[(C(!0),N(ne,null,Xe(Ut(Y),(ge,Oe)=>(C(),N("img",{key:Oe,class:"mi-card",src:ce(ge),alt:"",decoding:"async",onError:Ht=>Oe===0?Q[oe]=!0:ee(Ht),style:Ea({insetInlineStart:Oe*36+"px",transform:"rotate("+(Oe-2)*4+"deg)",zIndex:10-Oe})},null,44,Yh))),128))],8,Xh),O("div",Jh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"false",onClick:ge=>G(oe)},B(ye(s)("mapInfo.expandDeck",{n:m(Y.cards.length)})),9,Zh)])],64))],64)):Y.kind==="table"&&(Y.columns||[]).length?(C(),N(ne,{key:3},[O("div",sb,[O("table",rb,[O("thead",null,[O("tr",null,[(C(!0),N(ne,null,Xe(Y.columns,(ge,Oe)=>(C(),N("th",{key:Oe,scope:"col"},B(co(ge)),1))),128))])]),O("tbody",null,[(C(!0),N(ne,null,Xe(Y.rows||[],(ge,Oe)=>(C(),N("tr",{key:Oe},[(C(!0),N(ne,null,Xe(ge,(Ht,Kb)=>(C(),N("td",{key:Kb},B(typeof Ht=="number"?m(Ht):Ht),1))),128))]))),128))])])]),Y.total&&Y.total>(Y.rows||[]).length?(C(),N("p",ib,B(ye(s)("mapInfo.moreRows",{n:m(Y.total-(Y.rows||[]).length)})),1)):se("",!0)],64)):se("",!0)])),[[Za,!Q[oe]]])),128)),e.noteKey||e.note?(C(),N("p",lb,B(r(e.noteKey,e.note)),1)):se("",!0)]),a()?se("",!0):(C(),N("div",cb,[O("label",null,[O("input",{type:"checkbox",checked:y.value,onChange:K[0]||(K[0]=Y=>F(Y.target.checked))},null,40,pb),O("span",null,B(ye(s)("mapInfo.pointerOff")),1)])]))],8,kh)],32)):se("",!0)],8,mh))}},db=":host{display:block;position:relative;height:var(--doxa-maps-spa-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}.dms-pane{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;--profile-min-h: 0}.mi.dms-info-raise .mi-btn{z-index:60}.dms-slot{position:relative;min-height:100%}.dms-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}.dms-hint.err{color:#f87171}.dms-hint small{color:var(--dx-muted, #6d766e)}.dms-help-close:focus-visible{outline:2px solid #3f8f5a;outline-offset:2px}.dms-help-scrim{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;display:flex;align-items:center;justify-content:center;background:#00000059;padding:16px}.dms-help{max-width:420px;width:100%;color:#3b463d;background:#fff;border-radius:12px;padding:18px 20px 14px;box-shadow:0 12px 32px #0003;font-size:14px;line-height:1.5}.dms-help-title{margin:0 0 8px;font-size:16px}.dms-help-what,.dms-help-how{margin:0 0 10px}.dms-help-close{float:right;font:inherit;padding:6px 14px;border-radius:8px;border:1px solid #d1d4cd;background:#f3f3f1;cursor:pointer}.dms-notice{position:fixed;left:50%;bottom:24px;transform:translate(-50%);z-index:40;max-width:320px;text-align:center;font-size:13px;line-height:1.4;color:#3b463d;background:#fff;border:1px solid #d1d4cd;border-radius:10px;padding:10px 16px;box-shadow:0 8px 24px #0000001f}.dms-mobile-notice{position:sticky;top:0;z-index:30;display:flex;align-items:flex-start;gap:8px;padding:10px 12px;font-size:13px;line-height:1.4;color:#3b463d;background:#fff8e6;border-bottom:1px solid #f0d58c}.dms-mobile-notice span{flex:1}.dms-mobile-notice-x{flex:none;min-width:32px;min-height:32px;border:0;border-radius:6px;background:transparent;color:inherit;font-size:18px;line-height:1;cursor:pointer}.dms-mobile-notice-x:focus-visible{outline:2px solid #3b463d;outline-offset:1px}.dms-logo{display:inline-flex;align-items:center}.dms-logo svg{display:block}.dms-locale{position:relative;padding:8px 12px 0;display:flex;justify-content:flex-end}.dms-locale-btn{display:inline-flex;align-items:center;gap:8px;font:inherit;font-size:12px;padding:5px 10px;border:1px solid #d1d4cd;border-radius:8px;background:#d1d4cd;color:#3b463d;cursor:pointer}.dms-locale-btn:hover{background:#d1d4cd}.dms-flag{font-size:14px;line-height:1}.dms-locale-name{max-width:12ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dms-dots{color:#6d766e;margin-left:2px}.dms-locale-menu{position:absolute;top:100%;right:12px;margin-top:4px;z-index:30;min-width:180px;list-style:none;padding:6px;border:1px solid #d1d4cd;border-radius:10px;background:#fff;box-shadow:0 12px 32px #00000080;max-height:320px;overflow:auto}.dms-locale-opt{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;font-size:13px;padding:7px 9px;border:0;border-radius:7px;background:none;color:#3b463d;cursor:pointer}.dms-locale-opt:hover,.dms-locale-opt.active{background:#d1d4cd;color:#3b463d}.dms-locale-opt.active .dms-locale-name{color:#92b195}.dms-locale-en{margin-left:auto;font-size:11px;color:#6d766e}";function Ml(){try{const e=new URLSearchParams(location.search),t=(e.get("lang")||e.get("locale")||"").split("-")[0].toLowerCase();if(us.includes(t))return t}catch{}try{const e=(document.documentElement.lang||"").split("-")[0].toLowerCase();if(us.includes(e))return e}catch{}return""}const gs=[{key:"dashboards",label:"Dashboards",i18n:"sec.dashboards",icon:"chart",tabs:[{id:"dashboard-plus-grid",icon:"chart"},{id:"research-map-plus-grid",icon:"map"},{id:"regions-dashboard",icon:"map"}]},{key:"prayer-mobilization",label:"Prayer Mobilization",i18n:"sec.prayer",icon:"heart",tabs:[{id:"prayer-map",icon:"embed"},{id:"upg-100",icon:"list"},{id:"country-posters",icon:"poster"},{id:"poster-design",icon:"grid"}]},{key:"gospel-research",label:"Gospel Research",i18n:"sec.gospel",icon:"search",tabs:[{id:"cities-internet",icon:"wifi"},{id:"gospel-resources",icon:"book"}]},{key:"experimental",label:"Experimental",i18n:"sec.experimental",icon:"flask",folder:!0,open:!1,tabs:[]}];function gb(e){const t={},a=e&&Array.isArray(e.bundles)?e.bundles:[];for(const o of a)for(const n of Array.isArray(o&&o.profiles)?o.profiles:[])n&&(n.mobile==="desktop-only"||n.mobile==="larger-screens")&&(t[o.bundle+"/"+n.profile]=n.mobile);return t}const mb=new Set(["doxa-maps-spa","plugin-studio","template-bundle","people-groups-grid","research-dashboard","big-picture","demo-map","golden-path-check","doxa-research-map","stack-demo","posterverse","bible-posters","poster-sections"]),Al={"prayer-walk-planner":1,"gospel-internet":2,"upg-neighbor":3,"key-cities":4,"all-people-groups":5,"doxa-vision-card":7},ms=[{id:"dashboard-plus-grid",label:"Big Picture",sub:"dashboard + people-groups grid, stacked",emoji:"🌍",bundle:"dashboard-plus-grid",profile:"dashboard-plus-grid"},{id:"research-map",label:"Research Map",sub:"prayer · engagement · regions",emoji:"🗺️",bundle:"doxa-research-map",profile:"research-map"},{id:"research-map-plus-grid",label:"Simple Research",sub:"research map + people-groups grid",emoji:"🗺️",bundle:"research-map-plus-grid",profile:"research-map-plus-grid"},{id:"prayer-map",label:"Prayer Progress",sub:"simple world prayer map",emoji:"🙏",bundle:"doxa-simple-map",profile:"doxa-simple-map",instance:"prayer"},{id:"cities-internet",label:"Cities with Internet",sub:"connectivity of key cities",emoji:"📡",bundle:"cities-internet",profile:"connectivity-map"},{id:"gospel-resources",label:"Gospel Resources",sub:"resources by place",emoji:"📖",bundle:"gospel-resources",profile:"resources-map"},{id:"regions-dashboard",label:"Regions",sub:"regions and their countries",emoji:"🌐",bundle:"regions-dashboard",profile:"regions-mfe"},{id:"upg-100",label:"UPG 100 List Posters",sub:"my unreached list + posters",emoji:"📋",bundle:"my-upg-100-list",profile:"upg-100-mfe"},{id:"country-posters",label:"Country Posters",sub:"a poster for every country",emoji:"🗺️",bundle:"country-posters",profile:"country-posters-mfe"},{id:"poster-design",label:"Poster Design",sub:"every poster style and size",emoji:"🎨",bundle:"poster-design",profile:"poster-design-mfe"}];hb(gs);const en=new Set(["doxa-research-map","doxa-simple-map","cities-internet-map","gospel-resources-map","my-upg-100-list-map","doxa-map","doxa-maps-spa","dashboard-plus-grid","research-dashboard-map","demo-map","all-people-groups","country-posters-map","key-cities-map","research-map-plus-grid","gospel-internet-board"]),tn=new Set(["dashboard-plus-grid","research-map-plus-grid"]);function fb(){const e=Object.fromEntries(ms.map(a=>[a.id,a])),t=new Set;for(const a of gs)if(a.key!=="experimental")for(const o of a.tabs||[]){const n=e[o.id];n&&n.bundle&&t.add(n.bundle)}return t}function Cl(e,t){const a=[];for(const o of e)!o||t.has(o.key)||(t.add(o.key),a.push(o));return a}function hb(e){const t=new Map,a=[];for(const o of e)if(o.key!=="experimental")for(const n of o.tabs||[]){if(!n||!n.id)continue;const s=t.get(n.id);if(s===void 0){t.set(n.id,o.key);continue}(s!==o.key||a.indexOf(n.id)===-1)&&a.push(n.id+" ("+s+" + "+o.key+")")}return a.length&&typeof console<"u"&&console.error("[doxa-maps-spa] duplicate tab key(s) across NAV_MODEL sections: "+a.join(", ")+" — VerticalTabsLayout keys its tab-ref map and `active` highlight by id, so a row declared in two sections paints twice and stalls keyboard nav. See the duplicate-key trap in SPEC-the-six-map-product-and-its-tab-order.md."),a}const Il="dxm.treeFingerprint@";function bb(e){const a=(e&&Array.isArray(e.bundles)?e.bundles:[]).map(n=>(n&&n.bundle)+":"+(n&&n.integrity||"")).join("|");let o=2166136261;for(let n=0;n>>0).toString(36)+"."+a.length}function $b(e){try{return localStorage.getItem(Il+e)}catch{return null}}function _b(e,t){try{localStorage.setItem(Il+e,t)}catch{}}function vb(e){return String(e).split(/[-_]/).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function yb(e){const t=fb(),a=e&&Array.isArray(e.bundles)?e.bundles:[],o=[];for(const n of a){const s=n&&n.bundle;if(!s||t.has(s)||mb.has(s)||n.stage==="production")continue;const r=Array.isArray(n.profiles)?n.profiles:[];if(!r.length||r.every(c=>c.widget||Array.isArray(c.targets)&&!c.targets.includes("web")))continue;const i=r.find(c=>c.isMap)||r.find(c=>c.profile===s)||r[0],l=i.element||Array.isArray(n.elements)&&n.elements[0]||s,p=n.scriptUrl||i.scriptUrl||"";p&&o.push({id:s,label:i.title||vb(s),sub:(i.description||"").trim().replace(/[,;]\s*$/,"")||"experimental bundle",emoji:"🧪",tag:l,bundle:s,profile:i.profile||s,scriptUrl:p,heavy:en.has(l)||en.has(s),scroll:tn.has(l)||tn.has(s),discovered:!0})}return o.sort((n,s)=>{const r=Al[n.id]||999,i=Al[s.id]||999;return r!==i?r-i:n.label.localeCompare(s.label)}),o}function wb(e,t){const a=e&&Array.isArray(e.bundles)?e.bundles:[],o=Object.fromEntries(a.map(s=>[s.bundle,s])),n={};for(const s of t){const r=o[s.bundle];if(!r)continue;const i=Array.isArray(r.profiles)?r.profiles:[],l=i.find(w=>w.profile===s.profile)||i[0],p=l&&l.element||Array.isArray(r.elements)&&r.elements[0]||s.bundle,c=r.scriptUrl||l&&l.scriptUrl||"";if(!c)continue;const m=l&&Array.isArray(l.instances)?l.instances:[],v=!!(s.instance&&m.some(w=>(w&&(w.id||w.instance))===s.instance));n[s.id]={tag:p,scriptUrl:c,profile:l&&l.profile||s.profile,instance:v?s.instance:"",heavy:en.has(p)||en.has(s.bundle),scroll:tn.has(p)||tn.has(s.bundle)}}return n}const kb=$a({name:"DoxaMapsSpa",inheritAttrs:!1,components:{VerticalTabsLayout:Gf,BackToTopButton:ri,MapInfo:ub,ShellLanguageMenu:lh},props:{treeBase:{type:String,default:""},profileConfig:{type:[String,Object],default:""},heading:{type:String,default:"Deep Research"},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:ba("dmsTreeBase","")}},data(){return{paneEls:{},activeIndex:0,showHeader:!1,narrow:!1,_mql:null,_onMedia:null,disabledNotice:"",_noticeTimer:null,helpOpen:!1,mobileNoticeDismissed:{},mobileFlags:null,manifestError:"",manifestBase:"",runtime:{},locale:Kf(),hostLang:Ml(),sessionPick:"",localeOpen:!1,switcherLangs:kl,tabs:ms.map(e=>({...e,tag:"",scriptUrl:"",heavy:!1,scroll:!1,resolved:!1,mounted:!1,state:"idle",error:""}))}},computed:{largerScreenText(){return Wt("messages.largerScreenNotice",this.uiLocale)||"This experimental map is built for larger screens. It opens here, but parts of it may not fit or work well on a phone."},activePaneEl(){return this.paneEls[this.activeIndex]||null},activeHelp(){const e=this.tabs[this.activeIndex];return e&&e.discovered?Tl(e.id,this.uiLocale):null},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=(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":""},showInfo(){const e=this.cfg.info;return!(e===!1||e==="false"||e==="off")},headingText(){return String(this.cfg.heading||this.heading||"").trim()||"Deep Research"},showExperimental(){const e=this.cfg.experimental;return!(e===!1||e==="false"||e==="hidden"||e==="off")},navGroups(){const e=Object.fromEntries(this.tabs.map(a=>[a.id,a])),t=new Set;return gs.map(a=>{let o=Cl((a.tabs||[]).filter(n=>e[n.id]).map(n=>{const s=e[n.id],r=this.isDesktopOnly(s.id),i=r||this.mobileFlagOf(s.id)==="desktop-only";return{key:s.id,label:this.tabLabel(s),sub:this.tabSub(s),icon:n.icon,badge:i?this.tr("desktopOnly"):n.badge,disabled:r}}),t);return a.key==="experimental"&&!this.showExperimental?{key:a.key,rows:[]}:(a.key==="experimental"&&(o=o.concat(Cl(this.tabs.filter(n=>n.discovered).map(n=>({key:n.id,label:this.tabLabel(n),sub:this.tabSub(n),icon:"flask",badge:this.narrow&&this.mobileFlagOf(n.id)==="larger-screens"?this.tr("mobileNotBuilt"):this.tr("lab")})),t))),{key:a.key,label:a.i18n?this.tr(a.i18n):a.label,icon:a.icon,folder:!!a.folder,open:a.open,rows:o})}).filter(a=>a.rows.length)},showLocaleSwitcher(){return this.showHeader},activeLang(){return ps(this.locale)||{code:this.locale,flag:"🌐",nativeName:this.locale}},propLocale(){return(this.language||this.cfg.language||this.cfg.locale||this.cfg.lang||"").trim()},effectiveLocale(){const e=this.showLocaleSwitcher?this.locale:"";return(this.sessionPick||this.propLocale||e||this.hostLang||"en").split("-")[0].toLowerCase()},uiLocale(){return us.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:""}},mounted(){this.watchWidth(),this.watchHostLang(),this.select(this.initialIndex()),this.loadManifest(),this._onHostedHelp=e=>this.onHostedHelp(e),this.$el.addEventListener("doxa:help",this._onHostedHelp)},beforeUnmount(){this._langObs&&(this._langObs.disconnect(),this._langObs=null),this._onHostedHelp&&(this.$el.removeEventListener("doxa:help",this._onHostedHelp),this._onHostedHelp=null),!(!this._mql||!this._onMedia)&&(this._mql.removeEventListener?this._mql.removeEventListener("change",this._onMedia):this._mql.removeListener&&this._mql.removeListener(this._onMedia),this._mql=null,this._onMedia=null)},watch:{activeIndex(){this.helpOpen=!1},propLocale(){this.sessionPick=""},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.activeIndex,a=this.tabs[t];!a||!a.mounted||(e(t,a),this.mountElement(t))},tab(e){e&&this.onSelect(e)}},methods:{openHelp(){this.helpOpen=!0,this.$nextTick(()=>this.$refs.helpClose&&this.$refs.helpClose.focus())},closeHelp(){this.helpOpen=!1;const e=this._helpReturn;this._helpReturn=null,this.$nextTick(()=>e&&e.focus&&e.focus())},infoProps(e){const{pos:t,...a}=this.infoFor(e)||{};return a},infoPos(e){const t=(this.infoFor(e)||{}).pos||{},{narrow:a,...o}=t;return this.narrow&&a?{...o,...a}:o},infoStyle(e){const t=this.infoPos(e),a={};return t.top&&(a["--map-info-top"]=t.top),t.side&&(a["--map-info-side"]=t.side),a},infoFor(e){const t=this.showInfo&&e&&dh[e.id];return t&&(!t.leadKey||Wt(t.leadKey,"en"))?t:null},tabHasHelp(e){return!!(e&&e.discovered&&Tl(e.id,this.uiLocale))},onHostedHelp(e){if(!this.activeHelp)return;e.stopPropagation();const t=e.composedPath?e.composedPath():[];this._helpReturn=t.find(a=>a&&a.tagName==="BUTTON")||null,this.openHelp()},setSlot(e,t){t&&(this._slots=Object.assign(this._slots||{},{[e]:t}))},tr(e,t){return Qo(this.uiLocale,e,t)},t(e,t){return Qo(this.uiLocale,e,t)},tabLabel(e){return!e.discovered||ch("tab."+e.id)?Qo(this.uiLocale,"tab."+e.id):e.label},tabSub(e){return e.discovered?this.uiLocale==="en"?e.sub:this.tr("experimentalSub"):Qo(this.uiLocale,"sub."+e.id)},watchHostLang(){typeof MutationObserver>"u"||typeof document>"u"||(this._langObs=new MutationObserver(()=>{this.hostLang=Ml()}),this._langObs.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]}))},watchWidth(){typeof window>"u"||!window.matchMedia||(this._mql=window.matchMedia("(max-width: 760px)"),this.narrow=this._mql.matches,this._onMedia=e=>{const t=this.narrow;this.narrow=!!e.matches,t!==this.narrow&&this.isDesktopOnly(this.activeKey)&&this.select(this.firstVisibleIndex())},this._mql.addEventListener?this._mql.addEventListener("change",this._onMedia):this._mql.addListener&&this._mql.addListener(this._onMedia))},mobileFlagOf(e){const t=this.tabs.find(a=>a.id===e);return t&&this.mobileFlags&&this.mobileFlags[t.bundle+"/"+t.profile]||null},isDesktopOnly(e){return this.narrow&&this.mobileFlagOf(e)==="desktop-only"},showsMobileNotice(e){return this.narrow&&this.mobileFlagOf(e)==="larger-screens"&&!this.mobileNoticeDismissed[e]},dismissMobileNotice(e){this.mobileNoticeDismissed={...this.mobileNoticeDismissed,[e]:!0}},firstVisibleIndex(){let e=-1;for(const t of this.navGroups)for(const a of t.rows){const o=this.tabs.findIndex(n=>n.id===a.key);if(!(o<0)&&(e<0&&(e=o),!a.disabled))return o}return e>=0?e:0},loadManifest(){const e=this.resolve("manifest.json"),t=c=>{try{return new URL(c,location.href).href.replace(/[^/]*$/,"")}catch{return""}},a={url:e,root:t(e)},o={url:this.resolve("doxa-maps-spa/manifest.json"),root:a.root};let n=!1;try{n=new URL(e,location.href).origin!==location.origin}catch{}const s=n?[o,a]:[a,o],r="/public/dx-maps/manifest.json";s.some(c=>c.url===r)||s.push({url:r,root:t(r)});const i=[];let l;this._freshGate=new Promise(c=>{l=c}),setTimeout(l,8e3);const p=c=>{if(c>=s.length){this.manifestError="manifest.json not found (tried "+i.join(", ")+")",console.error("[doxa-maps-spa] "+this.manifestError+" — every tab except Big Picture is composed from it, so their panes cannot mount."),l();return}const{url:m,root:v}=s[c];return i.push(m),fetch(m,{credentials:"same-origin",cache:"no-cache"}).then(w=>{if(!w||!w.ok)throw new Error(m+" → HTTP "+(w?w.status:"?"));return w.json()}).then(w=>{if(!w)throw new Error(m+" → empty");this.manifestError="",this.manifestBase=v||"",this.revalidateBundles(w,v||"").then(l,l),this.applyManifest(w)}).catch(()=>p(c+1))};try{p(0)}catch{l()}},revalidateBundles(e,t){const a=bb(e),o=$b(t);if(o===a)return Promise.resolve();const n=[...new Set((e&&e.bundles||[]).map(p=>p&&p.scriptUrl?this.resolve(p.scriptUrl):"").filter(Boolean))],s=p=>{try{return new URL(p,location.href).origin===location.origin}catch{return!1}},r=p=>s(p)?fetch(p,{mode:"same-origin",credentials:"same-origin",cache:"only-if-cached"}).then(c=>(c&&c.body&&c.body.cancel&&c.body.cancel(),!!(c&&c.ok)),()=>!1):Promise.resolve(o!==null),i=p=>fetch(p,{credentials:"same-origin",cache:"no-cache"}).then(c=>{if(c&&c.status===200&&c.body&&c.body.cancel)return c.body.cancel()}),l=p=>r(p).then(c=>c?i(p):null).catch(()=>{});return Promise.all(n.map(l)).then(()=>_b(t,a))},applyManifest(e){this.runtime=e&&e.runtime&&typeof e.runtime=="object"?e.runtime:{},this.mobileFlags=gb(e),this.applyPageGlobals();const t=wb(e,ms),a=this.activeKey,o=[];for(const l of this.tabs){if(l.discovered){o.push(l);continue}const p=t[l.id];p&&(Object.assign(l,p,{resolved:!0}),o.push(l))}const n=new Set(o.map(l=>l.id));if(this.showExperimental)for(const l of yb(e))n.has(l.id)||o.push({...l,resolved:!0,mounted:!1,state:"idle",error:""});this.tabs=o;const s=this.requestedTab(),r=s?this.tabs.findIndex(l=>l.id===s):-1,i=this.tabs.findIndex(l=>l.id===a);r>=0&&!this.isDesktopOnly(s)&&!this._honouredTab?this.select(r):this.select(i>=0&&!this.isDesktopOnly(a)?i:this.firstVisibleIndex()),this._honouredTab=!0},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.requestedTab(),t=e?this.tabs.findIndex(a=>a.id===e):-1;return t>=0&&(this._honouredTab=!0),t>=0&&!this.isDesktopOnly(e)?t:this.firstVisibleIndex()},setLocale(e){this.locale=e,this.localeOpen=!1,Xf(e)},pickLocale(e){this.setLocale(e),this.sessionPick=e},onSelect(e){if(this.isDesktopOnly(e)){const a=this.tabs.find(o=>o.id===e);this.disabledNotice=(Wt("messages.desktopOnlyNotice",this.uiLocale)||"{label} only supports desktop — open this page on a desktop to use it.").replace("{label}",a?this.tabLabel(a):e),clearTimeout(this._noticeTimer),this._noticeTimer=setTimeout(()=>{this.disabledNotice=""},4e3);return}const t=this.tabs.findIndex(a=>a.id===e);t!==-1&&this.select(t)},resolve(e){const t=String(e);if(/^(https?:)?\/\//.test(t)||t.startsWith("/"))return t;const a=t.replace(/^\.\//,"");return this.manifestBase?this.manifestBase.replace(/\/+$/,"")+"/"+a:this.base?this.base.replace(/\/+$/,"")+"/"+a:"../"+a},select(e){const t=this.activeIndex;if(this.activeIndex=e,t!==e&&t>=0){const o=this.tabs[t];o&&o.heavy&&o.mounted&&this.releaseTab(t,o)}const a=this.tabs[e];a&&((t!==e||!this._announced)&&(this._announced=!0,this.$emit("tab-change",{id:a.id,label:a.label})),a.scriptUrl&&(this.narrow&&this.mobileFlags===null||this.isDesktopOnly(a.id)||a.mounted||this.$nextTick(()=>{this.activeIndex===e&&this.mountElement(e)})))},releaseTab(e,t){try{const a=this._slots&&this._slots[e];a&&(a.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:e.instance||"dms-"+e.id};this.effectiveLocale&&(t.locale=this.effectiveLocale);const a=this.tk||this.cfg.tk||this.runtime.token;return a&&(t.tk=a),(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=(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";const a=this.resolve(t.scriptUrl);Promise.resolve(this._freshGate).then(()=>wl(a)).then(()=>jm(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)})}}}),xb={class:"dms-locale"},Sb=["aria-expanded"],Lb={class:"dms-flag"},Tb={class:"dms-locale-name"},Pb={key:0,class:"dms-locale-menu",role:"listbox"},Eb=["aria-selected"],Ob=["onClick"],Mb={class:"dms-flag"},Ab={class:"dms-locale-name"},Cb={class:"dms-locale-en"},Ib=["hidden","data-doxa-help"],Nb={key:0,class:"dms-mobile-notice",role:"status"},Fb=["aria-label","onClick"],Db={key:2,class:"dms-hint"},Rb={key:3,class:"dms-hint err"},zb={key:4,class:"dms-hint err"},qb={key:0,class:"dms-notice",role:"status"},Wb={id:"dms-help-title",class:"dms-help-title"},jb={class:"dms-help-what"},Ub={class:"dms-help-how"};function Hb(e,t,a,o,n,s){const r=Wa("ShellLanguageMenu"),i=Wa("MapInfo"),l=Wa("BackToTopButton"),p=Wa("VerticalTabsLayout");return C(),ya(p,{dir:e.uiDir,lang:e.uiLocale,labels:e.layoutLabels,"home-href":e.homeHref||e.cfg.homeHref||e.defaultHomeHref,"home-label":e.homeLabel||e.cfg.homeLabel||"",title:e.headingText,"nav-label":e.t("navLabel"),header:e.showHeader,groups:e.navGroups,active:e.activeKey,"onUpdate:active":e.onSelect},Hc({brand:oa(()=>[t[5]||(t[5]=O("span",{class:"dms-logo","aria-hidden":"true"},[O("svg",{viewBox:"0 0 24 24",width:"22",height:"22",fill:"none",stroke:"#92b195","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[O("circle",{cx:"12",cy:"12",r:"9"}),O("polygon",{points:"12 6 14 12 12 18 10 12",fill:"#92b195",stroke:"none"}),O("polygon",{points:"6 12 12 10 18 12 12 14",fill:"#92b195",opacity:"0.55",stroke:"none"})])],-1))]),meta:oa(()=>[Kt(B(e.t("meta",{n:e.tabs.length})),1)]),"phone-end":oa(()=>[Ie(r,{current:e.uiLocale,onSwitch:e.pickLocale},null,8,["current","onSwitch"])]),"rail-end":oa(({collapsed:c})=>[Ie(r,{current:e.uiLocale,collapsed:c,onSwitch:e.pickLocale},null,8,["current","collapsed","onSwitch"])]),default:oa(()=>[(C(!0),N(ne,null,Xe(e.tabs,(c,m)=>Ra((C(),N("section",{key:c.id,class:"dms-pane",ref_for:!0,ref:v=>{v?e.paneEls[m]=v:delete e.paneEls[m]},hidden:m!==e.activeIndex,"data-doxa-help":e.tabHasHelp(c)?"":null,"data-doxa-gallery":""},[!c.heavy||m===e.activeIndex?(C(),N(ne,{key:0},[e.showsMobileNotice(c.id)?(C(),N("div",Nb,[O("span",null,B(e.largerScreenText),1),O("button",{type:"button",class:"dms-mobile-notice-x","aria-label":e.tr("dismiss"),onClick:v=>e.dismissMobileNotice(c.id)},"×",8,Fb)])):se("",!0),O("div",{class:"dms-slot",ref_for:!0,ref:v=>e.setSlot(m,v)},null,512),e.infoFor(c)?(C(),ya(i,Dr({key:"info-"+c.id},{ref_for:!0},e.infoProps(c),{style:e.infoStyle(c),placement:e.infoPos(c).placement||"top-right",class:{"dms-info-raise":e.infoPos(c).raise},"assets-base":e.assetsBase,locale:e.effectiveLocale}),null,16,["style","placement","class","assets-base","locale"])):se("",!0),c.state==="loading"?(C(),N("div",Db,B(e.tr("loading",{label:e.tabLabel(c)})),1)):c.state==="error"?(C(),N("div",Rb,[Kt(B(e.tr("loadFailed",{label:e.tabLabel(c)})),1),t[7]||(t[7]=O("br",null,null,-1)),O("small",null,B(c.error),1)])):c.state==="idle"&&!c.scriptUrl&&e.manifestError?(C(),N("div",zb,[Kt(B(e.tr("loadFailed",{label:e.tabLabel(c)})),1),t[8]||(t[8]=O("br",null,null,-1)),O("small",null,B(e.manifestError),1),t[9]||(t[9]=O("br",null,null,-1)),O("small",null,B(e.tr("manifestHint")),1)])):se("",!0)],64)):se("",!0)],8,Ib)),[[Za,m===e.activeIndex]])),128)),e.disabledNotice?(C(),N("div",qb,B(e.disabledNotice),1)):se("",!0),e.helpOpen&&e.activeHelp?(C(),N("div",{key:1,class:"dms-help-scrim",onClick:t[3]||(t[3]=jo((...c)=>e.closeHelp&&e.closeHelp(...c),["self"])),onKeydown:t[4]||(t[4]=ai(jo((...c)=>e.closeHelp&&e.closeHelp(...c),["stop","prevent"]),["esc"]))},[O("div",{class:"dms-help",role:"dialog","aria-modal":"true","aria-labelledby":"dms-help-title",onKeydown:t[2]||(t[2]=ai(jo(c=>e.$refs.helpClose&&e.$refs.helpClose.focus(),["prevent"]),["tab"]))},[O("h2",Wb,B(e.tabLabel(e.tabs[e.activeIndex])),1),O("p",jb,[O("strong",null,B(e.activeHelp.what),1)]),O("p",Ub,B(e.activeHelp.how),1),O("button",{ref:"helpClose",type:"button",class:"dms-help-close",onClick:t[1]||(t[1]=(...c)=>e.closeHelp&&e.closeHelp(...c))},B(e.tr("close")),513)],32)],32)):se("",!0),Ie(l,{target:e.activePaneEl,labels:{backToTop:e.tr("backToTop")}},null,8,["target","labels"])]),_:2},[e.showLocaleSwitcher?{name:"toolbar",fn:oa(()=>[O("div",xb,[O("button",{type:"button",class:"dms-locale-btn","aria-expanded":String(e.localeOpen),"aria-label":"Change language",onClick:t[0]||(t[0]=c=>e.localeOpen=!e.localeOpen)},[O("span",Lb,B(e.activeLang.flag),1),O("span",Tb,B(e.activeLang.nativeName),1),t[6]||(t[6]=O("span",{class:"dms-dots","aria-hidden":"true"},"⋮",-1))],8,Sb),e.localeOpen?(C(),N("ul",Pb,[(C(!0),N(ne,null,Xe(e.switcherLangs,c=>(C(),N("li",{key:c.code,role:"option","aria-selected":String(c.code===e.locale)},[O("button",{type:"button",class:Ge(["dms-locale-opt",{active:c.code===e.locale}]),onClick:m=>e.setLocale(c.code)},[O("span",Mb,B(c.flag),1),O("span",Ab,B(c.nativeName),1),O("span",Cb,B(c.name),1)],10,Ob)],8,Eb))),128))])):se("",!0)])]),key:"0"}:void 0]),1032,["dir","lang","labels","home-href","home-label","title","nav-label","header","groups","active","onUpdate:active"])}const Vb=Uo(kb,[["render",Hb],["styles",[db]]]),Bb=Um(),Gb=Zp(Vb,{configureApp(e){e.provide("dmsTreeBase",Bb)}});typeof customElements<"u"&&!customElements.get("doxa-maps-spa")&&customElements.define("doxa-maps-spa",Gb)})(); +`,"map-info"),(k,K)=>(C(),N("div",{ref_key:"rootEl",ref:Ne,class:"mi",dir:v()?"rtl":"ltr",lang:n()},[Ra(O("button",{ref_key:"btnEl",ref:V,type:"button",class:Ge(["mi-btn",e.placement==="top-left"?"mi-at-left":"mi-at-right"]),"aria-label":ye(s)("mapInfo.open"),title:ye(s)("mapInfo.open"),"aria-haspopup":"dialog","aria-expanded":String(H.value),onClick:xe},[...K[1]||(K[1]=[O("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false"},[O("circle",{cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"2"}),O("path",{d:"M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}),O("circle",{cx:"12",cy:"17",r:"1.3",fill:"currentColor"})],-1)])],10,fh),[[Za,z()]]),W.value&&!H.value&&z()?(C(),N("div",{key:0,class:Ge(["mi-pointer",e.placement==="top-left"?"mi-at-left":"mi-at-right"]),"aria-hidden":"true"},[O("span",null,B(ye(s)("mapInfo.pointer")),1),(C(),N("svg",hh,[e.placement==="top-left"?(C(),N("path",bh)):(C(),N("path",$h))]))],2)):se("",!0),W.value&&!H.value&&!z()&&f.value?(C(),N("div",{key:1,class:Ge(["mi-pointer mi-ctl",["mi-ctl-"+f.value.side,{"mi-ctl-strip":f.value.strip}]]),style:Ea(x()),"aria-hidden":"true"},[O("span",{dir:v()?"rtl":"ltr"},B(ye(s)("mapInfo.pointer")),9,_h),(C(),N("svg",vh,[f.value.side==="left"?(C(),N("path",yh)):(C(),N("path",wh))]))],6)):se("",!0),H.value?(C(),N("div",{key:2,class:"mi-scrim",onClick:jo(nt,["self"]),onKeydown:L},[O("div",{ref_key:"dialogEl",ref:I,class:"mi-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"mi-title-"+e.storageKey},[O("div",xh,[O("h2",{id:"mi-title-"+e.storageKey,class:"mi-title"},B(ye(s)("mapInfo.title")),9,Sh),O("button",{ref_key:"closeEl",ref:fe,type:"button",class:"mi-close","aria-label":ye(s)("mapInfo.close"),onClick:nt},"×",8,Lh)]),O("div",Th,[e.leadKey||e.lead?(C(),N("section",{key:0,class:"mi-bluf","aria-labelledby":"mi-bluf-"+e.storageKey},[O("h3",{id:"mi-bluf-"+e.storageKey,class:"mi-bluf-h"},B(ye(s)("mapInfo.shortDescription")),9,Eh),O("p",Oh,B(r(e.leadKey,e.lead)),1)],8,Ph)):se("",!0),(e.takeawayKey||e.takeaway)&&!c()?(C(),N("p",Mh,[O("b",null,B(ye(s)("mapInfo.takeaway")),1),Kt(" "+B(r(e.takeawayKey,e.takeaway)),1)])):se("",!0),c()?(C(),N("details",{key:"st-"+o.value,class:"mi-strategy"},[O("summary",Ah,[O("span",null,B(ye(s)("mapInfo.tabStrategy")),1),K[2]||(K[2]=O("span",{class:"mi-chev","aria-hidden":"true"},"▾",-1))]),O("p",Ch,B(l()),1),p().length?(C(),N("ul",Ih,[(C(!0),N(ne,null,Xe(p(),(Y,oe)=>(C(),N("li",{key:oe},B(Y),1))),128))])):se("",!0)])):se("",!0),(C(!0),N(ne,null,Xe(e.examples,(Y,oe)=>Ra((C(),N("section",{key:oe,class:"mi-ex"},[O("h3",null,B(Te(Y)),1),Y.kind==="image"?(C(),N(ne,{key:0},[O("img",{class:"mi-img mi-poster",src:ce(Y.src),alt:Y.alt||Te(Y),decoding:"async",onError:ge=>Q[oe]=!0},null,40,Nh),Y.full?(C(),N("div",Fh,[O("a",{class:"mi-full",href:ce(Y.full),target:"_blank",rel:"noopener"},B(ye(s)("mapInfo.openFull")),9,Dh)])):se("",!0)],64)):Y.kind==="pages"&&(Y.pages||[]).length?(C(),N(ne,{key:1},[ke[oe]?(C(),N(ne,{key:1},[O("div",jh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"true",onClick:ge=>G(oe)},B(ye(s)("mapInfo.collapsePages")),9,Uh)]),O("div",Hh,[(C(!0),N(ne,null,Xe(Y.pages,(ge,Oe)=>(C(),N("button",{key:Oe,type:"button",class:"mi-hit mi-open mi-page","aria-label":ye(s)("mapInfo.collapsePages"),onClick:Ht=>G(oe)},[O("img",{class:"mi-img",src:ce(ge),alt:Te(Y)+" "+m(Oe+1),loading:"lazy",decoding:"async",onError:ee},null,40,Bh)],8,Vh))),128))]),O("div",Gh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"true",onClick:ge=>G(oe)},B(ye(s)("mapInfo.collapsePages")),9,Kh)])],64)):(C(),N(ne,{key:0},[O("button",{type:"button",class:Ge(["mi-hit mi-page",{"mi-stack":Y.pages.length>1}]),"aria-label":ye(s)("mapInfo.expandPages",{n:m(Y.pages.length)}),"aria-expanded":"false",onClick:ge=>G(oe)},[O("img",{class:"mi-img",src:ce(Y.pages[0]),alt:Te(Y),decoding:"async",onError:ge=>Q[oe]=!0},null,40,zh)],10,Rh),Y.pages.length>1?(C(),N("div",qh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"false",onClick:ge=>G(oe)},B(ye(s)("mapInfo.expandPages",{n:m(Y.pages.length)})),9,Wh)])):se("",!0)],64))],64)):Y.kind==="deck"&&(Y.cards||[]).length?(C(),N(ne,{key:2},[ke[oe]?(C(),N(ne,{key:1},[O("div",Qh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"true",onClick:ge=>G(oe)},B(ye(s)("mapInfo.collapseDeck")),9,eb)]),O("div",tb,[(C(!0),N(ne,null,Xe(Y.cards,(ge,Oe)=>(C(),N("img",{key:Oe,class:"mi-img",src:ce(ge),alt:Te(Y)+" "+m(Oe+1),loading:"lazy",decoding:"async",onError:ee},null,40,ab))),128))]),O("div",ob,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"true",onClick:ge=>G(oe)},B(ye(s)("mapInfo.collapseDeck")),9,nb)])],64)):(C(),N(ne,{key:0},[O("button",{type:"button",class:"mi-hit mi-deck","aria-label":ye(s)("mapInfo.expandDeck",{n:m(Y.cards.length)}),"aria-expanded":"false",onClick:ge=>G(oe)},[(C(!0),N(ne,null,Xe(Ut(Y),(ge,Oe)=>(C(),N("img",{key:Oe,class:"mi-card",src:ce(ge),alt:"",decoding:"async",onError:Ht=>Oe===0?Q[oe]=!0:ee(Ht),style:Ea({insetInlineStart:Oe*36+"px",transform:"rotate("+(Oe-2)*4+"deg)",zIndex:10-Oe})},null,44,Yh))),128))],8,Xh),O("div",Jh,[O("button",{type:"button",class:"mi-toggle","aria-expanded":"false",onClick:ge=>G(oe)},B(ye(s)("mapInfo.expandDeck",{n:m(Y.cards.length)})),9,Zh)])],64))],64)):Y.kind==="table"&&(Y.columns||[]).length?(C(),N(ne,{key:3},[O("div",sb,[O("table",rb,[O("thead",null,[O("tr",null,[(C(!0),N(ne,null,Xe(Y.columns,(ge,Oe)=>(C(),N("th",{key:Oe,scope:"col"},B(co(ge)),1))),128))])]),O("tbody",null,[(C(!0),N(ne,null,Xe(Y.rows||[],(ge,Oe)=>(C(),N("tr",{key:Oe},[(C(!0),N(ne,null,Xe(ge,(Ht,Kb)=>(C(),N("td",{key:Kb},B(typeof Ht=="number"?m(Ht):Ht),1))),128))]))),128))])])]),Y.total&&Y.total>(Y.rows||[]).length?(C(),N("p",ib,B(ye(s)("mapInfo.moreRows",{n:m(Y.total-(Y.rows||[]).length)})),1)):se("",!0)],64)):se("",!0)])),[[Za,!Q[oe]]])),128)),e.noteKey||e.note?(C(),N("p",lb,B(r(e.noteKey,e.note)),1)):se("",!0)]),a()?se("",!0):(C(),N("div",cb,[O("label",null,[O("input",{type:"checkbox",checked:y.value,onChange:K[0]||(K[0]=Y=>F(Y.target.checked))},null,40,pb),O("span",null,B(ye(s)("mapInfo.pointerOff")),1)])]))],8,kh)],32)):se("",!0)],8,mh))}},db=":host{display:block;position:relative;height:var(--doxa-maps-spa-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}.dms-pane{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;--profile-min-h: 0}.mi.dms-info-raise .mi-btn{z-index:60}.dms-slot{position:relative;min-height:100%}.dms-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}.dms-hint.err{color:#f87171}.dms-hint small{color:var(--dx-muted, #6d766e)}.dms-help-close:focus-visible{outline:2px solid #3f8f5a;outline-offset:2px}.dms-help-scrim{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;display:flex;align-items:center;justify-content:center;background:#00000059;padding:16px}.dms-help{max-width:420px;width:100%;color:#3b463d;background:#fff;border-radius:12px;padding:18px 20px 14px;box-shadow:0 12px 32px #0003;font-size:14px;line-height:1.5}.dms-help-title{margin:0 0 8px;font-size:16px}.dms-help-what,.dms-help-how{margin:0 0 10px}.dms-help-close{float:right;font:inherit;padding:6px 14px;border-radius:8px;border:1px solid #d1d4cd;background:#f3f3f1;cursor:pointer}.dms-notice{position:fixed;left:50%;bottom:24px;transform:translate(-50%);z-index:40;max-width:320px;text-align:center;font-size:13px;line-height:1.4;color:#3b463d;background:#fff;border:1px solid #d1d4cd;border-radius:10px;padding:10px 16px;box-shadow:0 8px 24px #0000001f}.dms-mobile-notice{position:sticky;top:0;z-index:30;display:flex;align-items:flex-start;gap:8px;padding:10px 12px;font-size:13px;line-height:1.4;color:#3b463d;background:#fff8e6;border-bottom:1px solid #f0d58c}.dms-mobile-notice span{flex:1}.dms-mobile-notice-x{flex:none;min-width:32px;min-height:32px;border:0;border-radius:6px;background:transparent;color:inherit;font-size:18px;line-height:1;cursor:pointer}.dms-mobile-notice-x:focus-visible{outline:2px solid #3b463d;outline-offset:1px}.dms-logo{display:inline-flex;align-items:center}.dms-logo svg{display:block}.dms-locale{position:relative;padding:8px 12px 0;display:flex;justify-content:flex-end}.dms-locale-btn{display:inline-flex;align-items:center;gap:8px;font:inherit;font-size:12px;padding:5px 10px;border:1px solid #d1d4cd;border-radius:8px;background:#d1d4cd;color:#3b463d;cursor:pointer}.dms-locale-btn:hover{background:#d1d4cd}.dms-flag{font-size:14px;line-height:1}.dms-locale-name{max-width:12ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dms-dots{color:#6d766e;margin-left:2px}.dms-locale-menu{position:absolute;top:100%;right:12px;margin-top:4px;z-index:30;min-width:180px;list-style:none;padding:6px;border:1px solid #d1d4cd;border-radius:10px;background:#fff;box-shadow:0 12px 32px #00000080;max-height:320px;overflow:auto}.dms-locale-opt{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;font-size:13px;padding:7px 9px;border:0;border-radius:7px;background:none;color:#3b463d;cursor:pointer}.dms-locale-opt:hover,.dms-locale-opt.active{background:#d1d4cd;color:#3b463d}.dms-locale-opt.active .dms-locale-name{color:#92b195}.dms-locale-en{margin-left:auto;font-size:11px;color:#6d766e}";function Ml(){try{const e=new URLSearchParams(location.search),t=(e.get("lang")||e.get("locale")||"").split("-")[0].toLowerCase();if(us.includes(t))return t}catch{}try{const e=(document.documentElement.lang||"").split("-")[0].toLowerCase();if(us.includes(e))return e}catch{}return""}const gs=[{key:"dashboards",label:"Dashboards",i18n:"sec.dashboards",icon:"chart",tabs:[{id:"dashboard-plus-grid",icon:"chart"},{id:"research-map-plus-grid",icon:"map"},{id:"regions-dashboard",icon:"map"}]},{key:"prayer-mobilization",label:"Prayer Mobilization",i18n:"sec.prayer",icon:"heart",tabs:[{id:"prayer-map",icon:"embed"},{id:"upg-100",icon:"list"},{id:"country-posters",icon:"poster"},{id:"poster-design",icon:"grid"}]},{key:"gospel-research",label:"Gospel Research",i18n:"sec.gospel",icon:"search",tabs:[{id:"cities-internet",icon:"wifi"},{id:"gospel-resources",icon:"book"}]},{key:"experimental",label:"Experimental",i18n:"sec.experimental",icon:"flask",folder:!0,open:!1,tabs:[]}];function gb(e){const t={},a=e&&Array.isArray(e.bundles)?e.bundles:[];for(const o of a)for(const n of Array.isArray(o&&o.profiles)?o.profiles:[])n&&(n.mobile==="desktop-only"||n.mobile==="larger-screens")&&(t[o.bundle+"/"+n.profile]=n.mobile);return t}const mb=new Set(["doxa-maps-spa","plugin-studio","template-bundle","people-groups-grid","research-dashboard","big-picture","demo-map","golden-path-check","doxa-research-map","stack-demo","posterverse","bible-posters","poster-sections"]),Al={"prayer-walk-planner":1,"gospel-internet":2,"upg-neighbor":3,"key-cities":4,"all-people-groups":5,"doxa-vision-card":7},ms=[{id:"dashboard-plus-grid",label:"Big Picture",sub:"dashboard + people-groups grid, stacked",emoji:"🌍",bundle:"dashboard-plus-grid",profile:"dashboard-plus-grid"},{id:"research-map",label:"Research Map",sub:"prayer · engagement · regions",emoji:"🗺️",bundle:"doxa-research-map",profile:"research-map"},{id:"research-map-plus-grid",label:"Simple Research",sub:"research map + people-groups grid",emoji:"🗺️",bundle:"research-map-plus-grid",profile:"research-map-plus-grid"},{id:"prayer-map",label:"Prayer Progress",sub:"simple world prayer map",emoji:"🙏",bundle:"doxa-simple-map",profile:"doxa-simple-map",instance:"prayer"},{id:"cities-internet",label:"Cities with Internet",sub:"connectivity of key cities",emoji:"📡",bundle:"cities-internet",profile:"connectivity-map"},{id:"gospel-resources",label:"Gospel Resources",sub:"resources by place",emoji:"📖",bundle:"gospel-resources",profile:"resources-map"},{id:"regions-dashboard",label:"Regions",sub:"regions and their countries",emoji:"🌐",bundle:"regions-dashboard",profile:"regions-mfe"},{id:"upg-100",label:"UPG 100 List Posters",sub:"my unreached list + posters",emoji:"📋",bundle:"my-upg-100-list",profile:"upg-100-mfe"},{id:"country-posters",label:"Country Posters",sub:"a poster for every country",emoji:"🗺️",bundle:"country-posters",profile:"country-posters-mfe"},{id:"poster-design",label:"Poster Design",sub:"every poster style and size",emoji:"🎨",bundle:"poster-design",profile:"poster-design-mfe"}];hb(gs);const en=new Set(["doxa-research-map","doxa-simple-map","cities-internet-map","gospel-resources-map","my-upg-100-list-map","doxa-map","doxa-maps-spa","dashboard-plus-grid","research-dashboard-map","demo-map","all-people-groups","country-posters-map","key-cities-map","research-map-plus-grid","gospel-internet-board"]),tn=new Set(["dashboard-plus-grid","research-map-plus-grid","bless-india-posters"]);function fb(){const e=Object.fromEntries(ms.map(a=>[a.id,a])),t=new Set;for(const a of gs)if(a.key!=="experimental")for(const o of a.tabs||[]){const n=e[o.id];n&&n.bundle&&t.add(n.bundle)}return t}function Cl(e,t){const a=[];for(const o of e)!o||t.has(o.key)||(t.add(o.key),a.push(o));return a}function hb(e){const t=new Map,a=[];for(const o of e)if(o.key!=="experimental")for(const n of o.tabs||[]){if(!n||!n.id)continue;const s=t.get(n.id);if(s===void 0){t.set(n.id,o.key);continue}(s!==o.key||a.indexOf(n.id)===-1)&&a.push(n.id+" ("+s+" + "+o.key+")")}return a.length&&typeof console<"u"&&console.error("[doxa-maps-spa] duplicate tab key(s) across NAV_MODEL sections: "+a.join(", ")+" — VerticalTabsLayout keys its tab-ref map and `active` highlight by id, so a row declared in two sections paints twice and stalls keyboard nav. See the duplicate-key trap in SPEC-the-six-map-product-and-its-tab-order.md."),a}const Il="dxm.treeFingerprint@";function bb(e){const a=(e&&Array.isArray(e.bundles)?e.bundles:[]).map(n=>(n&&n.bundle)+":"+(n&&n.integrity||"")).join("|");let o=2166136261;for(let n=0;n>>0).toString(36)+"."+a.length}function $b(e){try{return localStorage.getItem(Il+e)}catch{return null}}function _b(e,t){try{localStorage.setItem(Il+e,t)}catch{}}function vb(e){return String(e).split(/[-_]/).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function yb(e){const t=fb(),a=e&&Array.isArray(e.bundles)?e.bundles:[],o=[];for(const n of a){const s=n&&n.bundle;if(!s||t.has(s)||mb.has(s)||n.stage==="production")continue;const r=Array.isArray(n.profiles)?n.profiles:[];if(!r.length||r.every(c=>c.widget||Array.isArray(c.targets)&&!c.targets.includes("web")))continue;const i=r.find(c=>c.isMap)||r.find(c=>c.profile===s)||r[0],l=i.element||Array.isArray(n.elements)&&n.elements[0]||s,p=n.scriptUrl||i.scriptUrl||"";p&&o.push({id:s,label:i.title||vb(s),sub:(i.description||"").trim().replace(/[,;]\s*$/,"")||"experimental bundle",emoji:"🧪",tag:l,bundle:s,profile:i.profile||s,scriptUrl:p,heavy:en.has(l)||en.has(s),scroll:tn.has(l)||tn.has(s),discovered:!0})}return o.sort((n,s)=>{const r=Al[n.id]||999,i=Al[s.id]||999;return r!==i?r-i:n.label.localeCompare(s.label)}),o}function wb(e,t){const a=e&&Array.isArray(e.bundles)?e.bundles:[],o=Object.fromEntries(a.map(s=>[s.bundle,s])),n={};for(const s of t){const r=o[s.bundle];if(!r)continue;const i=Array.isArray(r.profiles)?r.profiles:[],l=i.find(w=>w.profile===s.profile)||i[0],p=l&&l.element||Array.isArray(r.elements)&&r.elements[0]||s.bundle,c=r.scriptUrl||l&&l.scriptUrl||"";if(!c)continue;const m=l&&Array.isArray(l.instances)?l.instances:[],v=!!(s.instance&&m.some(w=>(w&&(w.id||w.instance))===s.instance));n[s.id]={tag:p,scriptUrl:c,profile:l&&l.profile||s.profile,instance:v?s.instance:"",heavy:en.has(p)||en.has(s.bundle),scroll:tn.has(p)||tn.has(s.bundle)}}return n}const kb=$a({name:"DoxaMapsSpa",inheritAttrs:!1,components:{VerticalTabsLayout:Gf,BackToTopButton:ri,MapInfo:ub,ShellLanguageMenu:lh},props:{treeBase:{type:String,default:""},profileConfig:{type:[String,Object],default:""},heading:{type:String,default:"Deep Research"},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:ba("dmsTreeBase","")}},data(){return{paneEls:{},activeIndex:0,showHeader:!1,narrow:!1,_mql:null,_onMedia:null,disabledNotice:"",_noticeTimer:null,helpOpen:!1,mobileNoticeDismissed:{},mobileFlags:null,manifestError:"",manifestBase:"",runtime:{},locale:Kf(),hostLang:Ml(),sessionPick:"",localeOpen:!1,switcherLangs:kl,tabs:ms.map(e=>({...e,tag:"",scriptUrl:"",heavy:!1,scroll:!1,resolved:!1,mounted:!1,state:"idle",error:""}))}},computed:{largerScreenText(){return Wt("messages.largerScreenNotice",this.uiLocale)||"This experimental map is built for larger screens. It opens here, but parts of it may not fit or work well on a phone."},activePaneEl(){return this.paneEls[this.activeIndex]||null},activeHelp(){const e=this.tabs[this.activeIndex];return e&&e.discovered?Tl(e.id,this.uiLocale):null},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=(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":""},showInfo(){const e=this.cfg.info;return!(e===!1||e==="false"||e==="off")},headingText(){return String(this.cfg.heading||this.heading||"").trim()||"Deep Research"},showExperimental(){const e=this.cfg.experimental;return!(e===!1||e==="false"||e==="hidden"||e==="off")},navGroups(){const e=Object.fromEntries(this.tabs.map(a=>[a.id,a])),t=new Set;return gs.map(a=>{let o=Cl((a.tabs||[]).filter(n=>e[n.id]).map(n=>{const s=e[n.id],r=this.isDesktopOnly(s.id),i=r||this.mobileFlagOf(s.id)==="desktop-only";return{key:s.id,label:this.tabLabel(s),sub:this.tabSub(s),icon:n.icon,badge:i?this.tr("desktopOnly"):n.badge,disabled:r}}),t);return a.key==="experimental"&&!this.showExperimental?{key:a.key,rows:[]}:(a.key==="experimental"&&(o=o.concat(Cl(this.tabs.filter(n=>n.discovered).map(n=>({key:n.id,label:this.tabLabel(n),sub:this.tabSub(n),icon:"flask",badge:this.narrow&&this.mobileFlagOf(n.id)==="larger-screens"?this.tr("mobileNotBuilt"):this.tr("lab")})),t))),{key:a.key,label:a.i18n?this.tr(a.i18n):a.label,icon:a.icon,folder:!!a.folder,open:a.open,rows:o})}).filter(a=>a.rows.length)},showLocaleSwitcher(){return this.showHeader},activeLang(){return ps(this.locale)||{code:this.locale,flag:"🌐",nativeName:this.locale}},propLocale(){return(this.language||this.cfg.language||this.cfg.locale||this.cfg.lang||"").trim()},effectiveLocale(){const e=this.showLocaleSwitcher?this.locale:"";return(this.sessionPick||this.propLocale||e||this.hostLang||"en").split("-")[0].toLowerCase()},uiLocale(){return us.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:""}},mounted(){this.watchWidth(),this.watchHostLang(),this.select(this.initialIndex()),this.loadManifest(),this._onHostedHelp=e=>this.onHostedHelp(e),this.$el.addEventListener("doxa:help",this._onHostedHelp)},beforeUnmount(){this._langObs&&(this._langObs.disconnect(),this._langObs=null),this._onHostedHelp&&(this.$el.removeEventListener("doxa:help",this._onHostedHelp),this._onHostedHelp=null),!(!this._mql||!this._onMedia)&&(this._mql.removeEventListener?this._mql.removeEventListener("change",this._onMedia):this._mql.removeListener&&this._mql.removeListener(this._onMedia),this._mql=null,this._onMedia=null)},watch:{activeIndex(){this.helpOpen=!1},propLocale(){this.sessionPick=""},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.activeIndex,a=this.tabs[t];!a||!a.mounted||(e(t,a),this.mountElement(t))},tab(e){e&&this.onSelect(e)}},methods:{openHelp(){this.helpOpen=!0,this.$nextTick(()=>this.$refs.helpClose&&this.$refs.helpClose.focus())},closeHelp(){this.helpOpen=!1;const e=this._helpReturn;this._helpReturn=null,this.$nextTick(()=>e&&e.focus&&e.focus())},infoProps(e){const{pos:t,...a}=this.infoFor(e)||{};return a},infoPos(e){const t=(this.infoFor(e)||{}).pos||{},{narrow:a,...o}=t;return this.narrow&&a?{...o,...a}:o},infoStyle(e){const t=this.infoPos(e),a={};return t.top&&(a["--map-info-top"]=t.top),t.side&&(a["--map-info-side"]=t.side),a},infoFor(e){const t=this.showInfo&&e&&dh[e.id];return t&&(!t.leadKey||Wt(t.leadKey,"en"))?t:null},tabHasHelp(e){return!!(e&&e.discovered&&Tl(e.id,this.uiLocale))},onHostedHelp(e){if(!this.activeHelp)return;e.stopPropagation();const t=e.composedPath?e.composedPath():[];this._helpReturn=t.find(a=>a&&a.tagName==="BUTTON")||null,this.openHelp()},setSlot(e,t){t&&(this._slots=Object.assign(this._slots||{},{[e]:t}))},tr(e,t){return Qo(this.uiLocale,e,t)},t(e,t){return Qo(this.uiLocale,e,t)},tabLabel(e){return!e.discovered||ch("tab."+e.id)?Qo(this.uiLocale,"tab."+e.id):e.label},tabSub(e){return e.discovered?this.uiLocale==="en"?e.sub:this.tr("experimentalSub"):Qo(this.uiLocale,"sub."+e.id)},watchHostLang(){typeof MutationObserver>"u"||typeof document>"u"||(this._langObs=new MutationObserver(()=>{this.hostLang=Ml()}),this._langObs.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]}))},watchWidth(){typeof window>"u"||!window.matchMedia||(this._mql=window.matchMedia("(max-width: 760px)"),this.narrow=this._mql.matches,this._onMedia=e=>{const t=this.narrow;this.narrow=!!e.matches,t!==this.narrow&&this.isDesktopOnly(this.activeKey)&&this.select(this.firstVisibleIndex())},this._mql.addEventListener?this._mql.addEventListener("change",this._onMedia):this._mql.addListener&&this._mql.addListener(this._onMedia))},mobileFlagOf(e){const t=this.tabs.find(a=>a.id===e);return t&&this.mobileFlags&&this.mobileFlags[t.bundle+"/"+t.profile]||null},isDesktopOnly(e){return this.narrow&&this.mobileFlagOf(e)==="desktop-only"},showsMobileNotice(e){return this.narrow&&this.mobileFlagOf(e)==="larger-screens"&&!this.mobileNoticeDismissed[e]},dismissMobileNotice(e){this.mobileNoticeDismissed={...this.mobileNoticeDismissed,[e]:!0}},firstVisibleIndex(){let e=-1;for(const t of this.navGroups)for(const a of t.rows){const o=this.tabs.findIndex(n=>n.id===a.key);if(!(o<0)&&(e<0&&(e=o),!a.disabled))return o}return e>=0?e:0},loadManifest(){const e=this.resolve("manifest.json"),t=c=>{try{return new URL(c,location.href).href.replace(/[^/]*$/,"")}catch{return""}},a={url:e,root:t(e)},o={url:this.resolve("doxa-maps-spa/manifest.json"),root:a.root};let n=!1;try{n=new URL(e,location.href).origin!==location.origin}catch{}const s=n?[o,a]:[a,o],r="/public/dx-maps/manifest.json";s.some(c=>c.url===r)||s.push({url:r,root:t(r)});const i=[];let l;this._freshGate=new Promise(c=>{l=c}),setTimeout(l,8e3);const p=c=>{if(c>=s.length){this.manifestError="manifest.json not found (tried "+i.join(", ")+")",console.error("[doxa-maps-spa] "+this.manifestError+" — every tab except Big Picture is composed from it, so their panes cannot mount."),l();return}const{url:m,root:v}=s[c];return i.push(m),fetch(m,{credentials:"same-origin",cache:"no-cache"}).then(w=>{if(!w||!w.ok)throw new Error(m+" → HTTP "+(w?w.status:"?"));return w.json()}).then(w=>{if(!w)throw new Error(m+" → empty");this.manifestError="",this.manifestBase=v||"",this.revalidateBundles(w,v||"").then(l,l),this.applyManifest(w)}).catch(()=>p(c+1))};try{p(0)}catch{l()}},revalidateBundles(e,t){const a=bb(e),o=$b(t);if(o===a)return Promise.resolve();const n=[...new Set((e&&e.bundles||[]).map(p=>p&&p.scriptUrl?this.resolve(p.scriptUrl):"").filter(Boolean))],s=p=>{try{return new URL(p,location.href).origin===location.origin}catch{return!1}},r=p=>s(p)?fetch(p,{mode:"same-origin",credentials:"same-origin",cache:"only-if-cached"}).then(c=>(c&&c.body&&c.body.cancel&&c.body.cancel(),!!(c&&c.ok)),()=>!1):Promise.resolve(o!==null),i=p=>fetch(p,{credentials:"same-origin",cache:"no-cache"}).then(c=>{if(c&&c.status===200&&c.body&&c.body.cancel)return c.body.cancel()}),l=p=>r(p).then(c=>c?i(p):null).catch(()=>{});return Promise.all(n.map(l)).then(()=>_b(t,a))},applyManifest(e){this.runtime=e&&e.runtime&&typeof e.runtime=="object"?e.runtime:{},this.mobileFlags=gb(e),this.applyPageGlobals();const t=wb(e,ms),a=this.activeKey,o=[];for(const l of this.tabs){if(l.discovered){o.push(l);continue}const p=t[l.id];p&&(Object.assign(l,p,{resolved:!0}),o.push(l))}const n=new Set(o.map(l=>l.id));if(this.showExperimental)for(const l of yb(e))n.has(l.id)||o.push({...l,resolved:!0,mounted:!1,state:"idle",error:""});this.tabs=o;const s=this.requestedTab(),r=s?this.tabs.findIndex(l=>l.id===s):-1,i=this.tabs.findIndex(l=>l.id===a);r>=0&&!this.isDesktopOnly(s)&&!this._honouredTab?this.select(r):this.select(i>=0&&!this.isDesktopOnly(a)?i:this.firstVisibleIndex()),this._honouredTab=!0},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.requestedTab(),t=e?this.tabs.findIndex(a=>a.id===e):-1;return t>=0&&(this._honouredTab=!0),t>=0&&!this.isDesktopOnly(e)?t:this.firstVisibleIndex()},setLocale(e){this.locale=e,this.localeOpen=!1,Xf(e)},pickLocale(e){this.setLocale(e),this.sessionPick=e},onSelect(e){if(this.isDesktopOnly(e)){const a=this.tabs.find(o=>o.id===e);this.disabledNotice=(Wt("messages.desktopOnlyNotice",this.uiLocale)||"{label} only supports desktop — open this page on a desktop to use it.").replace("{label}",a?this.tabLabel(a):e),clearTimeout(this._noticeTimer),this._noticeTimer=setTimeout(()=>{this.disabledNotice=""},4e3);return}const t=this.tabs.findIndex(a=>a.id===e);t!==-1&&this.select(t)},resolve(e){const t=String(e);if(/^(https?:)?\/\//.test(t)||t.startsWith("/"))return t;const a=t.replace(/^\.\//,"");return this.manifestBase?this.manifestBase.replace(/\/+$/,"")+"/"+a:this.base?this.base.replace(/\/+$/,"")+"/"+a:"../"+a},select(e){const t=this.activeIndex;if(this.activeIndex=e,t!==e&&t>=0){const o=this.tabs[t];o&&o.heavy&&o.mounted&&this.releaseTab(t,o)}const a=this.tabs[e];a&&((t!==e||!this._announced)&&(this._announced=!0,this.$emit("tab-change",{id:a.id,label:a.label})),a.scriptUrl&&(this.narrow&&this.mobileFlags===null||this.isDesktopOnly(a.id)||a.mounted||this.$nextTick(()=>{this.activeIndex===e&&this.mountElement(e)})))},releaseTab(e,t){try{const a=this._slots&&this._slots[e];a&&(a.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:e.instance||"dms-"+e.id};this.effectiveLocale&&(t.locale=this.effectiveLocale);const a=this.tk||this.cfg.tk||this.runtime.token;return a&&(t.tk=a),(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=(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";const a=this.resolve(t.scriptUrl);Promise.resolve(this._freshGate).then(()=>wl(a)).then(()=>jm(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)})}}}),xb={class:"dms-locale"},Sb=["aria-expanded"],Lb={class:"dms-flag"},Tb={class:"dms-locale-name"},Pb={key:0,class:"dms-locale-menu",role:"listbox"},Eb=["aria-selected"],Ob=["onClick"],Mb={class:"dms-flag"},Ab={class:"dms-locale-name"},Cb={class:"dms-locale-en"},Ib=["hidden","data-doxa-help"],Nb={key:0,class:"dms-mobile-notice",role:"status"},Fb=["aria-label","onClick"],Db={key:2,class:"dms-hint"},Rb={key:3,class:"dms-hint err"},zb={key:4,class:"dms-hint err"},qb={key:0,class:"dms-notice",role:"status"},Wb={id:"dms-help-title",class:"dms-help-title"},jb={class:"dms-help-what"},Ub={class:"dms-help-how"};function Hb(e,t,a,o,n,s){const r=Wa("ShellLanguageMenu"),i=Wa("MapInfo"),l=Wa("BackToTopButton"),p=Wa("VerticalTabsLayout");return C(),ya(p,{dir:e.uiDir,lang:e.uiLocale,labels:e.layoutLabels,"home-href":e.homeHref||e.cfg.homeHref||e.defaultHomeHref,"home-label":e.homeLabel||e.cfg.homeLabel||"",title:e.headingText,"nav-label":e.t("navLabel"),header:e.showHeader,groups:e.navGroups,active:e.activeKey,"onUpdate:active":e.onSelect},Hc({brand:oa(()=>[t[5]||(t[5]=O("span",{class:"dms-logo","aria-hidden":"true"},[O("svg",{viewBox:"0 0 24 24",width:"22",height:"22",fill:"none",stroke:"#92b195","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[O("circle",{cx:"12",cy:"12",r:"9"}),O("polygon",{points:"12 6 14 12 12 18 10 12",fill:"#92b195",stroke:"none"}),O("polygon",{points:"6 12 12 10 18 12 12 14",fill:"#92b195",opacity:"0.55",stroke:"none"})])],-1))]),meta:oa(()=>[Kt(B(e.t("meta",{n:e.tabs.length})),1)]),"phone-end":oa(()=>[Ie(r,{current:e.uiLocale,onSwitch:e.pickLocale},null,8,["current","onSwitch"])]),"rail-end":oa(({collapsed:c})=>[Ie(r,{current:e.uiLocale,collapsed:c,onSwitch:e.pickLocale},null,8,["current","collapsed","onSwitch"])]),default:oa(()=>[(C(!0),N(ne,null,Xe(e.tabs,(c,m)=>Ra((C(),N("section",{key:c.id,class:"dms-pane",ref_for:!0,ref:v=>{v?e.paneEls[m]=v:delete e.paneEls[m]},hidden:m!==e.activeIndex,"data-doxa-help":e.tabHasHelp(c)?"":null,"data-doxa-gallery":""},[!c.heavy||m===e.activeIndex?(C(),N(ne,{key:0},[e.showsMobileNotice(c.id)?(C(),N("div",Nb,[O("span",null,B(e.largerScreenText),1),O("button",{type:"button",class:"dms-mobile-notice-x","aria-label":e.tr("dismiss"),onClick:v=>e.dismissMobileNotice(c.id)},"×",8,Fb)])):se("",!0),O("div",{class:"dms-slot",ref_for:!0,ref:v=>e.setSlot(m,v)},null,512),e.infoFor(c)?(C(),ya(i,Dr({key:"info-"+c.id},{ref_for:!0},e.infoProps(c),{style:e.infoStyle(c),placement:e.infoPos(c).placement||"top-right",class:{"dms-info-raise":e.infoPos(c).raise},"assets-base":e.assetsBase,locale:e.effectiveLocale}),null,16,["style","placement","class","assets-base","locale"])):se("",!0),c.state==="loading"?(C(),N("div",Db,B(e.tr("loading",{label:e.tabLabel(c)})),1)):c.state==="error"?(C(),N("div",Rb,[Kt(B(e.tr("loadFailed",{label:e.tabLabel(c)})),1),t[7]||(t[7]=O("br",null,null,-1)),O("small",null,B(c.error),1)])):c.state==="idle"&&!c.scriptUrl&&e.manifestError?(C(),N("div",zb,[Kt(B(e.tr("loadFailed",{label:e.tabLabel(c)})),1),t[8]||(t[8]=O("br",null,null,-1)),O("small",null,B(e.manifestError),1),t[9]||(t[9]=O("br",null,null,-1)),O("small",null,B(e.tr("manifestHint")),1)])):se("",!0)],64)):se("",!0)],8,Ib)),[[Za,m===e.activeIndex]])),128)),e.disabledNotice?(C(),N("div",qb,B(e.disabledNotice),1)):se("",!0),e.helpOpen&&e.activeHelp?(C(),N("div",{key:1,class:"dms-help-scrim",onClick:t[3]||(t[3]=jo((...c)=>e.closeHelp&&e.closeHelp(...c),["self"])),onKeydown:t[4]||(t[4]=ai(jo((...c)=>e.closeHelp&&e.closeHelp(...c),["stop","prevent"]),["esc"]))},[O("div",{class:"dms-help",role:"dialog","aria-modal":"true","aria-labelledby":"dms-help-title",onKeydown:t[2]||(t[2]=ai(jo(c=>e.$refs.helpClose&&e.$refs.helpClose.focus(),["prevent"]),["tab"]))},[O("h2",Wb,B(e.tabLabel(e.tabs[e.activeIndex])),1),O("p",jb,[O("strong",null,B(e.activeHelp.what),1)]),O("p",Ub,B(e.activeHelp.how),1),O("button",{ref:"helpClose",type:"button",class:"dms-help-close",onClick:t[1]||(t[1]=(...c)=>e.closeHelp&&e.closeHelp(...c))},B(e.tr("close")),513)],32)],32)):se("",!0),Ie(l,{target:e.activePaneEl,labels:{backToTop:e.tr("backToTop")}},null,8,["target","labels"])]),_:2},[e.showLocaleSwitcher?{name:"toolbar",fn:oa(()=>[O("div",xb,[O("button",{type:"button",class:"dms-locale-btn","aria-expanded":String(e.localeOpen),"aria-label":"Change language",onClick:t[0]||(t[0]=c=>e.localeOpen=!e.localeOpen)},[O("span",Lb,B(e.activeLang.flag),1),O("span",Tb,B(e.activeLang.nativeName),1),t[6]||(t[6]=O("span",{class:"dms-dots","aria-hidden":"true"},"⋮",-1))],8,Sb),e.localeOpen?(C(),N("ul",Pb,[(C(!0),N(ne,null,Xe(e.switcherLangs,c=>(C(),N("li",{key:c.code,role:"option","aria-selected":String(c.code===e.locale)},[O("button",{type:"button",class:Ge(["dms-locale-opt",{active:c.code===e.locale}]),onClick:m=>e.setLocale(c.code)},[O("span",Mb,B(c.flag),1),O("span",Ab,B(c.nativeName),1),O("span",Cb,B(c.name),1)],10,Ob)],8,Eb))),128))])):se("",!0)])]),key:"0"}:void 0]),1032,["dir","lang","labels","home-href","home-label","title","nav-label","header","groups","active","onUpdate:active"])}const Vb=Uo(kb,[["render",Hb],["styles",[db]]]),Bb=Um(),Gb=Zp(Vb,{configureApp(e){e.provide("dmsTreeBase",Bb)}});typeof customElements<"u"&&!customElements.get("doxa-maps-spa")&&customElements.define("doxa-maps-spa",Gb)})(); diff --git a/public/dx-maps/doxa-maps-spa/doxa-maps-spa/app/index.html b/public/dx-maps/doxa-maps-spa/doxa-maps-spa/app/index.html index 4225fe908..3ba5b6ed8 100644 --- a/public/dx-maps/doxa-maps-spa/doxa-maps-spa/app/index.html +++ b/public/dx-maps/doxa-maps-spa/doxa-maps-spa/app/index.html @@ -67,7 +67,7 @@ - + - + \n\n\n" + "script": "\n\n\n" }, "instances": [ { diff --git a/public/dx-maps/manifest.json b/public/dx-maps/manifest.json index 10d005513..749463a99 100644 --- a/public/dx-maps/manifest.json +++ b/public/dx-maps/manifest.json @@ -409,7 +409,7 @@ "bundle": "doxa-maps-spa", "scriptUrl": "./doxa-maps-spa/doxa-maps-spa.js", "output": "dx-maps/doxa-maps-spa/doxa-maps-spa.js", - "integrity": "sha384-D/MCvAZhvdZ4CaVcpxKTxFLdT9GEuHidcKwBImnHSQfvUJg6mkAae/Y5JeUQYUjc", + "integrity": "sha384-C5x8ayydEbS+/4/FmfjQ/708vMLTCesnUfUcyT4Ml7hDkXBl8pYHna0PpPZQO3w+", "elements": [ "doxa-maps-spa" ], @@ -439,7 +439,7 @@ "scriptUrl": "./doxa-maps-spa/doxa-maps-spa.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" }, "instances": [ { From 00dbf9a79bc26a69776a07367b57b839d45f3f66 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 16:09:20 +0000 Subject: [PATCH 3/6] Posterverse: a Bless India Posters row in Experimental, and unpinned mounting for scroll pages The Experimental folder gains a bless-india-posters row, provisional until its bundle is in the tree (a missing bundle prunes the row, so nothing shows before it lands), with its label in all 11 locales. Its root is a natural-height page of poster cards, so a row may set scroll: the element is then mounted unpinned at its natural height and the pane scrolls it, instead of being pinned to the pane, which would trap the page's own content. check:posterverse-shelf expects the row and the scroll set by name; its self-test drops the row and drops the flag. --- package.json | 2 +- plugin-designs/posterverse/posterverse.vue | 10 +++++++--- .../posterverse/scripts/check-posterverse-shelf.mjs | 11 +++++++++-- plugin-designs/posterverse/src/strings.js | 11 +++++++++++ plugin-designs/posterverse/src/tabs.js | 3 +++ 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a40cd4adf..f32c5e0ec 100644 --- a/package.json +++ b/package.json @@ -616,7 +616,7 @@ "check:poster-layout-optin": "the composed poster sheet (header, map, legend beside it, footer) is OPT-IN: spec.layout === 'poster' asks for it, and every caller that does not gets the full-page map exactly as before, asserted by object identity, not just by value. Drives the real layout decisions with real spec objects. Headless, no browser.", "check:poster-print-fallback": "clicks the REAL poster print control with the served poster generator and every posters/*.webp aborted, and asserts the preview RASTERISES from posters/.html instead of opening on \"Poster not available yet\". Needs a served tree built with posterSources:true; NOT MEASURED otherwise.", "check:posters-exportable": "every poster the tree offers can be printed. With posterSources on, the tree once shipped only the 28 zone sources, so 350 of 378 posters said \"poster not found (404)\". Each id, from data/posters and the wall's previews, must ship a real WebP (RIFF..WEBP) or a real poster source (its class=\"stage\" element), so a placeholder or a host's fallback page cannot pass. SKIPs when posters are off by config, which check:poster-degrades covers. Reads the built tree; no server.", - "check:posterverse-shelf": "Posterverse (the capability-5 poster shell) shows exactly its allow-list and never a gated plugin. Asserts the rail rows per section (Posters: upg-100, country-posters, poster-design; Experimental: wall-of-people-groups, bible-posters), that no row names key-cities or a shell (a key-cities bundle is planted into the built manifest, because the real one withholds gated profiles), that every present row opens the profile it names (no silent fallback to a leaf), that posterverse.meta.json composes equals the rows whose bundle exists, and 11-locale parity of the shell strings. --self-test plants one defect per arm. Headless. Exit 0 pass, 1 fail, 75 no built manifest.", + "check:posterverse-shelf": "Posterverse (the capability-5 poster shell) shows exactly its allow-list and never a gated plugin. Asserts the rail rows per section (Posters: upg-100, country-posters, poster-design; Experimental: wall-of-people-groups, bible-posters, bless-india-posters), that no row names key-cities or a shell (a key-cities bundle is planted into the built manifest, because the real one withholds gated profiles), that every present row opens the profile it names (no silent fallback to a leaf), that posterverse.meta.json composes equals the rows whose bundle exists, and 11-locale parity of the shell strings. --self-test plants one defect per arm. Headless. Exit 0 pass, 1 fail, 75 no built manifest.", "check:prayer-walk-planner": "the Prayer Walk Planner is a full-page tool that prints a real walking map: the map canvas fills the page below the toolbar in its own leaf AND inside the Research Gallery at 1280x800 and 390x844 (the gallery once collapsed it to 76px / 0px); a real zone (Balat, Istanbul) renders a >=2000px print map that is not blank, saved to OUT= so a human can read it; ?lang=es gives a Spanish toolbar; 0 page errors. Run inside the shared browser locks. Exit 2 = SKIP.", "check:preset-config-merge": "a preset page (///index.html) keeps every default in its profile's .meta.json config, with the instance's props merged over them (upg-neighbor's presets lost pinHint:false when props replaced the config). Reads the built tree; SKIP without one.", "check:profile-table": "the prayer packet's profile TABLE (20 full-width rows: picture, generated description, three boxes; PER_PAGE stays 20): a row stays tall enough for a name plus a two-line description at the smallest fit size, and truncation happens only at a whole word. Character-count, not DOM, so Node and the browser agree. Cannot see the RENDERED row height: that is check:packet-render, a browser gate. By the UPG-100 owner; mutation-tested. Headless; in gates:pre.", diff --git a/plugin-designs/posterverse/posterverse.vue b/plugin-designs/posterverse/posterverse.vue index ae71ffed2..dc2e3e7b4 100644 --- a/plugin-designs/posterverse/posterverse.vue +++ b/plugin-designs/posterverse/posterverse.vue @@ -387,9 +387,13 @@ export default defineComponent({ el.setAttribute('profile-config', JSON.stringify(this.childConfig(t))) // Also as a plain attribute: an element without a ProfileLoader reads tree-base as a prop. if (this.base) el.setAttribute('tree-base', this.base.replace(/\/+$/, '')) - // Pin the element to the pane. min-height:0 is load-bearing: a child's own floor (420-600px on - // these plugins) otherwise wins over height:100% and the pane scrolls the whole plugin. - el.style.cssText = 'display:block;position:absolute;inset:0;width:100%;height:100%;min-height:0;' + // FIXED-VIEWPORT (the default): pin the element to the pane. min-height:0 is load-bearing: a + // child's own floor (420-600px on these plugins) otherwise wins over height:100% and the pane + // scrolls the whole plugin. SCROLL rows (t.scroll, a natural-height page) are NOT pinned: they + // take their natural height and the pane (overflow-y:auto) scrolls them. + el.style.cssText = t.scroll + ? 'display:block;position:static;width:100%;height:auto;' + : 'display:block;position:absolute;inset:0;width:100%;height:100%;min-height:0;' slot.appendChild(el) t.state = 'ready' } catch (e) { diff --git a/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs b/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs index b87e55992..de21094f8 100644 --- a/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs +++ b/plugin-designs/posterverse/scripts/check-posterverse-shelf.mjs @@ -9,7 +9,7 @@ * * WHAT IT ASSERTS (each arm is poisoned by --self-test before a pass is trusted): * A. the Experimental folder starts open, and the rail's rows are exactly the named sets: Posters = upg-100, country-posters, poster-design; - * Experimental = wall-of-people-groups, bible-posters (poster plugins only). Ids unique, + * Experimental = wall-of-people-groups, bible-posters, bless-india-posters (poster plugins only). Ids unique, * every row in a declared section. * B. no row names a NEVER bundle (key-cities, the shells themselves), and resolving the built * manifest WITH a key-cities bundle planted in it yields no key-cities row (the real manifest @@ -34,9 +34,12 @@ const ROOT = resolve(PLUGIN, '../..') const EXPECT = { posters: ['upg-100', 'country-posters', 'poster-design'], - experimental: ['wall-of-people-groups', 'bible-posters'], + experimental: ['wall-of-people-groups', 'bible-posters', 'bless-india-posters'], } const GATED = 'key-cities' +// Rows whose plugin is a natural-height page: mounted unpinned so the pane scrolls them. Named, because a +// pinned scroll page traps its own content and nothing else would notice. +const EXPECT_SCROLL = ['bless-india-posters'] const sameList = (a, b) => a.length === b.length && a.every((x, i) => x === b[i]) @@ -55,6 +58,8 @@ export function checkShelf({ SECTIONS, TABS, NEVER, resolveTabs, manifest, meta, // The Experimental folder starts OPEN: closed, under one short section, it read as an empty caption. const exp = SECTIONS.find((g) => g.key === 'experimental') if (!exp || !exp.folder || exp.open !== true) errs.push('A: the Experimental folder must be declared folder:true, open:true (closed, it is easy to miss)') + const scrollRows = TABS.filter((t) => t.scroll).map((t) => t.id) + if (!sameList(scrollRows, EXPECT_SCROLL)) errs.push(`A: scroll (unpinned) rows are [${scrollRows.join(', ')}], expected [${EXPECT_SCROLL.join(', ')}]`) const extra = TABS.filter((t) => !EXPECT[t.section]).map((t) => t.id) if (extra.length) errs.push(`A: rows outside the allow-listed sections: ${extra.join(', ')}`) // B. never a gated bundle — by declaration and by resolution over the real manifest @@ -118,6 +123,8 @@ function selfTest(base) { const cases = [ ['A: key-cities added to Experimental', (c) => { c.TABS = [...c.TABS, { id: 'key-cities', section: 'experimental', bundle: 'key-cities', profile: 'key-cities' }] }, /^A: section experimental|^B: row key-cities/], ['A: the Experimental folder closed again', (c) => { c.SECTIONS = c.SECTIONS.map((g) => g.key === 'experimental' ? { ...g, open: false } : g) }, /^A: the Experimental folder must be/], + ['A: Bless India Posters dropped', (c) => { c.TABS = c.TABS.filter((t) => t.id !== 'bless-india-posters') }, /^A: section experimental/], + ['A: Bless India Posters pinned (scroll flag lost)', (c) => { c.TABS = c.TABS.map((t) => t.id === 'bless-india-posters' ? { ...t, scroll: false } : t) }, /^A: scroll \(unpinned\) rows/], ['A: a row dropped', (c) => { c.TABS = c.TABS.filter((t) => t.id !== 'wall-of-people-groups') }, /^A: section experimental/], ['B: resolver that shows whatever the manifest carries', (c) => { c.resolveTabs = (m) => (m.bundles || []).map((b) => ({ id: b.bundle, bundle: b.bundle, profile: b.bundle, tag: b.bundle, scriptUrl: b.scriptUrl })) }, /^B: resolution produced a key-cities row/], ['C: a composite row falls back to a leaf', (c) => { c.manifest = clone(c.manifest); const b = c.manifest.bundles.find((x) => x.bundle === 'my-upg-100-list'); b.profiles = b.profiles.filter((p) => p.profile !== 'upg-100-mfe') }, /^C: row upg-100 opens/], diff --git a/plugin-designs/posterverse/src/strings.js b/plugin-designs/posterverse/src/strings.js index 728c660fe..1456e526a 100644 --- a/plugin-designs/posterverse/src/strings.js +++ b/plugin-designs/posterverse/src/strings.js @@ -20,6 +20,7 @@ export const STRINGS = { 'tab.poster-design': 'Poster Design', 'sub.poster-design': 'every poster style and size', 'tab.wall-of-people-groups': 'Wall of People Groups', 'tab.bible-posters': 'Bible Posters', + 'tab.bless-india-posters': 'Bless India Posters', experimentalSub: 'experimental bundle', lab: 'lab', loading: 'Loading {label}…', loadFailed: 'Could not load {label}.', manifestHint: 'This tab is composed from manifest.json — build the tree, or serve the built tree, to load it.', @@ -34,6 +35,7 @@ export const STRINGS = { 'tab.poster-design': 'Diseño de carteles', 'sub.poster-design': 'todos los estilos y tamaños de cartel', 'tab.wall-of-people-groups': 'Muro de los pueblos', 'tab.bible-posters': 'Carteles bíblicos', + 'tab.bless-india-posters': 'Bendigan a la India: carteles', experimentalSub: 'mapa experimental', lab: 'beta', loading: 'Cargando {label}…', loadFailed: 'No se pudo cargar {label}.', manifestHint: 'Esta pestaña se compone a partir de manifest.json: compila el árbol o sirve el árbol compilado para cargarla.', @@ -48,6 +50,7 @@ export const STRINGS = { 'tab.poster-design': 'Conception d’affiches', 'sub.poster-design': 'tous les styles et formats d’affiche', 'tab.wall-of-people-groups': 'Mur des peuples', 'tab.bible-posters': 'Affiches bibliques', + 'tab.bless-india-posters': 'Bénissez l’Inde : affiches', experimentalSub: 'carte expérimentale', lab: 'bêta', loading: 'Chargement de {label}…', loadFailed: 'Impossible de charger {label}.', manifestHint: "Cet onglet est composé à partir de manifest.json : construisez l'arborescence ou servez l'arborescence construite pour le charger.", @@ -62,6 +65,7 @@ export const STRINGS = { 'tab.poster-design': 'Postergestaltung', 'sub.poster-design': 'alle Posterstile und -größen', 'tab.wall-of-people-groups': 'Wand der Volksgruppen', 'tab.bible-posters': 'Bibelposter', + 'tab.bless-india-posters': 'Segnet Indien: Poster', experimentalSub: 'experimentelle Karte', lab: 'Beta', loading: '{label} wird geladen…', loadFailed: '{label} konnte nicht geladen werden.', manifestHint: 'Dieser Tab wird aus manifest.json zusammengesetzt – bauen Sie den Baum oder stellen Sie den gebauten Baum bereit, um ihn zu laden.', @@ -76,6 +80,7 @@ export const STRINGS = { 'tab.poster-design': 'Design de cartazes', 'sub.poster-design': 'todos os estilos e tamanhos de cartaz', 'tab.wall-of-people-groups': 'Mural dos povos', 'tab.bible-posters': 'Cartazes bíblicos', + 'tab.bless-india-posters': 'Abençoem a Índia: cartazes', experimentalSub: 'mapa experimental', lab: 'beta', loading: 'Carregando {label}…', loadFailed: 'Não foi possível carregar {label}.', manifestHint: 'Esta aba é composta a partir do manifest.json — compile a árvore ou sirva a árvore compilada para carregá-la.', @@ -90,6 +95,7 @@ export const STRINGS = { 'tab.poster-design': 'Design dei poster', 'sub.poster-design': 'tutti gli stili e i formati dei poster', 'tab.wall-of-people-groups': 'Muro dei popoli', 'tab.bible-posters': 'Poster biblici', + 'tab.bless-india-posters': 'Benedite l’India: poster', experimentalSub: 'mappa sperimentale', lab: 'beta', loading: 'Caricamento di {label}…', loadFailed: 'Impossibile caricare {label}.', manifestHint: "Questa scheda è composta da manifest.json: compila l'albero o pubblica l'albero compilato per caricarla.", @@ -104,6 +110,7 @@ export const STRINGS = { 'tab.poster-design': 'Design de afișe', 'sub.poster-design': 'toate stilurile și dimensiunile de afiș', 'tab.wall-of-people-groups': 'Zidul popoarelor', 'tab.bible-posters': 'Afișe biblice', + 'tab.bless-india-posters': 'Binecuvântați India: afișe', experimentalSub: 'hartă experimentală', lab: 'beta', loading: 'Se încarcă {label}…', loadFailed: '{label} nu a putut fi încărcat.', manifestHint: 'Această filă este compusă din manifest.json — construiți arborele sau serviți arborele construit pentru a o încărca.', @@ -118,6 +125,7 @@ export const STRINGS = { 'tab.poster-design': 'Дизайн плакатов', 'sub.poster-design': 'все стили и размеры плакатов', 'tab.wall-of-people-groups': 'Стена народов', 'tab.bible-posters': 'Библейские плакаты', + 'tab.bless-india-posters': 'Благословляйте Индию: плакаты', experimentalSub: 'экспериментальная карта', lab: 'бета', loading: 'Загрузка: {label}…', loadFailed: 'Не удалось загрузить: {label}.', manifestHint: 'Эта вкладка собирается из manifest.json — соберите дерево или разместите собранное дерево, чтобы загрузить её.', @@ -132,6 +140,7 @@ export const STRINGS = { 'tab.poster-design': 'تصميم الملصقات', 'sub.poster-design': 'كل أنماط الملصقات وأحجامها', 'tab.wall-of-people-groups': 'جدار الشعوب', 'tab.bible-posters': 'ملصقات الكتاب المقدس', + 'tab.bless-india-posters': 'باركوا الهند: ملصقات', experimentalSub: 'خريطة تجريبية', lab: 'تجريبي', loading: 'جارٍ تحميل {label}…', loadFailed: 'تعذّر تحميل {label}.', manifestHint: 'تُبنى علامة التبويب هذه من manifest.json — ابنِ الشجرة أو قدّم الشجرة المبنية لتحميلها.', @@ -146,6 +155,7 @@ export const STRINGS = { 'tab.poster-design': 'पोस्टर डिज़ाइन', 'sub.poster-design': 'हर पोस्टर शैली और आकार', 'tab.wall-of-people-groups': 'जनसमूहों की दीवार', 'tab.bible-posters': 'बाइबल पोस्टर', + 'tab.bless-india-posters': 'भारत को आशीष दो: पोस्टर', experimentalSub: 'प्रायोगिक मानचित्र', lab: 'बीटा', loading: '{label} लोड हो रहा है…', loadFailed: '{label} लोड नहीं हो सका।', manifestHint: 'यह टैब manifest.json से बनता है — इसे लोड करने के लिए ट्री बनाएँ या बना हुआ ट्री सर्व करें।', @@ -160,6 +170,7 @@ export const STRINGS = { 'tab.poster-design': '海报设计', 'sub.poster-design': '所有海报样式与尺寸', 'tab.wall-of-people-groups': '民族之墙', 'tab.bible-posters': '圣经海报', + 'tab.bless-india-posters': '祝福印度:海报', experimentalSub: '实验性地图', lab: '测试版', loading: '正在加载{label}…', loadFailed: '无法加载{label}。', manifestHint: '此标签页由 manifest.json 组成——请构建目录树或提供已构建的目录树以加载它。', diff --git a/plugin-designs/posterverse/src/tabs.js b/plugin-designs/posterverse/src/tabs.js index 97966b7c4..f8dcc0948 100644 --- a/plugin-designs/posterverse/src/tabs.js +++ b/plugin-designs/posterverse/src/tabs.js @@ -37,6 +37,9 @@ export const TABS = [ { id: 'poster-design', section: 'posters', icon: 'poster', bundle: 'poster-design', profile: 'poster-design-mfe' }, { id: 'wall-of-people-groups', section: 'experimental', icon: 'flask', bundle: 'wall-of-people-groups', profile: 'wall-of-people-groups' }, { id: 'bible-posters', section: 'experimental', icon: 'flask', bundle: 'bible-posters', profile: 'bible-posters' }, + // Provisional until its bundle lands: then `composes` gains it in the same PR and the flag goes. Its root + // is a natural-height page of poster cards, so it mounts unpinned (`scroll`) and the pane scrolls it. + { id: 'bless-india-posters', section: 'experimental', icon: 'flask', bundle: 'bless-india-posters', profile: 'bless-india-posters', provisional: true, scroll: true }, ] // Bundles that must never be a Posterverse row. The allow-list above already excludes them; this set From f486f4ad4e4c860ea06de912d1120ef750795feb Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 16:09:40 +0000 Subject: [PATCH 4/6] Rebuild posterverse for the Bless India Posters row, 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 4aac40163..362ba7ce4 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-Eu6xYVd6sm1N+Jmlt9wMiWk/f3TdS/KyyTmkKu6ClKdwwFzRGenJTXpLGgFxGHrV", + "integrity": "sha384-K55dXVlZ6Eb6gdoBHffenSbPbPuSLWTMm7U9H9aZAUl+7HVzNXCldC4l/JylOv6u", "elements": [ "posterverse-app" ], @@ -1408,7 +1408,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 4aac40163..362ba7ce4 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-Eu6xYVd6sm1N+Jmlt9wMiWk/f3TdS/KyyTmkKu6ClKdwwFzRGenJTXpLGgFxGHrV", + "integrity": "sha384-K55dXVlZ6Eb6gdoBHffenSbPbPuSLWTMm7U9H9aZAUl+7HVzNXCldC4l/JylOv6u", "elements": [ "posterverse-app" ], @@ -1408,7 +1408,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 2c6ec472c..1095ea670 100644 --- a/public/dx-maps/posterverse/posterverse.js +++ b/public/dx-maps/posterverse/posterverse.js @@ -160,4 +160,4 @@ @media (prefers-reduced-motion: reduce) { .vtl-nav, .vtl-collapse-ic, .vtl-tab, .vtl-tier, .vtl-pbar, .vtl-phone-menu, .vtl-rail-end, .vtl-scrim { transition: none !important; animation: none !important; } } -`,Fl=nn({name:"VerticalTabsLayout",components:{BackToTopButton:ba},props:{active:{type:String,default:""},title:{type:String,default:""},items:{type:Array,default:()=>[]},groups:{type:Array,default:()=>[]},navLabel:{type:String,default:"Sections"},labels:{type:Object,default:()=>({})},initialNavOpen:{type:Boolean,default:!0},header:{type:Boolean,default:!0},initialRailCollapsed:{type:Boolean,default:!1},homeHref:{type:String,default:""},homeLabel:{type:String,default:""},shellMode:{type:String,default:"auto"}},emits:["update:active"],setup(){return wl(Cl,"vertical-tabs-layout"),{T:Ol}},data(){const e=(()=>{try{return typeof window<"u"&&!!window.matchMedia&&window.matchMedia("(max-width: 760px)").matches}catch{return!1}})();return{navOpen:this.initialNavOpen&&!e,railCollapsed:e?!1:this.initialRailCollapsed,_tabEls:{},folderOverride:{},narrow:e,_mql:null,_onMedia:null,activatedKeys:{},hostState:{},hostError:{},_hostSlots:{},_hostMounted:{},hostEls:{},mode:"app"}},computed:{phoneBarShown(){return this.narrow&&!this.header},railEndShown(){return!this.narrow&&!this.header},activeHostEl(){return this.hostEls[this.active]||null},railShown(){return this.narrow?this.navOpen:!0},homeLink(){const e=String(this.homeHref||"").trim();return!e||/^(javascript|data|vbscript):/i.test(e.replace(/[\u0000- ]/g,""))?"":e},homeText(){return this.homeLabel||this.label("home")},allRows(){if(this.groups&&this.groups.length){const e=[];for(const t of this.groups)for(const o of t.rows||[])e.push(o);return e}return this.items},orderedKeys(){return this.allRows.map(e=>e.key)},elementRows(){return this.allRows.filter(e=>e&&e.element)},mountedElementRows(){return this.elementRows.filter(e=>this.activatedKeys[e.key])}},watch:{shellMode(){this.resolveShellMode()},active:{immediate:!0,handler(e){this.activateElement(e)}}},mounted(){this.resolveShellMode();try{window.matchMedia&&(this._mql=window.matchMedia("(max-width: 760px)"),this.narrow=this._mql.matches,this.reconcileForWidth(),this._onMedia=e=>{this.narrow=e.matches,this.reconcileForWidth()},this._mql.addEventListener?this._mql.addEventListener("change",this._onMedia):this._mql.addListener&&this._mql.addListener(this._onMedia))}catch{}this.$nextTick(()=>this.activateElement(this.active))},beforeUnmount(){try{this._mql&&this._onMedia&&(this._mql.removeEventListener?this._mql.removeEventListener("change",this._onMedia):this._mql.removeListener&&this._mql.removeListener(this._onMedia))}catch{}this._mql=null,this._onMedia=null},methods:{resolveShellMode(){const e=o=>o==="web"||o==="app"?o:null;let t=e(this.shellMode);if(!t)try{const o=this.$el&&this.$el.getRootNode?this.$el.getRootNode():null,n=o&&o.host;t=e(n&&n.getAttribute?n.getAttribute("shell-mode"):null)}catch{}if(!t)try{const o=window.matchMedia&&window.matchMedia("(display-mode: standalone)").matches||navigator.standalone===!0;t=window.Capacitor||o||window.MAP_OWNS_PAGE===!0?"app":"web"}catch{t="app"}this.mode=t},registerTab(e,t){t&&(this._tabEls[e]=t)},isNarrow(){return this.narrow},reconcileForWidth(){this.narrow?(this.navOpen=!1,this.railCollapsed=!1):this.navOpen=!0},label(e){const t={toggleList:"Toggle list",openViews:"Open the list of views",expandList:"Expand list",collapseList:"Collapse list",collapse:"Collapse",home:"Back to homepage"};return this.labels&&this.labels[e]||t[e]},expandRail(){!this.narrow&&this.railCollapsed&&(this.railCollapsed=!1)},toggleRail(){this.narrow?this.navOpen=!this.navOpen:this.railCollapsed=!this.railCollapsed},setHostSlot(e,t){t&&(this._hostSlots[e]=t,this.$nextTick(()=>this.mountHostElement(e)))},activateElement(e){!e||!this.elementRows.find(o=>o.key===e)||(this.activatedKeys[e]||(this.activatedKeys={...this.activatedKeys,[e]:!0},this.$nextTick(()=>this.watchContextLoss(e)),this.hostState={...this.hostState,[e]:"loading"}),this.$nextTick(()=>this.mountHostElement(e)))},deepCanvases(e,t=[]){if(!e)return t;for(const o of e.querySelectorAll("*"))o.tagName==="CANVAS"&&t.push(o),o.shadowRoot&&this.deepCanvases(o.shadowRoot,t);return t},watchContextLoss(e){const t=this._hostSlots[e];if(t)for(const o of this.deepCanvases(t))o.__vtlLossBound||(o.__vtlLossBound=!0,o.addEventListener("webglcontextlost",()=>{this.hostState={...this.hostState,[e]:"lost"}},{once:!0}))},reloadHostElement(e){const t=this._hostSlots[e];t&&(t.innerHTML=""),this._hostMounted[e]=!1,this.hostState={...this.hostState,[e]:"loading"},this.$nextTick(()=>this.mountHostElement(e))},mountHostElement(e){if(this._hostMounted[e])return;const t=this.elementRows.find(n=>n.key===e),o=this._hostSlots[e];!t||!o||(this._hostMounted[e]=!0,this.hostState={...this.hostState,[e]:"loading"},Al(t.src).then(()=>Pl(t.element)).then(()=>{Tl(t.element,t.src),o.innerHTML="";const n=document.createElement(t.element),s=t.attrs||{};for(const a in s){const i=s[a],r=i!=null&&typeof i=="object"?JSON.stringify(i):String(i);try{n[a]=i}catch{}try{n.setAttribute(a,r)}catch{}}n.style.cssText="display:block;position:absolute;inset:0;width:100%;height:100%;",o.appendChild(n);for(const a of[0,250,1500])setTimeout(()=>this.watchContextLoss(e),a);this.hostState={...this.hostState,[e]:"ready"}}).catch(n=>{this._hostMounted[e]=!1,this.hostState={...this.hostState,[e]:"error"},this.hostError={...this.hostError,[e]:n&&n.message||String(n)}}))},iconSvg(e){return e?Sa(e):""},initial(e){const t=(e||"").trim();return t?t.charAt(0).toUpperCase():"•"},isFolderClosed(e){const t=this.folderOverride[e.key];return t!=null?!t:e.open!==!0},toggleFolder(e){const t=this.folderOverride[e],o=(this.groups||[]).find(s=>s.key===e),n=t??(o&&o.open===!0);this.folderOverride={...this.folderOverride,[e]:!n}},pick(e){this.$emit("update:active",e),this.narrow&&(this.navOpen=!1)},onKey(e){const t=this.orderedKeys;if(!t.length)return;const o=t.indexOf(this.active);let n=-1;if(e.key==="ArrowDown"||e.key==="ArrowRight")n=(o+1)%t.length;else if(e.key==="ArrowUp"||e.key==="ArrowLeft")n=(o-1+t.length)%t.length;else if(e.key==="Home")n=0;else if(e.key==="End")n=t.length-1;else return;e.preventDefault();const s=t[n];this.pick(s),this.$nextTick(()=>{const a=this._tabEls[s];a&&a.focus&&a.focus()})}}}),Il={key:0,class:"vtl-top"},Nl=["aria-expanded","aria-label"],El={class:"vtl-brand"},Rl={class:"vtl-title"},Wl={class:"vtl-meta"},Dl=["aria-expanded","aria-label"],zl={class:"vtl-pbar-end"},Hl={class:"vtl-body"},Bl=["aria-label","aria-hidden","role","aria-orientation"],Ul=["href","aria-label","title"],jl=["innerHTML"],Vl={class:"vtl-home-tx"},ql=["aria-expanded","aria-label"],Gl=["innerHTML"],Kl={class:"vtl-collapse-tx"},Jl=["aria-expanded","onClick"],Xl={key:0,class:"vtl-cap"},Zl={class:"vtl-tl"},Yl={key:1,class:"vtl-td"},Ql=["innerHTML"],ec={key:1,class:"vtl-tier"},tc={key:0,class:"vtl-cap"},oc={class:"vtl-tl"},nc={key:1,class:"vtl-td"},sc={class:"vtl-rows"},ac=["aria-selected","aria-disabled","tabindex","onClick"],rc=["innerHTML"],ic={key:1,class:"vtl-tab-emoji","aria-hidden":"true"},lc={key:2,class:"vtl-tab-fallback","aria-hidden":"true"},cc={class:"vtl-tab-text"},dc={class:"vtl-tab-label"},pc={key:0,class:"vtl-tab-badge"},uc={key:0,class:"vtl-tab-sub"},fc=["innerHTML"],gc=["aria-selected","aria-disabled","tabindex","onClick"],hc=["innerHTML"],$c={key:1,class:"vtl-tab-emoji","aria-hidden":"true"},mc={key:2,class:"vtl-tab-fallback","aria-hidden":"true"},_c={class:"vtl-tab-text"},bc={class:"vtl-tab-label"},vc={key:0,class:"vtl-tab-sub"},yc={key:4,class:"vtl-rail-end"},wc={class:"vtl-main"},xc={class:"vtl-content"},kc=["hidden"],Tc={key:0,class:"vtl-host-hint"},Sc={key:1,class:"vtl-host-hint"},Mc=["onClick"],Lc={key:2,class:"vtl-host-hint err"};function Oc(e,t,o,n,s,a){const i=fo("BackToTopButton");return M(),C("div",{class:Te(["vtl",{"nav-open":e.navOpen,"rail-collapsed":e.railCollapsed,"no-header":!e.header,"has-phone-bar":e.phoneBarShown}])},[e.header?(M(),C("header",Il,[I("button",{class:"vtl-menu",type:"button","aria-expanded":String(e.navOpen),onClick:t[0]||(t[0]=r=>e.navOpen=!e.navOpen),"aria-label":e.label("toggleList")},"☰",8,Nl),I("span",El,[tt(e.$slots,"brand")]),I("b",Rl,E(e.title),1),I("span",Wl,[tt(e.$slots,"meta")])])):ne("",!0),e.phoneBarShown?(M(),C("div",{key:1,class:Te(["vtl-pbar",{"is-web":e.mode==="web"}])},[I("button",{class:"vtl-phone-menu",type:"button","aria-expanded":String(e.navOpen),onClick:t[1]||(t[1]=r=>e.navOpen=!e.navOpen),"aria-label":e.label("toggleList")},"☰",8,Dl),I("span",zl,[tt(e.$slots,"phone-end")])],2)):ne("",!0),e.narrow?(M(),Pt(i,{key:2,target:e.activeHostEl,labels:{backToTop:e.T("actions.backToTop","Back to top")}},null,8,["target","labels"])):ne("",!0),I("div",Hl,[I("nav",{class:Te(["vtl-nav",{"has-rail-end":e.railEndShown&&!!e.$slots["rail-end"]}]),"aria-label":e.navLabel,"aria-hidden":String(!e.railShown),role:e.$slots.rail?null:"tablist","aria-orientation":e.$slots.rail?null:"vertical"},[e.homeLink?(M(),C("a",{key:0,class:"vtl-home",href:e.homeLink,target:"_top","aria-label":e.homeText,title:e.railCollapsed&&!e.narrow?e.homeText:null},[I("span",{class:"vtl-home-ic","aria-hidden":"true",innerHTML:e.iconSvg("home")},null,8,jl),I("span",Vl,E(e.homeText),1)],8,Ul)):ne("",!0),I("button",{type:"button",class:"vtl-collapse","aria-expanded":String(!e.railCollapsed),"aria-label":e.railCollapsed?e.label("expandList"):e.label("collapseList"),onClick:t[2]||(t[2]=(...r)=>e.toggleRail&&e.toggleRail(...r))},[I("span",{class:"vtl-collapse-ic","aria-hidden":"true",innerHTML:e.iconSvg("chevron")},null,8,Gl),I("span",Kl,E(e.label("collapse")),1)],8,ql),e.$slots.rail?tt(e.$slots,"rail",{collapsed:e.railCollapsed&&!e.narrow,expand:e.expandRail,pick:e.pick},void 0,void 0,1):e.groups&&e.groups.length?(M(!0),C(ee,{key:2},ft(e.groups,r=>(M(),C("div",{class:"vtl-grp",key:r.key},[r.folder?(M(),C("button",{key:0,type:"button",class:"vtl-tier vtl-tier-btn","aria-expanded":String(!e.isFolderClosed(r)),onClick:l=>e.toggleFolder(r.key)},[r.badge?(M(),C("span",Xl,E(r.badge),1)):ne("",!0),I("span",Zl,E(r.label),1),r.count!=null?(M(),C("span",Yl,E(r.count),1)):ne("",!0),I("span",{class:Te(["vtl-chev",{open:!e.isFolderClosed(r)}]),"aria-hidden":"true",innerHTML:e.iconSvg("chevron")},null,10,Ql)],8,Jl)):(M(),C("div",ec,[r.badge?(M(),C("span",tc,E(r.badge),1)):ne("",!0),I("span",oc,E(r.label),1),r.count!=null?(M(),C("span",nc,E(r.count),1)):ne("",!0)])),en(I("div",sc,[(M(!0),C(ee,null,ft(r.rows,l=>(M(),C("button",{key:l.key,type:"button",role:"tab",class:Te(["vtl-tab",{active:l.key===e.active,disabled:l.disabled}]),"aria-selected":String(l.key===e.active),"aria-disabled":l.disabled?"true":null,tabindex:l.key===e.active?0:-1,ref_for:!0,ref:d=>e.registerTab(l.key,d),onClick:d=>e.pick(l.key),onKeydown:t[3]||(t[3]=d=>e.onKey(d))},[l.icon?(M(),C("span",{key:0,class:"vtl-tab-ic","aria-hidden":"true",innerHTML:e.iconSvg(l.icon)},null,8,rc)):l.emoji?(M(),C("span",ic,E(l.emoji),1)):(M(),C("span",lc,E(e.initial(l.label)),1)),I("span",cc,[I("span",dc,[$t(E(l.label),1),l.badge?(M(),C("span",pc,E(l.badge),1)):ne("",!0)]),l.sub?(M(),C("span",uc,[I("span",{innerHTML:l.sub},null,8,fc)])):ne("",!0)])],42,ac))),128))],512),[[bn,!r.folder||!e.isFolderClosed(r)]])]))),128)):(M(!0),C(ee,{key:3},ft(e.items,r=>(M(),C("button",{key:r.key,type:"button",role:"tab",class:Te(["vtl-tab",{active:r.key===e.active,disabled:r.disabled}]),"aria-selected":String(r.key===e.active),"aria-disabled":r.disabled?"true":null,tabindex:r.key===e.active?0:-1,ref_for:!0,ref:l=>e.registerTab(r.key,l),onClick:l=>e.pick(r.key),onKeydown:t[4]||(t[4]=l=>e.onKey(l))},[r.icon?(M(),C("span",{key:0,class:"vtl-tab-ic","aria-hidden":"true",innerHTML:e.iconSvg(r.icon)},null,8,hc)):r.emoji?(M(),C("span",$c,E(r.emoji),1)):(M(),C("span",mc,E(e.initial(r.label)),1)),I("span",_c,[I("span",bc,E(r.label),1),r.sub?(M(),C("span",vc,E(r.sub),1)):ne("",!0)])],42,gc))),128)),e.railEndShown&&e.$slots["rail-end"]?(M(),C("div",yc,[tt(e.$slots,"rail-end",{collapsed:e.railCollapsed})])):ne("",!0)],10,Bl),I("main",wc,[e.header?tt(e.$slots,"toolbar",{},void 0,void 0,0):ne("",!0),I("div",xc,[(M(!0),C(ee,null,ft(e.mountedElementRows,r=>en((M(),C("section",{key:r.key,class:"vtl-host",hidden:r.key!==e.active,ref_for:!0,ref:l=>{l?e.hostEls[r.key]=l:delete e.hostEls[r.key]}},[I("div",{class:"vtl-host-slot",ref_for:!0,ref:l=>e.setHostSlot(r.key,l)},null,512),e.hostState[r.key]==="loading"?(M(),C("div",Tc,E(e.T("messages.loadingNamed","Loading {name}…").replace("{name}",r.label)),1)):e.hostState[r.key]==="lost"?(M(),C("div",Sc,[$t(E(e.T("messages.mapContextLost","This map was unloaded to free graphics memory."))+" ",1),I("button",{type:"button",class:"vtl-host-reload",onClick:l=>e.reloadHostElement(r.key)},E(e.T("buttons.reloadMap","Reload Map")),9,Mc)])):e.hostState[r.key]==="error"?(M(),C("div",Lc,[$t(E(e.T("messages.couldNotLoadNamed","Could not load {name}.").replace("{name}",r.label)),1),t[5]||(t[5]=I("br",null,null,-1)),I("small",null,E(e.hostError[r.key]),1)])):ne("",!0)],8,kc)),[[bn,r.key===e.active]])),128)),tt(e.$slots,"default")])])])],2)}const Ac=xo(Fl,[["render",Oc],["styles",[Ll]]]),Pa=[{code:"en",name:"English",nativeName:"English",flag:"🇺🇸"},{code:"es",name:"Spanish",nativeName:"Español",flag:"🇪🇸"},{code:"fr",name:"French",nativeName:"Français",flag:"🇫🇷"},{code:"pt",name:"Portuguese",nativeName:"Português",flag:"🇵🇹"},{code:"ar",name:"Arabic",nativeName:"العربية",flag:"🇸🇦",dir:"rtl"},{code:"ru",name:"Russian",nativeName:"Русский",flag:"🇷🇺"},{code:"de",name:"German",nativeName:"Deutsch",flag:"🇩🇪",hideFromSwitcher:!0},{code:"hi",name:"Hindi",nativeName:"हिन्दी",flag:"🇮🇳",hideFromSwitcher:!0},{code:"it",name:"Italian",nativeName:"Italiano",flag:"🇮🇹",hideFromSwitcher:!0},{code:"ro",name:"Romanian",nativeName:"Română",flag:"🇷🇴",hideFromSwitcher:!0},{code:"zh",name:"Chinese",nativeName:"中文",flag:"🇨🇳",hideFromSwitcher:!0}],Pc=Pa.filter(e=>!e.hideFromSwitcher);function Ca(e){return Pa.find(t=>t.code===e)}const Cc="doxa-maps:locale";function Fc(e){try{localStorage.setItem(Cc,e)}catch{}}const Ic="doxa-language-request";function Nc(e){try{const t=e&&e.getRootNode&&e.getRootNode();if(t&&t.host)return t.host}catch{}return e||null}function Ec(e,t){const o=Nc(e);return!o||typeof o.dispatchEvent!="function"?!0:o.dispatchEvent(new CustomEvent(Ic,{detail:{language:t},bubbles:!0,composed:!0,cancelable:!0}))}function Rc(e,t=typeof window<"u"?window:null){try{if(!t||t.MAP_OWNS_PAGE!==!0||!t.history||!t.location)return!1;const o=new URL(t.location.href);return o.searchParams.set("lang",e),t.history.replaceState(t.history.state,"",o.toString()),!0}catch{return!1}}const Wc=".slm[data-v-12760774]{position:relative;display:inline-flex;align-items:center;min-height:44px;max-width:100%;box-sizing:border-box;border-radius:8px;color:#3b463d}.slm-face[data-v-12760774]{display:inline-flex;align-items:center;gap:6px;padding-inline:10px;min-width:0;font-size:13px;font-weight:500;line-height:1.2}.slm-ic[data-v-12760774]{flex:0 0 auto;display:inline-flex;color:var(--vtl-muted, #6d766e)}.slm-ic[data-v-12760774] svg{width:18px;height:18px}.slm-name[data-v-12760774]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.slm-code[data-v-12760774]{font-weight:600;font-size:12px;letter-spacing:.03em}.slm-caret[data-v-12760774]{flex:0 0 auto;color:var(--vtl-muted, #6d766e);font-size:11px}.slm.collapsed .slm-face[data-v-12760774]{flex-direction:column;gap:2px;padding-inline:4px}.slm-select[data-v-12760774]{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;margin:0;border:0;cursor:pointer;font-size:16px}.slm[data-v-12760774]:hover{background:var(--vtl-accented, #d1d4cd)}.slm[data-v-12760774]:focus-within{outline:2px solid var(--vtl-accent, #92b195);outline-offset:-2px}@media (prefers-reduced-motion: reduce){.slm[data-v-12760774]{transition:none}}",Dc={class:"slm-face","aria-hidden":"true"},zc=["innerHTML"],Hc={key:0,class:"slm-code"},Bc=["lang","dir"],Uc={key:2,class:"slm-caret"},jc=["value","aria-label","title"],Vc=["value","lang","dir"],qc=xo({__name:"ShellLanguageMenu",props:{current:{type:String,default:"en"},collapsed:{type:Boolean,default:!1}},emits:["switch"],setup(e,{emit:t}){const o=e,n=t,s=Et(()=>{const d=Pc.slice();if(o.current&&!d.some(p=>p.code===o.current)){const p=Ca(o.current);p&&d.push(p)}return d}),a=Et(()=>Ca(o.current)||{code:o.current,nativeName:o.current}),i=Et(()=>ka("controls.language",o.current)||"Language"),r=Sa("globe");function l(d){const p=d.target,f=p.value;!f||f===o.current||(Ec(p,f)?(n("switch",f),Rc(f)):p.value=o.current)}return(d,p)=>(M(),C("span",{class:Te(["slm",{collapsed:e.collapsed}])},[I("span",Dc,[I("span",{class:"slm-ic",innerHTML:Zo(r)},null,8,zc),e.collapsed?(M(),C("span",Hc,E(String(e.current).toUpperCase()),1)):(M(),C("span",{key:1,class:"slm-name",lang:a.value.code,dir:a.value.dir||null},E(a.value.nativeName),9,Bc)),e.collapsed?ne("",!0):(M(),C("span",Uc,"▾"))]),I("select",{class:"slm-select",value:e.current,"aria-label":i.value,title:i.value,onChange:l},[(M(!0),C(ee,null,ft(s.value,f=>(M(),C("option",{key:f.code,value:f.code,lang:f.code,dir:f.dir||null},E(f.nativeName),9,Vc))),128))],40,jc)],2))}},[["styles",[Wc]],["__scopeId","data-v-12760774"]]),ko={en:{"sec.posters":"Posters","sec.experimental":"Experimental","tab.upg-100":"UPG 100 List Posters","sub.upg-100":"my unreached list + posters","tab.country-posters":"Country Posters","sub.country-posters":"a poster for every country","tab.poster-design":"Poster Design","sub.poster-design":"every poster style and size","tab.wall-of-people-groups":"Wall of People Groups","tab.bible-posters":"Bible Posters",experimentalSub:"experimental bundle",lab:"lab",loading:"Loading {label}…",loadFailed:"Could not load {label}.",manifestHint:"This tab is composed from manifest.json — build the tree, or serve the built tree, to load it.",backToTop:"Back to top",home:"Back to homepage",toggleList:"Toggle list",openViews:"Open the list of views",expandList:"Expand list",collapseList:"Collapse list",collapse:"Collapse"},es:{"sec.posters":"Carteles","sec.experimental":"Experimental","tab.upg-100":"Carteles de la lista UPG 100","sub.upg-100":"mi lista de no alcanzados + carteles","tab.country-posters":"Carteles por país","sub.country-posters":"un cartel para cada país","tab.poster-design":"Diseño de carteles","sub.poster-design":"todos los estilos y tamaños de cartel","tab.wall-of-people-groups":"Muro de los pueblos","tab.bible-posters":"Carteles bíblicos",experimentalSub:"mapa experimental",lab:"beta",loading:"Cargando {label}…",loadFailed:"No se pudo cargar {label}.",manifestHint:"Esta pestaña se compone a partir de manifest.json: compila el árbol o sirve el árbol compilado para cargarla.",backToTop:"Volver arriba",home:"Volver a la página de inicio",toggleList:"Mostrar u ocultar la lista",openViews:"Abrir la lista de vistas",expandList:"Expandir la lista",collapseList:"Contraer la lista",collapse:"Contraer"},fr:{"sec.posters":"Affiches","sec.experimental":"Expérimental","tab.upg-100":"Affiches de la liste UPG 100","sub.upg-100":"ma liste des non atteints + affiches","tab.country-posters":"Affiches par pays","sub.country-posters":"une affiche pour chaque pays","tab.poster-design":"Conception d’affiches","sub.poster-design":"tous les styles et formats d’affiche","tab.wall-of-people-groups":"Mur des peuples","tab.bible-posters":"Affiches bibliques",experimentalSub:"carte expérimentale",lab:"bêta",loading:"Chargement de {label}…",loadFailed:"Impossible de charger {label}.",manifestHint:"Cet onglet est composé à partir de manifest.json : construisez l'arborescence ou servez l'arborescence construite pour le charger.",backToTop:"Retour en haut",home:"Retour à l’accueil",toggleList:"Afficher ou masquer la liste",openViews:"Ouvrir la liste des vues",expandList:"Déplier la liste",collapseList:"Replier la liste",collapse:"Replier"},de:{"sec.posters":"Poster","sec.experimental":"Experimentell","tab.upg-100":"Poster der UPG 100 Liste","sub.upg-100":"meine Liste der Unerreichten + Poster","tab.country-posters":"Länderposter","sub.country-posters":"ein Poster für jedes Land","tab.poster-design":"Postergestaltung","sub.poster-design":"alle Posterstile und -größen","tab.wall-of-people-groups":"Wand der Volksgruppen","tab.bible-posters":"Bibelposter",experimentalSub:"experimentelle Karte",lab:"Beta",loading:"{label} wird geladen…",loadFailed:"{label} konnte nicht geladen werden.",manifestHint:"Dieser Tab wird aus manifest.json zusammengesetzt – bauen Sie den Baum oder stellen Sie den gebauten Baum bereit, um ihn zu laden.",backToTop:"Nach oben",home:"Zurück zur Startseite",toggleList:"Liste ein-/ausblenden",openViews:"Ansichtsliste öffnen",expandList:"Liste ausklappen",collapseList:"Liste einklappen",collapse:"Einklappen"},pt:{"sec.posters":"Cartazes","sec.experimental":"Experimental","tab.upg-100":"Cartazes da lista UPG 100","sub.upg-100":"minha lista de não alcançados + cartazes","tab.country-posters":"Cartazes por país","sub.country-posters":"um cartaz para cada país","tab.poster-design":"Design de cartazes","sub.poster-design":"todos os estilos e tamanhos de cartaz","tab.wall-of-people-groups":"Mural dos povos","tab.bible-posters":"Cartazes bíblicos",experimentalSub:"mapa experimental",lab:"beta",loading:"Carregando {label}…",loadFailed:"Não foi possível carregar {label}.",manifestHint:"Esta aba é composta a partir do manifest.json — compile a árvore ou sirva a árvore compilada para carregá-la.",backToTop:"Voltar ao topo",home:"Voltar à página inicial",toggleList:"Mostrar ou ocultar a lista",openViews:"Abrir a lista de visualizações",expandList:"Expandir a lista",collapseList:"Recolher a lista",collapse:"Recolher"},it:{"sec.posters":"Poster","sec.experimental":"Sperimentale","tab.upg-100":"Poster della lista UPG 100","sub.upg-100":"la mia lista dei non raggiunti + poster","tab.country-posters":"Poster per paese","sub.country-posters":"un poster per ogni paese","tab.poster-design":"Design dei poster","sub.poster-design":"tutti gli stili e i formati dei poster","tab.wall-of-people-groups":"Muro dei popoli","tab.bible-posters":"Poster biblici",experimentalSub:"mappa sperimentale",lab:"beta",loading:"Caricamento di {label}…",loadFailed:"Impossibile caricare {label}.",manifestHint:"Questa scheda è composta da manifest.json: compila l'albero o pubblica l'albero compilato per caricarla.",backToTop:"Torna su",home:"Torna alla home page",toggleList:"Mostra o nascondi l’elenco",openViews:"Apri l’elenco delle viste",expandList:"Espandi l’elenco",collapseList:"Comprimi l’elenco",collapse:"Comprimi"},ro:{"sec.posters":"Afișe","sec.experimental":"Experimental","tab.upg-100":"Afișe din lista UPG 100","sub.upg-100":"lista mea de neatinși + afișe","tab.country-posters":"Afișe pe țări","sub.country-posters":"un afiș pentru fiecare țară","tab.poster-design":"Design de afișe","sub.poster-design":"toate stilurile și dimensiunile de afiș","tab.wall-of-people-groups":"Zidul popoarelor","tab.bible-posters":"Afișe biblice",experimentalSub:"hartă experimentală",lab:"beta",loading:"Se încarcă {label}…",loadFailed:"{label} nu a putut fi încărcat.",manifestHint:"Această filă este compusă din manifest.json — construiți arborele sau serviți arborele construit pentru a o încărca.",backToTop:"Sus",home:"Înapoi la pagina principală",toggleList:"Afișează sau ascunde lista",openViews:"Deschide lista de vizualizări",expandList:"Extinde lista",collapseList:"Restrânge lista",collapse:"Restrânge"},ru:{"sec.posters":"Плакаты","sec.experimental":"Экспериментальное","tab.upg-100":"Плакаты списка UPG 100","sub.upg-100":"мой список недостигнутых + плакаты","tab.country-posters":"Плакаты по странам","sub.country-posters":"плакат для каждой страны","tab.poster-design":"Дизайн плакатов","sub.poster-design":"все стили и размеры плакатов","tab.wall-of-people-groups":"Стена народов","tab.bible-posters":"Библейские плакаты",experimentalSub:"экспериментальная карта",lab:"бета",loading:"Загрузка: {label}…",loadFailed:"Не удалось загрузить: {label}.",manifestHint:"Эта вкладка собирается из manifest.json — соберите дерево или разместите собранное дерево, чтобы загрузить её.",backToTop:"Наверх",home:"На главную страницу",toggleList:"Показать или скрыть список",openViews:"Открыть список представлений",expandList:"Развернуть список",collapseList:"Свернуть список",collapse:"Свернуть"},ar:{"sec.posters":"ملصقات","sec.experimental":"تجريبي","tab.upg-100":"ملصقات قائمة UPG 100","sub.upg-100":"قائمتي لغير المُبشَّرين + ملصقات","tab.country-posters":"ملصقات الدول","sub.country-posters":"ملصق لكل دولة","tab.poster-design":"تصميم الملصقات","sub.poster-design":"كل أنماط الملصقات وأحجامها","tab.wall-of-people-groups":"جدار الشعوب","tab.bible-posters":"ملصقات الكتاب المقدس",experimentalSub:"خريطة تجريبية",lab:"تجريبي",loading:"جارٍ تحميل {label}…",loadFailed:"تعذّر تحميل {label}.",manifestHint:"تُبنى علامة التبويب هذه من manifest.json — ابنِ الشجرة أو قدّم الشجرة المبنية لتحميلها.",backToTop:"إلى الأعلى",home:"العودة إلى الصفحة الرئيسية",toggleList:"إظهار القائمة أو إخفاؤها",openViews:"فتح قائمة العروض",expandList:"توسيع القائمة",collapseList:"طي القائمة",collapse:"طي"},hi:{"sec.posters":"पोस्टर","sec.experimental":"प्रायोगिक","tab.upg-100":"UPG 100 सूची पोस्टर","sub.upg-100":"मेरी अप्राप्त सूची + पोस्टर","tab.country-posters":"देश पोस्टर","sub.country-posters":"हर देश के लिए एक पोस्टर","tab.poster-design":"पोस्टर डिज़ाइन","sub.poster-design":"हर पोस्टर शैली और आकार","tab.wall-of-people-groups":"जनसमूहों की दीवार","tab.bible-posters":"बाइबल पोस्टर",experimentalSub:"प्रायोगिक मानचित्र",lab:"बीटा",loading:"{label} लोड हो रहा है…",loadFailed:"{label} लोड नहीं हो सका।",manifestHint:"यह टैब manifest.json से बनता है — इसे लोड करने के लिए ट्री बनाएँ या बना हुआ ट्री सर्व करें।",backToTop:"ऊपर जाएँ",home:"होमपेज पर वापस जाएँ",toggleList:"सूची दिखाएँ या छिपाएँ",openViews:"दृश्यों की सूची खोलें",expandList:"सूची फैलाएँ",collapseList:"सूची संक्षिप्त करें",collapse:"संक्षिप्त करें"},zh:{"sec.posters":"海报","sec.experimental":"实验性","tab.upg-100":"UPG 100 名单海报","sub.upg-100":"我的未得之民名单 + 海报","tab.country-posters":"国家海报","sub.country-posters":"每个国家一张海报","tab.poster-design":"海报设计","sub.poster-design":"所有海报样式与尺寸","tab.wall-of-people-groups":"民族之墙","tab.bible-posters":"圣经海报",experimentalSub:"实验性地图",lab:"测试版",loading:"正在加载{label}…",loadFailed:"无法加载{label}。",manifestHint:"此标签页由 manifest.json 组成——请构建目录树或提供已构建的目录树以加载它。",backToTop:"回到顶部",home:"返回首页",toggleList:"显示或隐藏列表",openViews:"打开视图列表",expandList:"展开列表",collapseList:"折叠列表",collapse:"折叠"}},Tn=Object.keys(ko);function Gc(e,t,o){let s=(ko[e]||ko.en)[t]??ko.en[t]??t;if(o)for(const a in o)s=s.split("{"+a+"}").join(String(o[a]));return s}const Kc=[{key:"posters",i18n:"sec.posters",icon:"poster"},{key:"experimental",i18n:"sec.experimental",icon:"flask",folder:!0,open:!0}],Fa=[{id:"upg-100",section:"posters",icon:"list",bundle:"my-upg-100-list",profile:"upg-100-mfe"},{id:"country-posters",section:"posters",icon:"map",bundle:"country-posters",profile:"country-posters-mfe"},{id:"poster-design",section:"posters",icon:"poster",bundle:"poster-design",profile:"poster-design-mfe"},{id:"wall-of-people-groups",section:"experimental",icon:"flask",bundle:"wall-of-people-groups",profile:"wall-of-people-groups"},{id:"bible-posters",section:"experimental",icon:"flask",bundle:"bible-posters",profile:"bible-posters"}],Jc=new Set(["key-cities","posterverse","doxa-maps-spa","plugin-studio"]),Xc=new Set(["my-upg-100-list-map","country-posters-map"]);function Zc(e,t=()=>{}){const o=e&&Array.isArray(e.bundles)?e.bundles:[],n=Object.fromEntries(o.map(a=>[a&&a.bundle,a])),s=[];for(const a of Fa){if(Jc.has(a.bundle))continue;const i=n[a.bundle];if(!i)continue;const r=Array.isArray(i.profiles)?i.profiles:[];let l=r.find(f=>f&&f.profile===a.profile);if(!l){if(l=r.find(f=>f&&f.profile===a.bundle)||r[0],!l)continue;t(`[posterverse] ${a.bundle} has no profile "${a.profile}"; row "${a.id}" opens "${l.profile}" instead`)}const d=l.element||Array.isArray(i.elements)&&i.elements[0]||a.bundle,p=i.scriptUrl||l.scriptUrl||"";p&&s.push({...a,tag:d,scriptUrl:p,profile:l.profile,heavy:Xc.has(d)||!!l.isMap})}return s}const Yc=":host{display:block;position:relative;height:var(--posterverse-height, 85vh);min-height:480px}:host{font-size:16px;line-height:normal;font-weight:400;font-style:normal;font-variant:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;text-align:start;text-indent:0;text-shadow:none;white-space:normal;-webkit-hyphens:manual;hyphens:manual;visibility:visible;cursor:auto}:host([hidden]){display:none}.pv-pane{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;--profile-min-h: 0}.pv-slot{position:relative;min-height:100%}.pv-hint{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;text-align:center;color:#6d766e;font-size:13px;padding:20px}.pv-hint.err{color:#b3261e}.pv-hint small{color:#6d766e}";function Ia(){try{const e=new URLSearchParams(location.search),t=(e.get("lang")||e.get("locale")||"").split("-")[0].toLowerCase();if(Tn.includes(t))return t}catch{}try{const e=(document.documentElement.lang||"").split("-")[0].toLowerCase();if(Tn.includes(e))return e}catch{}return""}const Na=e=>({...e,tag:e.tag||"",scriptUrl:e.scriptUrl||"",heavy:!!e.heavy,mounted:!1,state:"idle",error:""}),Qc=nn({name:"Posterverse",inheritAttrs:!1,components:{VerticalTabsLayout:Ac,BackToTopButton:ba,ShellLanguageMenu:qc},props:{treeBase:{type:String,default:""},profileConfig:{type:[String,Object],default:""},heading:{type:String,default:"Posterverse"},tokenUrl:{type:String,default:""},tk:{type:String,default:""},language:{type:String,default:""},apiBaseUrl:{type:String,default:""},provider:{type:String,default:""},tab:{type:String,default:""},homeHref:{type:String,default:""},homeLabel:{type:String,default:""}},emits:["tab-change"],setup(){return{injectedBase:St("pvTreeBase","")}},data(){return{paneEls:{},activeIndex:0,manifestError:"",manifestBase:"",runtime:{},hostLang:Ia(),localPick:"",pickBase:null,tabs:Fa.filter(e=>!e.provisional).map(Na)}},computed:{cfg(){let e=this.profileConfig;if(typeof e=="string")try{e=e?JSON.parse(e):{}}catch{e={}}return e&&typeof e=="object"?e:{}},base(){const e=String(this.treeBase||this.cfg.treeBase||this.injectedBase||"").trim();return e?e.replace(/\/+$/,"")+"/":""},assetsBase(){const e=String(this.cfg.assetsBase||"").trim();return/^https?:\/\//i.test(e)||e.startsWith("/")?e.replace(/\/+$/,""):this.manifestBase?this.manifestBase.replace(/\/+$/,"")+"/assets":""},headingText(){return String(this.cfg.heading||this.heading||"").trim()||"Posterverse"},hostLanguage(){return String(this.language||this.cfg.language||this.cfg.locale||this.cfg.lang||"").trim()},effectiveLocale(){return this.localPick&&this.hostLanguage===this.pickBase?this.localPick:(this.hostLanguage||this.hostLang||"en").split("-")[0].toLowerCase()},uiLocale(){return Tn.includes(this.effectiveLocale)?this.effectiveLocale:"en"},defaultHomeHref(){return"https://doxa.life"+(this.uiLocale&&this.uiLocale!=="en"?"/"+this.uiLocale:"")},uiDir(){return this.uiLocale==="ar"?"rtl":"ltr"},layoutLabels(){const e={};for(const t of["toggleList","openViews","expandList","collapseList","collapse","home"])e[t]=this.tr(t);return e},effectiveProvider(){const e=String(this.provider||this.cfg.provider||"").trim().toLowerCase();return e==="maplibre"||e==="mapbox"?e:""},activeKey(){const e=this.tabs[this.activeIndex];return e?e.id:""},activePaneEl(){return this.paneEls[this.activeIndex]||null},navGroups(){return Kc.map(e=>({key:e.key,label:this.tr(e.i18n),icon:e.icon,folder:!!e.folder,open:e.open,rows:this.tabs.filter(t=>t.section===e.key).map(t=>({key:t.id,label:this.tabLabel(t),sub:this.tabSub(t),icon:t.icon,badge:e.folder?this.tr("lab"):void 0}))})).filter(e=>e.rows.length)}},watch:{effectiveLocale(){const e=(o,n)=>{try{const s=this._slots&&this._slots[o];s&&(s.innerHTML="")}catch{}n.mounted=!1,n.state="idle",n.error=""};this.tabs.forEach((o,n)=>{o.mounted&&n!==this.activeIndex&&e(n,o)});const t=this.tabs[this.activeIndex];!t||!t.mounted||(e(this.activeIndex,t),this.mountElement(this.activeIndex))},tab(e){e&&this.onSelect(e)},hostLanguage(e){e!==this.pickBase&&(this.localPick="",this.pickBase=null)}},mounted(){this.watchHostLang(),this.select(this.initialIndex()),this.loadManifest()},beforeUnmount(){this._langObs&&(this._langObs.disconnect(),this._langObs=null)},methods:{tr(e,t){return Gc(this.uiLocale,e,t)},setLocale(e){this.pickBase=this.hostLanguage,this.localPick=e,Fc(e)},tabLabel(e){return this.tr("tab."+e.id)},tabSub(e){return e.section==="experimental"?this.tr("experimentalSub"):this.tr("sub."+e.id)},setSlot(e,t){t&&(this._slots=Object.assign(this._slots||{},{[e]:t}))},watchHostLang(){typeof MutationObserver>"u"||typeof document>"u"||(this._langObs=new MutationObserver(()=>{this.hostLang=Ia()}),this._langObs.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]}))},requestedTab(){let e="";try{e=new URLSearchParams(location.search).get("tab")||""}catch{}return String(this.tab||this.cfg.tab||e||"").trim()},initialIndex(){const e=this.tabs.findIndex(t=>t.id===this.requestedTab());return e>=0?e:0},loadManifest(){const e=d=>{try{return new URL(d,location.href).href.replace(/[^/]*$/,"")}catch{return""}},t=this.resolve("manifest.json"),o={url:t,root:e(t)},n={url:this.resolve("doxa-maps-spa/manifest.json"),root:o.root};let s=!1;try{s=new URL(t,location.href).origin!==location.origin}catch{}const a=s?[n,o]:[o,n],i="/public/dx-maps/manifest.json";a.some(d=>d.url===i)||a.push({url:i,root:e(i)});const r=[],l=d=>{if(d>=a.length){this.manifestError="manifest.json not found (tried "+r.join(", ")+")",console.error("[posterverse] "+this.manifestError+" — every tab is composed from it.");return}const{url:p,root:f}=a[d];return r.push(p),fetch(p,{credentials:"same-origin"}).then(w=>{if(!w||!w.ok)throw new Error(p+" → HTTP "+(w?w.status:"?"));return w.json()}).then(w=>{if(!w)throw new Error(p+" → empty");this.manifestError="",this.manifestBase=f||"",this.applyManifest(w)}).catch(()=>l(d+1))};try{l(0)}catch{}},applyManifest(e){this.runtime=e&&e.runtime&&typeof e.runtime=="object"?e.runtime:{},this.applyPageGlobals();const t=this.activeKey;this.tabs=Zc(e,a=>console.warn(a)).map(Na);const o=this.requestedTab(),n=!this._honouredTab&&o?this.tabs.findIndex(a=>a.id===o):-1,s=this.tabs.findIndex(a=>a.id===t);this._honouredTab=!0,this.select(n>=0?n:s>=0?s:0)},onSelect(e){const t=this.tabs.findIndex(o=>o.id===e);t!==-1&&this.select(t)},resolve(e){const t=String(e);if(/^(https?:)?\/\//.test(t)||t.startsWith("/"))return t;const o=t.replace(/^\.\//,"");return this.manifestBase?this.manifestBase.replace(/\/+$/,"")+"/"+o:this.base?this.base.replace(/\/+$/,"")+"/"+o:"../"+o},select(e){const t=this.activeIndex;if(this.activeIndex=e,t!==e&&t>=0){const n=this.tabs[t];n&&n.heavy&&n.mounted&&this.releaseTab(t,n)}const o=this.tabs[e];o&&((t!==e||!this._announced)&&(this._announced=!0,this.$emit("tab-change",{id:o.id,label:this.tabLabel(o)})),o.scriptUrl&&(o.mounted||this.$nextTick(()=>{this.activeIndex===e&&this.mountElement(e)})))},releaseTab(e,t){try{const o=this._slots&&this._slots[e];o&&(o.innerHTML="")}catch{}this._slots&&delete this._slots[e],t.mounted=!1,t.state="idle",t.error=""},childConfig(e){const t={profile:e.profile||e.id,instanceId:"pv-"+e.id};this.effectiveLocale&&(t.locale=this.effectiveLocale);const o=this.tk||this.cfg.tk||this.runtime.token;return o&&(t.tk=o),(this.tokenUrl||this.cfg.tokenUrl)&&(t.tokenUrl=this.tokenUrl||this.cfg.tokenUrl),this.effectiveProvider&&(t.provider=this.effectiveProvider),this.base&&(t.treeBase=this.base),this.assetsBase&&(t.assetsBase=this.assetsBase),t.urlSync=!1,t.mapTitle=this.tabLabel(e),t},applyPageGlobals(){if(typeof window>"u")return;const e=String(this.apiBaseUrl||this.cfg.apiBaseUrl||this.runtime.apiBaseUrl||"").trim();e&&!window.MAP_APP_API_URL&&(window.MAP_APP_API_URL=e.replace(/\/+$/,""));const t=this.tk||this.cfg.tk||this.runtime.token;t&&!window.MAP_TOKEN&&(window.MAP_TOKEN=t),this.effectiveProvider&&!window.MAP_PROVIDER&&(window.MAP_PROVIDER=this.effectiveProvider)},mountElement(e){const t=this.tabs[e];t.mounted=!0,t.state="loading",Aa(this.resolve(t.scriptUrl)).then(()=>Sl(t.tag)).then(()=>{try{if(t.heavy&&this.activeIndex!==e){t.mounted=!1,t.state="idle";return}const o=this._slots&&this._slots[e];if(!o){t.state="error",t.error="no slot";return}o.innerHTML="";const n=document.createElement(t.tag);n.setAttribute("profile-config",JSON.stringify(this.childConfig(t))),this.base&&n.setAttribute("tree-base",this.base.replace(/\/+$/,"")),n.style.cssText="display:block;position:absolute;inset:0;width:100%;height:100%;min-height:0;",o.appendChild(n),t.state="ready"}catch(o){t.state="error",t.error="mount failed: "+(o&&o.message||String(o))}}).catch(o=>{t.state="error",t.error=o&&o.message||String(o)})}}}),ed=["hidden"],td={key:0,class:"pv-hint"},od={key:1,class:"pv-hint err"},nd={key:2,class:"pv-hint err"};function sd(e,t,o,n,s,a){const i=fo("ShellLanguageMenu"),r=fo("BackToTopButton"),l=fo("VerticalTabsLayout");return M(),Pt(l,{dir:e.uiDir,lang:e.uiLocale,labels:e.layoutLabels,title:e.headingText,"nav-label":e.tr("sec.posters"),header:!1,"home-href":e.homeHref||e.cfg.homeHref||e.defaultHomeHref,"home-label":e.homeLabel||e.cfg.homeLabel||"",groups:e.navGroups,active:e.activeKey,"onUpdate:active":e.onSelect},{"phone-end":io(()=>[ge(i,{current:e.uiLocale,onSwitch:e.setLocale},null,8,["current","onSwitch"])]),"rail-end":io(({collapsed:d})=>[ge(i,{current:e.uiLocale,collapsed:d,onSwitch:e.setLocale},null,8,["current","collapsed","onSwitch"])]),default:io(()=>[(M(!0),C(ee,null,ft(e.tabs,(d,p)=>en((M(),C("section",{key:d.id,class:"pv-pane",ref_for:!0,ref:f=>{f?e.paneEls[p]=f:delete e.paneEls[p]},hidden:p!==e.activeIndex},[!d.heavy||p===e.activeIndex?(M(),C(ee,{key:0},[I("div",{class:"pv-slot",ref_for:!0,ref:f=>e.setSlot(p,f)},null,512),d.state==="loading"?(M(),C("div",td,E(e.tr("loading",{label:e.tabLabel(d)})),1)):d.state==="error"?(M(),C("div",od,[$t(E(e.tr("loadFailed",{label:e.tabLabel(d)})),1),t[0]||(t[0]=I("br",null,null,-1)),I("small",null,E(d.error),1)])):d.state==="idle"&&!d.scriptUrl&&e.manifestError?(M(),C("div",nd,[$t(E(e.tr("loadFailed",{label:e.tabLabel(d)})),1),t[1]||(t[1]=I("br",null,null,-1)),I("small",null,E(e.manifestError),1),t[2]||(t[2]=I("br",null,null,-1)),I("small",null,E(e.tr("manifestHint")),1)])):ne("",!0)],64)):ne("",!0)],8,ed)),[[bn,p===e.activeIndex]])),128)),ge(r,{target:e.activePaneEl,labels:{backToTop:e.tr("backToTop")}},null,8,["target","labels"])]),_:1},8,["dir","lang","labels","title","nav-label","home-href","home-label","groups","active","onUpdate:active"])}const ad=xo(Qc,[["render",sd],["styles",[Yc]]]),rd=Ml(),id=il(ad,{configureApp(e){e.provide("pvTreeBase",rd)}});typeof customElements<"u"&&!customElements.get("posterverse-app")&&customElements.define("posterverse-app",id)})(); +`,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",provisional:!0,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 3af949a61..b541f637f 100644 --- a/public/dx-maps/posterverse/posterverse/app/index.html +++ b/public/dx-maps/posterverse/posterverse/app/index.html @@ -67,7 +67,7 @@ - + - + \n\n\n" + "script": "\n\n\n" }, "instances": [ { diff --git a/public/dx-maps/manifest.json b/public/dx-maps/manifest.json index 362ba7ce4..f940a85da 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-K55dXVlZ6Eb6gdoBHffenSbPbPuSLWTMm7U9H9aZAUl+7HVzNXCldC4l/JylOv6u", + "integrity": "sha384-HTRxdoXjuz/Pt8Z0ReAFj1n2FoKHopWMbxkQ0Ph3lmaonh3ux0r5Gd4z7F8MoIj9", "elements": [ "posterverse-app" ], @@ -1391,7 +1391,8 @@ "country-posters/country-posters-mfe", "poster-design/poster-design-mfe", "wall-of-people-groups/wall-of-people-groups", - "bible-posters/bible-posters" + "bible-posters/bible-posters", + "bless-india-posters/bless-india-posters" ], "stage": "experimental", "profiles": [ @@ -1408,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 1095ea670..d827d5e54 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",provisional:!0,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":"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)})(); diff --git a/public/dx-maps/posterverse/posterverse/app/index.html b/public/dx-maps/posterverse/posterverse/app/index.html index b541f637f..58288ca94 100644 --- a/public/dx-maps/posterverse/posterverse/app/index.html +++ b/public/dx-maps/posterverse/posterverse/app/index.html @@ -67,7 +67,7 @@ - + - +