From b103bcea2491f42d5e34322075e46be0c55c1561 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Mon, 28 Sep 2026 10:35:22 +0000 Subject: [PATCH] Update from source 4f3858eab --- library/composables/useMapFly.js | 5 +++-- plugin-designs/doxa-research-map/research-map.vue | 12 +++++++++++- public/dx-maps/doxa-maps-spa/manifest.json | 4 ++-- .../dx-maps/doxa-research-map/doxa-research-map.js | 2 +- .../doxa-research-map/research-map/index.html | 2 +- .../research-map/maplibre/index.html | 2 +- public/dx-maps/manifest.json | 4 ++-- 7 files changed, 21 insertions(+), 10 deletions(-) diff --git a/library/composables/useMapFly.js b/library/composables/useMapFly.js index 282f3b2d..d685346b 100644 --- a/library/composables/useMapFly.js +++ b/library/composables/useMapFly.js @@ -474,8 +474,9 @@ export function useMapFly(options = {}) { /** * zoomToLegendRow — uniform "click a legend row, fit the scope it represents." * - * Reads the full `language-families` source data via map.getSource()._data - * and evaluates the Mapbox filter expression in JS, bypassing the viewport + * Reads the full `language-families` source data through readSourceFeatures() + * (library/maps/pin-selection.js, which knows both engines' source shapes; never + * the engine-private `_data` directly) and evaluates the filter expression in JS, bypassing the viewport * clip that previously caused off-screen regions to silently no-op. fitBounds * is bidirectional — it zooms OUT to a wider region just as readily as it * zooms IN to a tight cluster, so Africa-row and North-India-cluster-row diff --git a/plugin-designs/doxa-research-map/research-map.vue b/plugin-designs/doxa-research-map/research-map.vue index 877f7852..c03f5452 100644 --- a/plugin-designs/doxa-research-map/research-map.vue +++ b/plugin-designs/doxa-research-map/research-map.vue @@ -1553,7 +1553,17 @@ async function openPacket() { const baseLabel = legendTitle.value || tabLabel(activeTab.value) || 'Doxa Map' const zone = { id: String(activeTab.value?.id || 'research-map'), - label: selectedTotal > groups.length ? `${baseLabel} — ${groups.length} of ${selectedTotal}` : baseLabel, + // ★ NO ENGLISH WORD ON A LOCALIZED COVER. I wrote "50 of 214" today and it renders that "of" in + // all eleven locales — my own leak, on the cover of a document whose whole point is that a reader + // in their language can pray from it. The slash needs no translation, and it is not a guess: zh's + // professional translation of legend.progress.short renders exactly this relationship as + // "{covered} / {total}". The word IS available per locale there (ar "من", ru "из", fr "sur"), but that + // key carries "· {pct}%" with it, so reusing it would mean either a wrong suffix or slicing a + // translated string on a separator I cannot guarantee survives translation. + // Wrapped in U+2066/U+2069 isolates, the convention the ar catalogue already uses for numeric + // ranges (five times, e.g. "⁦30–59%⁩"): without them the pair reorders against Arabic text + // beside it and reads as "214 / 50". NUMERALS ARE HELD, so the digits stay as they are. + label: selectedTotal > groups.length ? `${baseLabel} — ⁦${groups.length} / ${selectedTotal}⁩` : baseLabel, zoneKey: String(activeTab.value?.id || 'research-map'), } const prints = usePosterPrints({ diff --git a/public/dx-maps/doxa-maps-spa/manifest.json b/public/dx-maps/doxa-maps-spa/manifest.json index 4cda4119..0e6c77ef 100644 --- a/public/dx-maps/doxa-maps-spa/manifest.json +++ b/public/dx-maps/doxa-maps-spa/manifest.json @@ -380,7 +380,7 @@ "bundle": "doxa-research-map", "scriptUrl": "./doxa-research-map/doxa-research-map.js", "output": "dx-maps/doxa-research-map/doxa-research-map.js", - "integrity": "sha384-E2e45noJn39Q9pqcIQTevRPgmCOwyhIa2goY0R17jnlpYxtIEj6ihq8nOHvPHwyC", + "integrity": "sha384-cvw7xLaNAOUF9Oqh5u4tyznnbXTM/nV7jscgy0l6sWu/r9NjPEUV+A/6IHhuI/it", "elements": [ "doxa-research-map" ], @@ -399,7 +399,7 @@ "scriptUrl": "./doxa-research-map/doxa-research-map.js", "embed": { "iframe": "", - "script": "\n\n\n\n" + "script": "\n\n\n\n" }, "instances": [ { diff --git a/public/dx-maps/doxa-research-map/doxa-research-map.js b/public/dx-maps/doxa-research-map/doxa-research-map.js index 31940c58..7c654c00 100644 --- a/public/dx-maps/doxa-research-map/doxa-research-map.js +++ b/public/dx-maps/doxa-research-map/doxa-research-map.js @@ -1417,7 +1417,7 @@ .map-scroll-edge { position:absolute;top:0;bottom:0;width:calc(var(--map-btn-size,32px) + 6px);z-index:2;touch-action:pan-y;pointer-events:auto;background:transparent; } .map-scroll-edge--left { left:0; } .map-scroll-edge--right { right:0; } -`,"research-map");const i=Re("profileConfig"),l=Re("mapboxToken"),c=Kp(i),u=ae(()=>{var x;return((x=i==null?void 0:i.value)==null?void 0:x.search)===!1?!1:c==="mapbox"}),b=ae(()=>u.value?null:gh((S==null?void 0:S.value)??S)?"56px":"14px"),m=ae(()=>{var x;return((x=i==null?void 0:i.value)==null?void 0:x.legendTools)!==!1}),L=ck(c),k=Re("dataSource");Re("colorSet");const _=Re("instanceId",null),g=(()=>{var F;const x=(F=i==null?void 0:i.value)==null?void 0:F.locale;return x&&ns.includes(x)?x:null})(),{locale:$,t:d,te:h}=kt();g&&($.value=g);function y(x){const F="tabs."+((x==null?void 0:x.i18nKey)||(x==null?void 0:x.id));return x&&h(F)?d(F):(x==null?void 0:x.label)??""}const p=Re("mapStore"),w=Re("dataStore"),f=Re("uiStore"),R=Uw(f),v={doxaRegions:!0,adoption:!1,share:!0,hamburgerMenu:!1,geocoderPersistAcrossTabs:!1},X=[{id:"prayer",label:"Prayer",colorStrategy:"prayerProgress",legend:"prayer",popup:"pray",feature:null},{id:"adoption",label:"Adoption",colorStrategy:"adoption",legend:"adoption",popup:"adopt",feature:"adoption"},{id:"engagement",label:"Engagement",colorStrategy:"engagement",legend:"engagement",popup:"pray",feature:null,sepAfter:!0},{id:"affinity-blocks",label:"People Groups (Affinity)",colorStrategy:"affinityBlock",legend:"affinity-block",popup:"pray",feature:null},{id:"doxa-regions",label:"Regions",colorStrategy:"doxaRegion",legend:"doxa-regions",popup:"pray",feature:"doxaRegions",i18nKey:"regions"},{id:"language-families",label:"Languages",colorStrategy:"languageFamily",legend:"language-family",popup:"pray",feature:null},{id:"religion",label:"Religions",colorStrategy:"religion",legend:"religion",popup:"pray",feature:null}].filter(x=>!x.feature||v[x.feature]),ee=ae(()=>X),C=ae(()=>!0),H=ke(null),T=ae(()=>ee.value.find(x=>x.id===H.value)??ee.value[0]);R.setLook(R.lookFor((hf=T.value)==null?void 0:hf.colorStrategy)),Me(()=>{var x;return(x=T.value)==null?void 0:x.colorStrategy},x=>R.setLook(R.lookFor(x),V.value));const S=ae(()=>{var x;return((x=T.value)==null?void 0:x.legend)??"default"}),G=ae(()=>{var x;return((x=T.value)==null?void 0:x.popup)??"pray"}),I=ae(()=>{var x,F,K,ie;return((x=T.value)==null?void 0:x.id)==="language-families"?"Search language family, language, dialect/variety":((F=T.value)==null?void 0:F.id)==="affinity-blocks"?"Search affinity bloc, cluster, people group":((K=T.value)==null?void 0:K.id)==="doxa-regions"?"Search region, country, people group":((ie=T.value)==null?void 0:ie.id)==="religion"?"Search religion, people group":""}),j={"affinity-blocks":"people-groups",prayer:"people-groups",adoption:"people-groups",engagement:"people-groups","language-families":"language","doxa-regions":"regions",religion:"religion"},q=ae(()=>{var x;return j[(x=T.value)==null?void 0:x.id]||""}),te=(_==null?void 0:_.value)||_||"research-map-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,8);Pt("mapId",te);const z=ke(null),be=ke(null),$e=ke(null),Ae=new Map;Me(()=>H==null?void 0:H.value,async(x,F)=>{var ye,we,Te;if(F!==void 0&&x!==F){F&&Ae.set(F,f.legendState);const Be=Ae.get(x)||(f.isMobile?"collapsed":"open");Be==="fullyOpen"?(ye=f.fullyOpenLegend)==null||ye.call(f):Be==="open"?(we=f.openLegend)==null||we.call(f):(Te=f.collapseLegend)==null||Te.call(f)}await Ot();const K=be.value,ie=K==null?void 0:K.querySelector(".rm-tab.active");if(K&&ie&&K.scrollWidth>K.clientWidth+1){const Be=K.getBoundingClientRect(),qe=ie.getBoundingClientRect(),Je=K.scrollLeft+(qe.left-Be.left)-(Be.width-qe.width)/2,vt=K.scrollWidth-K.clientWidth,Ue=Math.max(0,Math.min(vt,Je));typeof K.scrollTo=="function"?K.scrollTo({left:Ue,behavior:"smooth"}):K.scrollLeft=Ue}});const ge=ke(null),ue=ke(!1),B=ke(null),{map:V,initializeMap:se,destroy:_e}=Ak({containerRef:ge,accessToken:l.value,provider:c,style:((ff=i==null?void 0:i.value)==null?void 0:ff.style)??R.bootStyle(),config:R.bootConfig,center:((mf=i==null?void 0:i.value)==null?void 0:mf.center)??ko.center??[20,10],zoom:((bf=i==null?void 0:i.value)==null?void 0:bf.zoom)??ko.zoom??1.8,pitch:((_f=i==null?void 0:i.value)==null?void 0:_f.pitch)??ko.pitch??0,bearing:(($f=i==null?void 0:i.value)==null?void 0:$f.bearing)??ko.bearing??0,minZoom:((yf=i==null?void 0:i.value)==null?void 0:yf.minZoom)??ko.minZoom??.5,maxZoom:FC}),E=new ah({sourcesConfig:Mn,locale:g,profileConfig:i}),N=Px({mapId:te,dataSourceId:k.value,dataSourceManager:E,dataStore:w,markRaw:x=>x});async function M(x){const F=String(x||"").trim().toUpperCase();if(F.length!==3)return;await fs();const K=V.value;if(!K||!K.getLayer("regions-fill"))return;K.setLayoutProperty("regions-fill","visibility","visible"),K.setLayoutProperty("regions-border","visibility","visible");const ie=["literal",[F]];K.setPaintProperty("regions-fill","fill-opacity",["case",["in",["get","iso_3166_1_alpha_3"],ie],.3,.02]),K.setPaintProperty("regions-border","line-color",["case",["in",["get","iso_3166_1_alpha_3"],ie],"#111827","rgba(60,60,80,0.15)"]),K.setPaintProperty("regions-border","line-width",["case",["in",["get","iso_3166_1_alpha_3"],ie],2.5,.3]),K.getLayer("language-family-pins")&&K.moveLayer("language-family-pins")}function J(){var F;pe.clearCountry();const x=V.value;!x||!x.getLayer("regions-fill")||(x.setPaintProperty("regions-fill","fill-opacity",.2),x.setPaintProperty("regions-fill","fill-outline-color",null),x.setPaintProperty("regions-border","line-color","rgba(60,60,80,0.35)"),x.setPaintProperty("regions-border","line-width",.6),((F=T.value)==null?void 0:F.id)!=="doxa-regions"&&(x.setLayoutProperty("regions-fill","visibility","none"),x.setLayoutProperty("regions-border","visibility","none")))}const oe=cx({getMap:()=>V.value,mapId:te,getLanguageFamilyColor:x=>{var K,ie;const F=zo((K=T.value)==null?void 0:K.colorStrategy);return((ie=F==null?void 0:F.colors)==null?void 0:ie[x])??(F==null?void 0:F.fallback)??"#7c8cf8"},getNormalizedPeopleGroups:()=>N.normalizedPeopleGroups.value||[]});Hg({getMap:()=>V.value,mapId:te,getLanguageFamilyColor:()=>"#7c8cf8",getNormalizedPeopleGroups:()=>N.normalizedPeopleGroups.value||[]});const D=px({getMap:()=>V.value,mapId:te,mapStore:p,defaultCenter:((vf=i==null?void 0:i.value)==null?void 0:vf.center)??[20,10],defaultZoom:((wf=i==null?void 0:i.value)==null?void 0:wf.zoom)??1.8}),le=hx({getMap:()=>V.value,getActivePinColor:x=>{var K,ie;const F=zo(((K=T.value)==null?void 0:K.colorStrategy)??"languageFamily");return((ie=F==null?void 0:F.getColor)==null?void 0:ie.call(F,x))??"#1a1a1a"}});let ne=null,P=null;function A(){return ne?Promise.resolve(ne):(P||(P=Nt(()=>Promise.resolve().then(()=>lT),void 0).then(x=>(ne=x.useMapClustering({getMap:()=>V.value,mapId:te,mapStore:p,getPeopleGroups:()=>N.normalizedPeopleGroups.value||[],getClusterColor:()=>{var F,K;return((K=zo((F=T.value)==null?void 0:F.colorStrategy))==null?void 0:K.fallback)??"#7c8cf8"}}),ne))),P)}const W={setData(x){var F;(F=ne==null?void 0:ne.setData)==null||F.call(ne,x)},applyFilters(x){var F;(F=ne==null?void 0:ne.applyFilters)==null||F.call(ne,x)},refreshColors(){var x;(x=ne==null?void 0:ne.refreshColors)==null||x.call(ne)},cleanup(){var x;(x=ne==null?void 0:ne.cleanup)==null||x.call(ne)},async setEnabled(x){var F,K;(K=(F=await A()).setEnabled)==null||K.call(F,x)},async setMode(x){var F,K;(K=(F=await A()).setMode)==null||K.call(F,x)},_pendingSelectionFilter:null,setSelectionFilter(x){this._pendingSelectionFilter=x||null,ne!=null&&ne.setSelectionFilter&&ne.setSelectionFilter(x)},flushSelectionFilter(){ne!=null&&ne.setSelectionFilter&&ne.setSelectionFilter(this._pendingSelectionFilter)}},Z=ds({});Pt("legendRows",Z.rows),Pt("normalizedPeopleGroups",N.normalizedPeopleGroups);const pe=yx(()=>V.value),re=uL(te);dL(re);const{onPeopleGroupResult:Q,onAggregateResult:de,onClear:Pe,clearGeocoderProgrammatic:Ne}=Lx({map:V,geocoderRef:$e,clustering:W,mapStore:p,uiStore:f,mapLayers:oe,pplrInstance:re,onSemanticTreeSelect:ka,switchTab:ms,activeTabId:H,clearAllHighlights:Ur,clearCountryHighlight:J,mapId:te,legendRouters:{country:JT,region:YT,religion:KT}});re.activeTab.value=1;function Ke(x){return x==="affinity-block"?0:x==="language-family"?1:0}Me(S,x=>{re.activeTab.value=Ke(x)});const lt={get value(){return N.normalizedPeopleGroups.value||[]}},{langTree:et}=Yl(lt),Rt=[{id:"family",label:"Lang Family",info:"A language family is a group of languages descended from a common ancestor (e.g. Indo-European, Afro-Asiatic)."},{id:"language",label:"Language",info:"A language is a system of communication used by a people (e.g. Arabic, Bengali, Hindi)."},{id:"dialect",label:"Dialect/Variety",info:"A dialect/variety is a regional or social form of a language (e.g. Arabic, Sudanese; Pakistan Sign Language)."}],{affinityTree:Kt}=_h(lt),Ee=[{id:"bloc",label:"Affinity Block",info:"Affinity Block (field: rop1) — broadest grouping by cultural/linguistic/geographic kinship. 16 blocks total. Examples: Malay Peoples, South Asian Peoples, Deaf, Arab World."},{id:"cluster",label:"Cluster",info:'Cluster (field: imb_reg_of_people_2, ROP 2) — finer-grained grouping inside a bloc. 194 clusters total. Suffix "(Cluster)" appears on each row to distinguish from PG/PGIC. Example: Borneo-Kalimantan within Malay Peoples.'},{id:"group",label:"People Group",info:'People Group (field: imb_reg_of_people_25, ROP 2.5) — abstract ethnolinguistic identity, country-agnostic. Suffix "(PG)" on each row. 1,736 PGs total; 131 of them have rows in multiple countries (e.g. Deaf in 123 countries). Example: Abai Sungai (PG) is one ROP25 code regardless of where its people live.'},{id:"pgic",label:"PG in Country",info:'PGIC = People Group In Country (field: imb_reg_of_people_3 + country_code) — one row per (people group, country) pair. Suffix "(PGIC)" on each row. 2,106 rows total. Example: "Abai Sungai, Malaysia (PGIC)" is the Abai Sungai PG specifically as it exists in Malaysia.'}],{regionsTree:Qe}=$h(lt),ro=[{id:"region",label:"WAGF Region",info:'WAGF macro-region (e.g. "Asia", "Africa"). Color-coded on the map.'},{id:"block",label:"WAGF Bloc",info:'WAGF bloc — the organizational sub-grouping within each region (e.g. "South East Asia", "West Africa").'},{id:"country",label:"Country",info:"Individual countries, listed by unreached-population size within their bloc."}],Y=ds(zs(()=>S.value),Dr),he=Y.progress;Pt("legendProgress",he);function Le(x){const F=[];for(const K of x){F.push({id:K.key,label:K.label,color:K.color,count:K.count??0,pop:K.population??0,filter:K.filterKey?["==",["get","_flat_filter"],K.filterKey]:null,children:[]});for(const ie of K.children||[])F.push({id:ie.key,label:ie.label,color:ie.color,count:ie.count??0,pop:ie.population??0,filter:ie.filterKey?["==",["get","_flat_filter"],ie.filterKey]:null,children:[]})}return F}const Ce=ae(()=>["prayer","engagement","adoption","religion"].includes(S.value)),ze=ae(()=>Ce.value?Le(Y.items.value):S.value==="affinity-block"?Kt.value:S.value==="doxa-regions"?Qe.value:et.value),_t=ae(()=>Ce.value?null:S.value==="affinity-block"?Ee:S.value==="doxa-regions"?ro:Rt),Ge=ae(()=>Ce.value),It=ae(()=>S.value==="religion"?d("legend.colLabel.religion"):S.value==="prayer"?d("legend.colLabel.prayer"):S.value==="engagement"?d("legend.colLabel.engagement"):S.value==="adoption"?d("legend.colLabel.adoption"):Ce.value?d("legend.colLabel.status"):""),jt=ae(()=>f.legendState!=="collapsed");function go(x){x?f.openLegend():f.collapseLegend()}const Bn=ae(()=>Ce.value?d("legend.titleBar.legend"):S.value==="affinity-block"?d("legend.titleBar.peopleGroups"):S.value==="doxa-regions"?d("legend.titleBar.wagfRegions"):d("legend.titleBar.languages"));function jn(x,F){var K;for(const ie of x){if(F(ie))return ie;if((K=ie.children)!=null&&K.length){const ye=jn(ie.children,F);if(ye)return ye}}return null}Pt("onSemanticTreeSelect",x=>ka(x)),Pt("getActivePinColor",x=>{var K,ie;const F=zo(((K=T.value)==null?void 0:K.colorStrategy)??"languageFamily");return((ie=F==null?void 0:F.getColor)==null?void 0:ie.call(F,x))??"#1a1a1a"});function DT(x,F){if(!x||!F)return null;const K=x.id;if(F==="prayer"){const ie=["to-number",["get","peoplePraying"]];if(K==="noPrayer")return["==",ie,0];if(K==="fullPrayer")return[">=",ie,Do];if(K==="hasPrayer")return["all",[">",ie,0],["<",ie,Do]]}else if(F==="engagement"){if(K==="hasEngagement")return["==",["get","engagementStatus"],!0];if(K==="notEngaged")return["==",["get","engagementStatus"],!1]}else if(F==="adoption"){if(K==="hasAdoption")return["==",["get","adoptionStatus"],!0];if(K==="notAdopted")return["==",["get","adoptionStatus"],!1]}else if(F==="religion")return["==",["slice",["coalesce",["get","religion"],""],0,1],K];return null}const zT=["case",["has","iso_3166_1_alpha_3"],.7,.7],GT=["case",["has","iso_3166_1_alpha_3"],"rgba(60,60,80,0.35)","rgba(60,60,80,0.35)"],BT=["case",["has","iso_3166_1_alpha_3"],.6,.6];function jT(x){if(!x||!x.getLayer("regions-fill"))return;const F=ye=>["case",["has","iso_3166_1_alpha_3"],ye,ye],K=ye=>Array.isArray(ye)&&(ye[0]==="get"||ye[0]==="has"||ye[0]==="feature-state"||ye.some(K)),ie=(ye,we)=>{if(!x.getLayer(ye))return;const Te=x.getPaintProperty(ye,we);Te!=null&&(K(Te)||x.setPaintProperty(ye,we,F(Te)))};try{ie("regions-fill","fill-opacity"),ie("regions-border","line-color"),ie("regions-border","line-width")}catch{}}function dc(x,F){if(!x||!x.getLayer("regions-fill"))return;const K=Array.isArray(F)?[...new Set(F.filter(Boolean).map(qe=>String(qe).toUpperCase()))].sort():[],ie=["literal",K],ye=K.length?["case",["in",["get","iso_3166_1_alpha_3"],ie],.85,.15]:zT,we=K.length?["case",["in",["get","iso_3166_1_alpha_3"],ie],"#111827","rgba(60,60,80,0.15)"]:GT,Te=K.length?["case",["in",["get","iso_3166_1_alpha_3"],ie],2.5,.3]:BT,Be=(qe,Je,vt)=>{x.getLayer(qe)&&JSON.stringify(x.getPaintProperty(qe,Je))!==JSON.stringify(vt)&&x.setPaintProperty(qe,Je,vt)};try{Be("regions-fill","fill-opacity",ye),Be("regions-border","line-color",we),Be("regions-border","line-width",Te)}catch{}}function ka(x){var ie,ye,we,Te,Be,qe,Je,vt;const F=V.value;if(x){const Ue=Ce.value?DT(x,S.value):null,We=((ie=T.value)==null?void 0:ie.id)==="doxa-regions",st=Ue?{matchExpr:Ue}:{};We&&(st.regionPolygonSource="regions"),(ye=D.zoomToLegendRow)==null||ye.call(D,x,Object.keys(st).length?st:void 0)}if(!x){if(Ce.value){const Ue=S.value;Ue==="prayer"?f.setPrayerFilter(null):Ue==="engagement"?f.setEngagementFilter(null):Ue==="adoption"?f.setAdoptionFilter(null):Ue==="religion"&&f.setReligionFilter(null)}if(F&&F.getLayer("language-family-pins")){try{F.setFilter("language-family-pins",null)}catch{}t(F,null),sn(F,null),oe.syncGlowFilter(null)}F&&F.getLayer("regions-fill")&&(F.setPaintProperty("regions-fill","fill-opacity",.7),F.setPaintProperty("regions-border","line-color","rgba(60,60,80,0.35)"),F.setPaintProperty("regions-border","line-width",.6)),p.selectedFamily&&p.selectFamily(null),p.selectedLanguage&&p.selectLanguage(null),p.selectedDialect&&((we=p.selectDialect)==null||we.call(p,null)),p.selectedRegion&&((Te=p.selectRegion)==null||Te.call(p,null)),Ne();return}if(Ce.value){const Ue=S.value;Ue==="prayer"?f.setPrayerFilter(x.id):Ue==="engagement"?f.setEngagementFilter(x.id):Ue==="adoption"?f.setAdoptionFilter(x.id):Ue==="religion"&&f.setReligionFilter(x.id);return}if(F&&F.getLayer("language-family-pins")&&x.filter){try{F.setFilter("language-family-pins",x.filter)}catch{}t(F,x.filter),sn(F,null),oe.syncGlowFilter(x.filter)}const K=String(x.id||"");if(K.startsWith("fam:"))(Be=p.selectFamily)==null||Be.call(p,x.label);else if(K.startsWith("lang:"))(qe=p.selectLanguage)==null||qe.call(p,x.label);else if(K.startsWith("dial:"))(Je=p.selectDialect)==null||Je.call(p,{key:K.slice(5),originalLabels:x.originalLabels||[]});else if(K.startsWith("bloc:")||K.startsWith("cluster:")||K.startsWith("pg:")||K.startsWith("pgic:")){if(F&&F.getLayer("language-family-pins")&&x.filter){try{F.setFilter("language-family-pins",null)}catch{}t(F,x.filter),sn(F,x.filter),oe.syncGlowFilter(x.filter)}}else if(K.startsWith("region:")||K.startsWith("block:")||K.startsWith("country:")){if(F&&F.getLayer("language-family-pins")&&x.filter){try{F.setFilter("language-family-pins",x.filter)}catch{}t(F,x.filter),sn(F,null)}K.startsWith("region:")&&((vt=p.selectRegion)==null||vt.call(p,K.slice(7))),K.startsWith("region:")||dc(F,x.isoCodes||[])}}Me(()=>f.theme,x=>{re.theme.value=x==="dark"?"dark":"light"},{immediate:!0});function xn(x,F){var ie,ye;if(!F){const we=re.selection.value;we&&((ie=we.id)!=null&&ie.startsWith(x+":"))&&(re.selection.value=null);return}const K=re.selection.value;K&&((ye=K.id)!=null&&ye.startsWith(x+":"))&&K.label===F.label||(re.selection.value=F)}Me(()=>p.selectedFamily,x=>{if(!x)return xn("fam",null);const F=jn(et.value,K=>K.id.startsWith("fam:")&&K.label===x);F&&xn("fam",{...F,depth:0})}),Me(()=>p.selectedLanguage,x=>{if(!x)return xn("lang",null);const F=jn(et.value,K=>K.id.startsWith("lang:")&&K.label===x);F&&xn("lang",{...F,depth:1})}),Me(()=>p.selectedDialect,x=>{if(!(x!=null&&x.key))return xn("dial",null);const F=`dial:${x.key}`,K=jn(et.value,ie=>ie.id===F);K&&xn("dial",{...K,depth:2})}),Me(()=>p.selectedRegion,x=>{if(!x)return xn("region",null);const F=jn(Qe.value,K=>K.id===`region:${x}`);F&&xn("region",{...F,depth:0})});const xa=ke(!1);async function pc(){var x;if(!xa.value){xa.value=!0;try{const[{useMapPoster:F},{defaultPosterSpec:K},{printImageBlob:ie}]=await Promise.all([Nt(()=>Promise.resolve().then(()=>zh),void 0),Nt(()=>Promise.resolve().then(()=>Eh),void 0),Nt(()=>Promise.resolve().then(()=>kT),void 0)]),ye=F(()=>V.value),we=K({widthIn:8.5,heightIn:11,dpi:200,orientation:"portrait"}),Te=y(T.value)||Bn.value||"Doxa Map";we.dir=["ar","fa","he","ur"].includes(String($.value||"").split("-")[0])?"rtl":"ltr",we.slots.title={...we.slots.title,text:Te};const Be=(Y.items.value||[]).flatMap(We=>[We,...We.children||[]]),qe=(Be.length?Be:((x=Z==null?void 0:Z.rows)==null?void 0:x.value)||[]).map(We=>({label:We.label,color:We.color}));we.slots.legend={...we.slots.legend,rows:qe,title:Bn.value},we.slots.scaleBar=!1,we.slots.north=!1;const Je=uk(V.value)==="maplibre";we.slots.footer={...we.slots.footer,left:"pray.doxa.life",right:new Date().toISOString().slice(0,10),attribution:Je?"© OpenFreeMap © OpenMapTiles © OpenStreetMap":"© Mapbox © OpenStreetMap"};const vt=await ye.render(we,"png");ie(vt,{widthIn:we.widthIn??8.5,heightIn:we.heightIn??11,title:Te,alt:Te})||console.error("[research-map] poster print: the host blocked the print frame")}catch(F){console.error("[research-map] poster export failed:",F)}finally{xa.value=!1}}}const UT=ae(()=>String(d("controls.export_poster")||"Export poster…"));function HT(x){if(x==="poster")return pc();if(x==="packet")return qT()}let gc=!1;async function qT(){var x,F,K,ie,ye;if(!gc){gc=!0;try{const[{usePosterPrints:we},{defaultPosterSpec:Te},{useMapPoster:Be},{selectedPinIds:qe}]=await Promise.all([Nt(()=>Promise.resolve().then(()=>ST),void 0),Nt(()=>Promise.resolve().then(()=>Eh),void 0),Nt(()=>Promise.resolve().then(()=>zh),void 0),Nt(()=>Promise.resolve().then(()=>dx),void 0)]),Je=N.normalizedPeopleGroups.value||[],vt=[((F=(x=V.value)==null?void 0:x.getFilter)==null?void 0:F.call(x,"language-family-pins"))||null,jr].filter(Boolean);let Ue=Je;if(vt.length){const ct=qe(V.value,{expressions:vt}),rn=Je.filter(Vr=>ct.has(String(Vr.uniqueId??Vr.id??"")));rn.length?Ue=rn:console.warn(`[research-map] packet: ${ct.size} pin(s) selected but no rows matched; printing the full list`)}const We=Ue.length;Ue.length>50&&(console.warn(`[research-map] packet truncated ${Ue.length} → 50 people groups`),Ue=Ue.slice(0,50));const st=Ue.map(ct=>({slug:String(ct.slug||ct.uniqueId||ct.id||""),name:ct.name,population:ct.population,religion:ct.religionName||ct.religionLabel||ct.religion||"",country_code:ct.countryName||ct.countryIsoLabel||ct.country||ct.countryIso||"",image_url:ct.imageUrl||ct.image_url||""})),Ze=Te({widthIn:8.27,heightIn:11.69,dpi:150,orientation:"portrait"});Ze.slots.title={...Ze.slots.title,text:Bn.value||"Doxa Map"},Ze.slots.legend={...Ze.slots.legend,rows:((K=Z==null?void 0:Z.rows)==null?void 0:K.value)||[]};let At="";try{const ct=await Be(()=>V.value).render(Ze,"png");At=``}catch(ct){console.warn("[research-map] packet map page skipped:",(ct==null?void 0:ct.message)||ct)}const ho=Bn.value||y(T.value)||"Doxa Map",Hn={id:String(((ie=T.value)==null?void 0:ie.id)||"research-map"),label:We>Ue.length?`${ho} — ${Ue.length} of ${We}`:ho,zoneKey:String(((ye=T.value)==null?void 0:ye.id)||"research-map")};await we({records:()=>st,lang:()=>String($.value||"en").split("-")[0],label:()=>Hn.label}).printPacket(Hn,{mapSvg:At})}catch(we){console.error("[research-map] packet export failed:",we)}finally{gc=!1}}}const nf=ke(!1),af=ae(()=>p.selectedFeature),to=ae(()=>f.isDarkTheme),hc=ae(()=>Up.lightPreset==="night");function fc(){var K;const x=V.value;if(!x||!x.getLayer("language-family-pins"))return;const F=hc.value?"#ffffff":["case",[">",["to-number",["get","peoplePraying"],0],0],"#ffffff","#1f2937"];x.setPaintProperty("language-family-pins","circle-stroke-color",F),x.setPaintProperty("language-family-pins","circle-stroke-width",hc.value?rx((K=T.value)==null?void 0:K.colorStrategy):qg)}Me(hc,fc,{immediate:!1}),Me(()=>{var x;return(x=T.value)==null?void 0:x.id},fc),Me(()=>f.theme,()=>R.applyTheme(V.value));function WT(){R.swapTheme(V.value)}const sf=ke(!1);let hs=null;async function fs(){if(!sf.value)return hs||(hs=(async()=>{var x,F,K;try{const ie=await((x=N.loadRegionsData)==null?void 0:x.call(N));ie&&V.value&&((F=oe.addRegionsLayer)==null||F.call(oe,ie,"doxa-regions"),jT(V.value),V.value.getLayer("regions-fill")&&((K=T.value)==null?void 0:K.id)!=="doxa-regions"&&(V.value.setLayoutProperty("regions-fill","visibility","none"),V.value.setLayoutProperty("regions-border","visibility","none")),V.value.getLayer("language-family-pins")&&V.value.moveLayer("language-family-pins")),sf.value=!0,N.regionsData.value=null}catch(ie){console.warn("[research-map] regions layer failed:",ie)}finally{hs=null}})(),hs)}function ms(x){var ie,ye,we;if(x===H.value)return;H.value=x,(ie=f.setActiveTab)==null||ie.call(f,x),Ne();const F=ee.value.find(Te=>Te.id===x);if(!F||!V.value)return;R.setLook(R.lookFor(F.colorStrategy),V.value),F.id==="doxa-regions"&&fs();const K=zo(F.colorStrategy);if(V.value.getLayer("language-family-pins")&&(K!=null&&K.buildColorExpression)){const Te=F.id==="doxa-regions"?"#a30000":K.buildColorExpression();V.value.setPaintProperty("language-family-pins","circle-color",Te),Ur(V.value),F.id==="prayer"?oe.startPrayerGlow():oe.stopPrayerGlow();const Be=F.id==="doxa-regions";V.value.getLayer("regions-fill")&&(V.value.setLayoutProperty("regions-fill","visibility",Be?"visible":"none"),V.value.setLayoutProperty("regions-border","visibility",Be?"visible":"none")),V.value.getLayer("language-family-pins")&&V.value.moveLayer("language-family-pins")}(ye=Z.refresh)==null||ye.call(Z),(we=W.refreshColors)==null||we.call(W)}function rf(x){var K,ie;const F=x==null?void 0:x.detail;!F||F.mapId!==te||(F.center&&Array.isArray(F.center)?(K=D.flyToCoords)==null||K.call(D,{longitude:F.center[0],latitude:F.center[1]},F.zoom??4):F.bounds&&((ie=D.fitBounds)==null||ie.call(D,F.bounds,60)))}function lf(x){var qe,Je,vt;const F=x==null?void 0:x.detail;if(!F||(Ut(F),!((qe=F.coords)!=null&&qe.length)))return;const K=F.coords;if(K.length===1){(Je=D.flyToCoords)==null||Je.call(D,{longitude:K[0][0],latitude:K[0][1]},3);return}let ie=1/0,ye=-1/0,we=1/0,Te=-1/0;for(const[Ue,We]of K)Ueye&&(ye=Ue),WeTe&&(Te=We);const Be=F.kind==="region"?2.2:3;(vt=D.fitBounds)==null||vt.call(D,[[ie,we],[ye,Te]],60,{maxZoom:Be})}let jr=null;function VT(){const x=(p==null?void 0:p.showClusters)&&((p==null?void 0:p.clusteringMode)||"off")!=="off",F=Number(p==null?void 0:p.clusterPinOpacity);return x&&Number.isFinite(F)?Math.min(1,Math.max(0,F)):1}function sn(x,F){var ye;if(F!==void 0&&(jr=F||null),!x||!((ye=x.getLayer)!=null&&ye.call(x,"language-family-pins")))return;const K=VT(),ie=jr?["case",jr,K,0]:["case",["has","uniqueId"],K,K];try{if(JSON.stringify(x.getPaintProperty("language-family-pins","circle-opacity"))===JSON.stringify(ie))return;x.setPaintProperty("language-family-pins","circle-opacity",ie),x.setPaintProperty("language-family-pins","circle-stroke-opacity",ie),x.getLayer("language-family-pins-shadow")&&x.setPaintProperty("language-family-pins-shadow","circle-opacity",ie)}catch{}}Me(()=>[p==null?void 0:p.clusterPinOpacity,p==null?void 0:p.clusteringMode,p==null?void 0:p.showClusters],()=>sn(V.value));const io={family:null,language:null,dialect:null,region:null,prayer:null,engagement:null,adoption:null};function Ur(x){sn(x,null),x.setFilter("language-family-pins",null),t(x,null),oe.syncGlowFilter(null),dc(x,[]),x.getLayer("regions-fill")&&x.setPaintProperty("regions-fill","fill-outline-color",null),io.family=io.language=io.dialect=io.region=null,io.prayer=io.engagement=io.adoption=null,f.prayerFilter&&f.setPrayerFilter(null),f.engagementFilter&&f.setEngagementFilter(null),f.adoptionFilter&&f.setAdoptionFilter(null),f.religionFilter&&f.setReligionFilter(null),W.setSelectionFilter(null),p.selectedFamily&&p.selectFamily(null),p.selectedLanguage&&p.selectLanguage(null),p.selectedDialect&&p.selectDialect(null);try{re&&re.selection&&re.selection.value&&(re.selection.value=null)}catch{}}let Hr=null,qr=0;function Ut(x){var Be,qe,Je,vt,Ue;const F=V.value;if(!F||!F.getLayer("language-family-pins"))return;let K,ie,ye;if(x.kind==="family")ye="family",K="languageFamily",ie=x.familyKey;else if(x.kind==="language")ye="language",K="language",ie=x.languageKey;else if(x.kind==="region")ye="region",K="doxaRegion",ie=x.regionKey;else if(x.kind==="prayer")ye="prayer",K=x.property||"peoplePraying",ie=x.expectedValue;else if(x.kind==="engagement")ye="engagement",K=x.property||"engagementStatus",ie=x.expectedValue;else if(x.kind==="adoption")ye="adoption",K=x.property||"adoptionStatus",ie=x.expectedValue;else if(x.kind==="religion")ye="religion",K=x.property||"religion",ie=x.expectedValue;else if(x.kind==="dialect")ye="dialect",K="language",ie=x.dialectKey||"";else{Ur(F),Ne();for(const We of Object.keys(io))io[We]=null;Hr=null,qr=0;return}const we=Date.now(),Te=`${ye}|${ie}`;if(!(Hr===Te&&we-qr<80)){if(Hr=Te,qr=we,io[ye]===ie){Ur(F),Ne(),Hr=null,qr=0;return}for(const We of Object.keys(io))io[We]=null;if(io[ye]=ie,ye==="family"?(Be=p.selectFamily)==null||Be.call(p,ie):ye==="region"?(qe=p.selectRegion)==null||qe.call(p,ie):ye==="language"?(Je=p.selectLanguage)==null||Je.call(p,ie):ye==="dialect"&&((vt=p.selectDialect)==null||vt.call(p,{key:ie,originalLabels:x.originalLabels||[]})),W.setSelectionFilter({property:K,value:ie}),ye==="region"){if(F.setFilter("language-family-pins",["==",["get","doxaRegion"],ie]),t(F,["==",["get","doxaRegion"],ie]),sn(F,null),F.getLayer("regions-fill")){const We=((Ue=oe.regionIsoMap)==null?void 0:Ue.value)||{},st=ho=>String(ho).toLowerCase().replace(/[^a-z]/g,""),Ze=st(ie);let At=We[ie]||[];if(!At.length){for(const[ho,Hn]of Object.entries(We))if(st(ho)===Ze){At=Hn;break}}dc(F,At)}}else{F.setFilter("language-family-pins",null);let We;if(ye==="prayer"){const st=["to-number",["get",K]];ie==="noPrayer"?We=["==",st,0]:ie==="fullPrayer"?We=[">=",st,Do]:ie==="hasPrayer"?We=["all",[">",st,0],["<",st,Do]]:We=["==",["get",K],ie]}else if(ye==="engagement")We=["==",["get",K],ie==="hasEngagement"];else if(ye==="adoption")We=["==",["get",K],ie==="hasAdoption"];else if(ye==="religion")We=["==",["slice",["coalesce",["get",K],""],0,1],ie];else if(x.filterExpr)We=x.filterExpr;else if(ye==="language")We=["any",["==",["get",K],ie],["==",["slice",["get",K],0,ie.length+1],ie+","],["in"," "+ie,["get",K]]];else if(ye==="dialect"){const st=x.originalLabels||[];st.length===1?We=["==",["get",K],st[0]]:st.length>1?We=["in",["get",K],["literal",st]]:We=["==",["get",K],ie]}else We=["==",["get",K],ie];sn(F,We),t(F,We),oe.syncGlowFilter(We),F.getLayer("regions-fill")&&(F.setPaintProperty("regions-fill","fill-opacity",.2),F.setPaintProperty("regions-border","line-color","rgba(60,60,80,0.35)"),F.setPaintProperty("regions-border","line-width",.6))}}}function KT(x,{map:F,filterLayerId:K}){const ie=x.label;try{F.setFilter(K,null)}catch{}const ye=Object.keys(wo).find(we=>wo[we]===ie);if(ye){const we={id:ye,label:ie,depth:0},Te=()=>{try{F.setFilter(K,null)}catch{}ka(we),re&&re.selection&&(re.selection.value=we)};H.value!=="religion"&&ms("religion"),Ot(Te)}}function YT(x,{map:F,filterLayerId:K}){const ie=x.label,ye=qe=>String(qe).toLowerCase().replace(/[^a-z0-9]/g,""),we=qe=>String(qe||"").replace(/\s*\((?:Region|Bloc)\)\s*$/i,""),Te=ye(ie),Be=()=>{try{F.setFilter(K,null)}catch{}const qe=jn(Qe.value,Je=>(Je.id.startsWith("region:")||Je.id.startsWith("block:"))&&ye(we(Je.label))===Te);qe&&(ka(qe),re&&re.selection&&(re.selection.value=qe))};H.value!=="doxa-regions"?(ms("doxa-regions"),Promise.resolve(fs()).finally(()=>Ot(Be))):Be()}function JT(x){var K,ie,ye,we;if(Array.isArray(x.bounds)&&x.bounds.length===4){const[Te,Be,qe,Je]=x.bounds;(K=D.fitBounds)==null||K.call(D,[[Te,Be],[qe,Je]],60)}else Array.isArray(x.center)&&x.center.length===2&&((ie=D.flyTo)==null||ie.call(D,x.center));const F=bx(x,N.normalizedPeopleGroups.value||[]);if(F&&M(F),F&&((ye=T.value)==null?void 0:ye.id)!=="doxa-regions"&&pe.showCountry(F),F&&((we=T.value)==null?void 0:we.id)==="doxa-regions"){const Te=()=>{const Be=jn(Qe.value,qe=>qe.id.startsWith("country:")&&(qe.isoCodes||[]).includes(F));Be&&(ka(Be),re&&re.selection&&(re.selection.value=Be))};Promise.resolve(fs()).finally(()=>Ot(Te))}}Me(()=>p.filters,()=>{var x,F;(x=oe.applyFilters)==null||x.call(oe,p.filters),(F=W.applyFilters)==null||F.call(W,p.filters)},{deep:!0});let Wr=!1,cf="";Me(()=>{var x;return(x=i==null?void 0:i.value)==null?void 0:x.externalFilters},x=>{var F,K;if(!(!x||typeof x!="object"||!p)){Wr=!0;try{if("region"in x){const ie=x.region||null;(ie||p.selectedRegion)&&((F=p.selectRegion)==null||F.call(p,ie))}if("religion"in x){const ie=String(x.religion||"").trim(),ye=ie?Object.keys(wo).find(we=>String(wo[we]).toLowerCase()===ie.toLowerCase()):"";ie?ye&&(H.value!=="religion"&&ms("religion"),Ot(()=>f.setReligionFilter(ye))):f.religionFilter&&f.setReligionFilter(null)}if("fitSlugs"in x&&eE(x.fitSlugs),"language"in x){const ie=x.language||null;(ie||p.selectedLanguage)&&((K=p.selectLanguage)==null||K.call(p,ie))}}finally{Ot(()=>{Wr=!1})}}},{deep:!0,immediate:!0}),typeof window<"u"&&(window.__researchMapFilterState=()=>{var x,F;return{selectedRegion:(p==null?void 0:p.selectedRegion)||"",externalRegion:((F=(x=i==null?void 0:i.value)==null?void 0:x.externalFilters)==null?void 0:F.region)||"",religionFamily:wo[f==null?void 0:f.religionFilter]||"",selectedLanguage:(p==null?void 0:p.selectedLanguage)||""}},window.__researchMapPinOpacity=()=>{var x,F;try{return((F=(x=V.value)==null?void 0:x.getPaintProperty)==null?void 0:F.call(x,"language-family-pins","circle-opacity"))??null}catch{return null}},window.__researchMapClusterDraw=()=>{var K,ie;const x=V.value,F={};try{for(const ye of((ie=(K=x==null?void 0:x.getStyle)==null?void 0:K.call(x))==null?void 0:ie.layers)||[]){if(!/^(mapbox-clusters|cluster-lines)/.test(ye.id))continue;let we=0;try{we=x.queryRenderedFeatures({layers:[ye.id]}).length}catch{we=-1}F[ye.id]={visibility:ye.layout&&ye.layout.visibility||"visible",rendered:we}}}catch{}return F},window.__researchMapVocabulary=x=>{var ie;const F=((ie=N==null?void 0:N.normalizedPeopleGroups)==null?void 0:ie.value)||[],K=new Set;for(const ye of F){if(x==="religionFamily"){const Te=wo[String((ye==null?void 0:ye.religion)||"").charAt(0)];Te&&K.add(Te);continue}const we=ye&&ye[x];typeof we=="string"&&we&&K.add(we)}return[...K].sort()});const mc=_o();function ZT(){var x,F,K,ie;try{return((ie=(K=(F=(x=mc==null?void 0:mc.proxy)==null?void 0:x.$el)==null?void 0:F.getRootNode)==null?void 0:K.call(F))==null?void 0:ie.host)||null}catch{return null}}function uf(){var st;if(Wr||typeof window>"u")return;const x=ZT();if(!x)return;const F=wo[f==null?void 0:f.religionFilter]||"",K=(p==null?void 0:p.selectedLanguage)||"",ie=(p==null?void 0:p.selectedDialect)||null,ye=Array.isArray(ie==null?void 0:ie.originalLabels)?ie.originalLabels.map(Ze=>String(Ze).trim()).filter(Boolean):[],we=((st=N==null?void 0:N.normalizedPeopleGroups)==null?void 0:st.value)||[],Te=Ze=>{const At=Ze&&(Ze.language??Ze.primary_language);return String((At&&typeof At=="object"?At.label:At)||"").trim()},Be=(Ze,At)=>Ze===At||Ze.startsWith(At+",")||Ze.includes(" "+At),qe=ye.length?we.filter(Ze=>ye.includes(Te(Ze))):K?we.filter(Ze=>Be(Te(Ze),K.trim())):[],Je=[...new Set(qe.map(Ze=>{var At,ho;return String(((ho=(At=Ze==null?void 0:Ze._raw)==null?void 0:At.primary_language)==null?void 0:ho.value)||(Ze!=null&&Ze.language&&typeof Ze.language=="object"?Ze.language.value:"")||"").trim()}).filter(Boolean))],vt=Je.length===1?Je[0]:"",Ue={region:(p==null?void 0:p.selectedRegion)||"",religion:F,language:ye.length?ye.join(" · "):K,languageCode:vt,languageCodes:Je},We=!Ue.region&&!Ue.religion&&!Ue.language&&!Ue.languageCode;if(We&&df){const Ze=typeof performance<"u"?performance.now():Date.now();if(_s||(_s=Ze),Ze-_sclearTimeout(bs)),Me(()=>{var x;return[p==null?void 0:p.selectedRegion,p==null?void 0:p.selectedLanguage,(x=p==null?void 0:p.selectedDialect)==null?void 0:x.key,f==null?void 0:f.religionFilter]},()=>XT()),Me(()=>p.selectedRegion,x=>{Ut(x?{kind:"region",regionKey:x}:{kind:null})}),Me(()=>p.selectedFamily,x=>{x?Ut({kind:"family",familyKey:x}):!p.selectedLanguage&&!p.selectedDialect&&Ut({kind:null})}),Me(()=>p.selectedLanguage,x=>{x?Ut({kind:"language",languageKey:x}):!p.selectedFamily&&!p.selectedDialect&&Ut({kind:null})}),Me(()=>p.selectedDialect,x=>{x!=null&&x.key?Ut({kind:"dialect",dialectKey:x.key,originalLabels:x.originalLabels||[]}):!p.selectedFamily&&!p.selectedLanguage&&Ut({kind:null})}),Me(()=>f.prayerFilter,x=>{Ut(x?{kind:"prayer",property:"peoplePraying",expectedValue:x}:{kind:null})}),Me(()=>f.engagementFilter,x=>{Ut(x?{kind:"engagement",property:"engagementStatus",expectedValue:x}:{kind:null})}),Me(()=>f.adoptionFilter,x=>{Ut(x?{kind:"adoption",property:"adoptionStatus",expectedValue:x}:{kind:null})}),Me(()=>f.religionFilter,x=>{Ut(x?{kind:"religion",property:"religion",expectedValue:x}:{kind:null})});function QT(){try{return typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}function eE(x){var At,ho,Hn;const F=Array.isArray(x)?x.filter(xo=>typeof xo=="string"&&xo):[],K=F.length?`${F.length}:${F[0]}:${F[F.length-1]}`:"";if(K===cf||(cf=K,!F.length))return;const ie=new Set(F),ye=((At=N==null?void 0:N.normalizedPeopleGroups)==null?void 0:At.value)||[];let we=1/0,Te=1/0,Be=-1/0,qe=-1/0,Je=0;for(const xo of ye){if(!xo||!ie.has(xo.slug))continue;const ct=Number(xo.longitude??xo.lng),rn=Number(xo.latitude??xo.lat);!Number.isFinite(ct)||!Number.isFinite(rn)||(ctBe&&(Be=ct),rn>qe&&(qe=rn),Je++)}if(!Je)return;const vt=Be-we,Ue=qe-Te,We={longitude:(we+Be)/2,latitude:(Te+qe)/2},st=vt>IC?{c:We,z:OC}:Je===1||vtp.showClusters,async x=>{$s||(x&&(!p.clusteringMode||p.clusteringMode==="off")?p.clusteringMode="mst":!x&&p.clusteringMode!=="off"&&(p.clusteringMode="off"),await pf())}),Me(()=>p.clusteringMode,async()=>{$s||await pf()});async function tE(x){var F,K,ie,ye,we,Te,Be;p.registerMap(te,V.value),dk(V.value,"mercator"),R.applyTheme(V.value),x!=null&&x.length&&(oe.addLanguageFamilyLayer(x,((F=T.value)==null?void 0:F.colorStrategy)??"languageFamily"),((K=T.value)==null?void 0:K.id)==="doxa-regions"&&((ie=V.value)!=null&&ie.getLayer("language-family-pins"))&&V.value.setPaintProperty("language-family-pins","circle-color","#4b5563"),sn(V.value),((ye=T.value)==null?void 0:ye.id)==="prayer"&&oe.startPrayerGlow(),(we=W.setData)==null||we.call(W,x),(Te=Z.build)==null||Te.call(Z,x),le.initialize()),((Be=T.value)==null?void 0:Be.id)==="doxa-regions"&&(typeof window<"u"&&window.requestIdleCallback?Je=>window.requestIdleCallback(Je,{timeout:2e3}):Je=>setTimeout(Je,800))(()=>{fs()}),fc(),p.setMapReady(te),ue.value=!0}let ys=null,Un=null,Sa=null;function gf(x){const F=z.value;F&&(getComputedStyle(F).getPropertyValue("--map-radius").trim()||(F.style.setProperty("--map-radius","16px"),F.style.setProperty("--map-radius-sm","8px")),x>=700?(F.style.setProperty("--map-btn-size","40px"),F.style.setProperty("--map-toolbar-gap","8px"),F.style.setProperty("--map-font-md","13px"),F.style.setProperty("--map-font-sm","11px"),F.style.setProperty("--map-legend-width","380px")):x>=500?(F.style.setProperty("--map-btn-size","36px"),F.style.setProperty("--map-toolbar-gap","6px"),F.style.setProperty("--map-font-md","12px"),F.style.setProperty("--map-font-sm","10px"),F.style.setProperty("--map-legend-width","360px")):(F.style.setProperty("--map-btn-size","32px"),F.style.setProperty("--map-toolbar-gap","5px"),F.style.setProperty("--map-font-md","11px"),F.style.setProperty("--map-font-sm","10px"),F.style.setProperty("--map-legend-width","280px")))}return Eo(async()=>{var F,K,ie,ye;(F=f.init)==null||F.call(f),H.value=((K=ee.value[0])==null?void 0:K.id)??"doxa-regions",f.isMobile?(ie=f.collapseLegend)==null||ie.call(f):(ye=f.openLegend)==null||ye.call(f),z.value&&(gf(z.value.getBoundingClientRect().width),typeof ResizeObserver<"u"&&(ys=new ResizeObserver(we=>{for(const Te of we)gf(Te.contentRect.width)}),ys.observe(z.value))),window.addEventListener("doxa:legend-row-click",rf),window.addEventListener("legend:highlight",lf);const x=N.loadData().catch(we=>(console.error("[research-map] data load failed:",we),{normalizedPeopleGroups:[]}));try{await se()}catch(we){console.error("[research-map] Map failed to initialize —",we),B.value=String((we==null?void 0:we.message)||we);return}{const we=V.value?Xe(V.value):null;we&&we!==V.value&&(V.value=null,V.value=Yn(we))}if(!V.value){console.error("[research-map] Map failed to initialize — check token and container"),B.value="Map failed to initialize — check token and container";return}V.value.once("style.load",async()=>{try{const{normalizedPeopleGroups:we}=await x;await tE(we)}catch(we){console.error("[research-map] onMapReady failed:",we),B.value=String((we==null?void 0:we.message)||we)}}),n(V.value),Sa=()=>n(V.value);try{Un=new ResizeObserver(Sa);const we=V.value.getContainer&&V.value.getContainer()||null;we&&Un.observe(we);const Te=we?o(we):null;Te&&Un.observe(Te),document.body&&Un.observe(document.body)}catch{}window.addEventListener("resize",Sa)}),co(()=>{var x,F;window.removeEventListener("doxa:legend-row-click",rf),window.removeEventListener("legend:highlight",lf),ys&&(ys.disconnect(),ys=null),Un&&(Un.disconnect(),Un=null),Sa&&(window.removeEventListener("resize",Sa),Sa=null),oe.stopPrayerGlow(),(x=W.cleanup)==null||x.call(W),(F=le.cleanup)==null||F.call(le),p.unregisterMap(te),_e()}),(x,F)=>(ce(),fe("div",{ref_key:"rmRoot",ref:z,class:Fe(["rm-root",{"rm-dark":to.value,"dsm-dark":to.value}])},[C.value?(ce(),fe("div",{key:0,ref_key:"tabBar",ref:be,class:"rm-tab-bar"},[(ce(!0),fe(Ve,null,qt(ee.value,K=>(ce(),fe(Ve,{key:K.id},[O("button",{class:Fe(["rm-tab",{active:H.value===K.id}]),onClick:ie=>ms(K.id)},ve(y(K)),11,AC),K.sepAfter?(ce(),fe("div",PC)):xe("",!0)],64))),128))],512)):xe("",!0),O("div",LC,[!ue.value&&!B.value?(ce(),fe("div",CC,ve(a("dashboard.map_loading","Research map loading…")),1)):xe("",!0),B.value?(ce(),fe("div",TC,ve(a("allPeopleGroups.loadError","The map could not be loaded."))+" "+ve(B.value),1)):xe("",!0),O("div",{ref_key:"mapContainer",ref:ge,class:"rm-map-canvas"},null,512),F[4]||(F[4]=O("div",{class:"map-scroll-edge map-scroll-edge--left"},null,-1)),F[5]||(F[5]=O("div",{class:"map-scroll-edge map-scroll-edge--right"},null,-1)),me(c)!=="mapbox"?(ce(),fe("div",{key:2,class:"rm-provider-badge","data-provider":me(c)},ve(me(L)),9,EC)):xe("",!0),ue.value&&me(V)&&u.value?(ce(),tt(JA,{key:3,ref_key:"geocoderRef",ref:$e,"map-instance":me(V),"access-token":me(l),provider:me(c),"data-source-id":me(k),"is-dark":to.value,placeholder:I.value,"active-context":q.value,onPeopleGroupResult:me(Q),onAggregateResult:me(de),onClear:me(Pe)},null,8,["map-instance","access-token","provider","data-source-id","is-dark","placeholder","active-context","onPeopleGroupResult","onAggregateResult","onClear"])):xe("",!0),xe("",!0),ue.value&&me(V)?(ce(),tt(kA,{key:5,"has-geocoder":u.value},{default:Qt(()=>[it(SA,{map:me(V),"is-dark":to.value},null,8,["map","is-dark"]),it(AA,{map:me(V),"is-dark":to.value},null,8,["map","is-dark"]),it(PA,{map:me(V),"is-dark":to.value},null,8,["map","is-dark"]),it(TA,{"map-container":ge.value,"is-dark":to.value},null,8,["map-container","is-dark"]),it(RA,{"is-dark":to.value,onToggle:WT},null,8,["is-dark"]),it(Dn,{"is-dark":to.value,active:xa.value,disabled:xa.value,title:UT.value,class:"export-poster-btn","aria-busy":xa.value?"true":"false",onClick:pc},{default:Qt(()=>[...F[3]||(F[3]=[O("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},[O("path",{d:"M12 3v12M7 10l5 5 5-5M5 21h14"})],-1)])]),_:1},8,["is-dark","active","disabled","title","aria-busy"]),v.share?(ce(),tt(_P,{key:0,"is-dark":to.value,"embed-path":"doxa-research-map/research-map/index.html"},null,8,["is-dark"])):xe("",!0)]),_:1},8,["has-geocoder"])):xe("",!0),ue.value&&m.value?(ce(),tt(wA,{key:6,"legend-type":S.value,"is-dark":to.value},null,8,["legend-type","is-dark"])):xe("",!0),ue.value?(ce(),tt(MP,{key:7,"is-open":nf.value,onClose:F[1]||(F[1]=K=>nf.value=!1),onOpenPoster:pc},{default:Qt(()=>[it(cL)]),_:1},8,["is-open"])):xe("",!0),O("div",{class:"rm-legend-desktop-slot",style:ft(b.value?{"--stl-top":b.value}:null)},[ue.value&&me(f).legendMode==="detail"&&me(f).selectedPeopleGroup?(ce(),tt(cA,{key:0,"legend-type":S.value,"popup-action":G.value,"initially-collapsed":!1,"is-dark":to.value},null,8,["legend-type","popup-action","is-dark"])):xe("",!0),Hs(O("div",null,[ue.value?(ce(),tt(bh,{key:0,nodes:ze.value,tabs:_t.value,title:Bn.value,hideTabs:Ge.value,columnLabel:It.value,progress:me(he),open:jt.value,"export-enabled":NC,onSelect:ka,onExport:HT,"onUpdate:open":go},null,8,["nodes","tabs","title","hideTabs","columnLabel","progress","open"])):xe("",!0)],512),[[td,!(me(f).legendMode==="detail"&&me(f).selectedPeopleGroup)]])],4),O("div",RC,[ue.value?(ce(),tt(me(s),{key:0,"legend-type":S.value,"popup-action":G.value,"is-dark":to.value},null,8,["legend-type","popup-action","is-dark"])):xe("",!0)]),ue.value&&af.value?(ce(),tt(me(r),{key:8,feature:af.value,action:G.value,dark:to.value,onClose:F[2]||(F[2]=K=>me(p).selectFeature(null))},null,8,["feature","action","dark"])):xe("",!0)])],2))}}},Symbol.toStringTag,{value:"Module"})),BC="",jC={class:"legend-sheet-root"},UC=["src","alt"],HC={key:0,class:"pull-tab-handle"},qC=["aria-label"],WC=["aria-label"],VC=["aria-label"],KC={class:"collapsed-detail-title"},YC={class:"legend-content"},JC=["aria-label"],ZC=["aria-label"],xh=80,XC=48,QC=44,eT=24,Sh="--legend-sheet-h",Ah=Object.freeze(Object.defineProperty({__proto__:null,default:bn({__name:"LegendMobile",props:{legendType:{type:String,required:!0},nodes:{type:Array,default:null},tabs:{type:Array,default:null},defaultTab:{type:Number,default:0},columnLabel:{type:String,default:null},title:{type:String,default:null},columns:{type:Array,default:null},isDark:{type:Boolean,default:!1},popupAction:{type:String,default:"pray",validator:e=>["pray","adopt","none"].includes(e)},disableCollapse:{type:Boolean,default:!1}},setup(e){const{t}=kt();Et(` +`,"research-map");const i=Re("profileConfig"),l=Re("mapboxToken"),c=Kp(i),u=ae(()=>{var x;return((x=i==null?void 0:i.value)==null?void 0:x.search)===!1?!1:c==="mapbox"}),b=ae(()=>u.value?null:gh((S==null?void 0:S.value)??S)?"56px":"14px"),m=ae(()=>{var x;return((x=i==null?void 0:i.value)==null?void 0:x.legendTools)!==!1}),L=ck(c),k=Re("dataSource");Re("colorSet");const _=Re("instanceId",null),g=(()=>{var F;const x=(F=i==null?void 0:i.value)==null?void 0:F.locale;return x&&ns.includes(x)?x:null})(),{locale:$,t:d,te:h}=kt();g&&($.value=g);function y(x){const F="tabs."+((x==null?void 0:x.i18nKey)||(x==null?void 0:x.id));return x&&h(F)?d(F):(x==null?void 0:x.label)??""}const p=Re("mapStore"),w=Re("dataStore"),f=Re("uiStore"),R=Uw(f),v={doxaRegions:!0,adoption:!1,share:!0,hamburgerMenu:!1,geocoderPersistAcrossTabs:!1},X=[{id:"prayer",label:"Prayer",colorStrategy:"prayerProgress",legend:"prayer",popup:"pray",feature:null},{id:"adoption",label:"Adoption",colorStrategy:"adoption",legend:"adoption",popup:"adopt",feature:"adoption"},{id:"engagement",label:"Engagement",colorStrategy:"engagement",legend:"engagement",popup:"pray",feature:null,sepAfter:!0},{id:"affinity-blocks",label:"People Groups (Affinity)",colorStrategy:"affinityBlock",legend:"affinity-block",popup:"pray",feature:null},{id:"doxa-regions",label:"Regions",colorStrategy:"doxaRegion",legend:"doxa-regions",popup:"pray",feature:"doxaRegions",i18nKey:"regions"},{id:"language-families",label:"Languages",colorStrategy:"languageFamily",legend:"language-family",popup:"pray",feature:null},{id:"religion",label:"Religions",colorStrategy:"religion",legend:"religion",popup:"pray",feature:null}].filter(x=>!x.feature||v[x.feature]),ee=ae(()=>X),C=ae(()=>!0),H=ke(null),T=ae(()=>ee.value.find(x=>x.id===H.value)??ee.value[0]);R.setLook(R.lookFor((hf=T.value)==null?void 0:hf.colorStrategy)),Me(()=>{var x;return(x=T.value)==null?void 0:x.colorStrategy},x=>R.setLook(R.lookFor(x),V.value));const S=ae(()=>{var x;return((x=T.value)==null?void 0:x.legend)??"default"}),G=ae(()=>{var x;return((x=T.value)==null?void 0:x.popup)??"pray"}),I=ae(()=>{var x,F,K,ie;return((x=T.value)==null?void 0:x.id)==="language-families"?"Search language family, language, dialect/variety":((F=T.value)==null?void 0:F.id)==="affinity-blocks"?"Search affinity bloc, cluster, people group":((K=T.value)==null?void 0:K.id)==="doxa-regions"?"Search region, country, people group":((ie=T.value)==null?void 0:ie.id)==="religion"?"Search religion, people group":""}),j={"affinity-blocks":"people-groups",prayer:"people-groups",adoption:"people-groups",engagement:"people-groups","language-families":"language","doxa-regions":"regions",religion:"religion"},q=ae(()=>{var x;return j[(x=T.value)==null?void 0:x.id]||""}),te=(_==null?void 0:_.value)||_||"research-map-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,8);Pt("mapId",te);const z=ke(null),be=ke(null),$e=ke(null),Ae=new Map;Me(()=>H==null?void 0:H.value,async(x,F)=>{var ye,we,Te;if(F!==void 0&&x!==F){F&&Ae.set(F,f.legendState);const Be=Ae.get(x)||(f.isMobile?"collapsed":"open");Be==="fullyOpen"?(ye=f.fullyOpenLegend)==null||ye.call(f):Be==="open"?(we=f.openLegend)==null||we.call(f):(Te=f.collapseLegend)==null||Te.call(f)}await Ot();const K=be.value,ie=K==null?void 0:K.querySelector(".rm-tab.active");if(K&&ie&&K.scrollWidth>K.clientWidth+1){const Be=K.getBoundingClientRect(),qe=ie.getBoundingClientRect(),Je=K.scrollLeft+(qe.left-Be.left)-(Be.width-qe.width)/2,vt=K.scrollWidth-K.clientWidth,Ue=Math.max(0,Math.min(vt,Je));typeof K.scrollTo=="function"?K.scrollTo({left:Ue,behavior:"smooth"}):K.scrollLeft=Ue}});const ge=ke(null),ue=ke(!1),B=ke(null),{map:V,initializeMap:se,destroy:_e}=Ak({containerRef:ge,accessToken:l.value,provider:c,style:((ff=i==null?void 0:i.value)==null?void 0:ff.style)??R.bootStyle(),config:R.bootConfig,center:((mf=i==null?void 0:i.value)==null?void 0:mf.center)??ko.center??[20,10],zoom:((bf=i==null?void 0:i.value)==null?void 0:bf.zoom)??ko.zoom??1.8,pitch:((_f=i==null?void 0:i.value)==null?void 0:_f.pitch)??ko.pitch??0,bearing:(($f=i==null?void 0:i.value)==null?void 0:$f.bearing)??ko.bearing??0,minZoom:((yf=i==null?void 0:i.value)==null?void 0:yf.minZoom)??ko.minZoom??.5,maxZoom:FC}),E=new ah({sourcesConfig:Mn,locale:g,profileConfig:i}),N=Px({mapId:te,dataSourceId:k.value,dataSourceManager:E,dataStore:w,markRaw:x=>x});async function M(x){const F=String(x||"").trim().toUpperCase();if(F.length!==3)return;await fs();const K=V.value;if(!K||!K.getLayer("regions-fill"))return;K.setLayoutProperty("regions-fill","visibility","visible"),K.setLayoutProperty("regions-border","visibility","visible");const ie=["literal",[F]];K.setPaintProperty("regions-fill","fill-opacity",["case",["in",["get","iso_3166_1_alpha_3"],ie],.3,.02]),K.setPaintProperty("regions-border","line-color",["case",["in",["get","iso_3166_1_alpha_3"],ie],"#111827","rgba(60,60,80,0.15)"]),K.setPaintProperty("regions-border","line-width",["case",["in",["get","iso_3166_1_alpha_3"],ie],2.5,.3]),K.getLayer("language-family-pins")&&K.moveLayer("language-family-pins")}function J(){var F;pe.clearCountry();const x=V.value;!x||!x.getLayer("regions-fill")||(x.setPaintProperty("regions-fill","fill-opacity",.2),x.setPaintProperty("regions-fill","fill-outline-color",null),x.setPaintProperty("regions-border","line-color","rgba(60,60,80,0.35)"),x.setPaintProperty("regions-border","line-width",.6),((F=T.value)==null?void 0:F.id)!=="doxa-regions"&&(x.setLayoutProperty("regions-fill","visibility","none"),x.setLayoutProperty("regions-border","visibility","none")))}const oe=cx({getMap:()=>V.value,mapId:te,getLanguageFamilyColor:x=>{var K,ie;const F=zo((K=T.value)==null?void 0:K.colorStrategy);return((ie=F==null?void 0:F.colors)==null?void 0:ie[x])??(F==null?void 0:F.fallback)??"#7c8cf8"},getNormalizedPeopleGroups:()=>N.normalizedPeopleGroups.value||[]});Hg({getMap:()=>V.value,mapId:te,getLanguageFamilyColor:()=>"#7c8cf8",getNormalizedPeopleGroups:()=>N.normalizedPeopleGroups.value||[]});const D=px({getMap:()=>V.value,mapId:te,mapStore:p,defaultCenter:((vf=i==null?void 0:i.value)==null?void 0:vf.center)??[20,10],defaultZoom:((wf=i==null?void 0:i.value)==null?void 0:wf.zoom)??1.8}),le=hx({getMap:()=>V.value,getActivePinColor:x=>{var K,ie;const F=zo(((K=T.value)==null?void 0:K.colorStrategy)??"languageFamily");return((ie=F==null?void 0:F.getColor)==null?void 0:ie.call(F,x))??"#1a1a1a"}});let ne=null,P=null;function A(){return ne?Promise.resolve(ne):(P||(P=Nt(()=>Promise.resolve().then(()=>lT),void 0).then(x=>(ne=x.useMapClustering({getMap:()=>V.value,mapId:te,mapStore:p,getPeopleGroups:()=>N.normalizedPeopleGroups.value||[],getClusterColor:()=>{var F,K;return((K=zo((F=T.value)==null?void 0:F.colorStrategy))==null?void 0:K.fallback)??"#7c8cf8"}}),ne))),P)}const W={setData(x){var F;(F=ne==null?void 0:ne.setData)==null||F.call(ne,x)},applyFilters(x){var F;(F=ne==null?void 0:ne.applyFilters)==null||F.call(ne,x)},refreshColors(){var x;(x=ne==null?void 0:ne.refreshColors)==null||x.call(ne)},cleanup(){var x;(x=ne==null?void 0:ne.cleanup)==null||x.call(ne)},async setEnabled(x){var F,K;(K=(F=await A()).setEnabled)==null||K.call(F,x)},async setMode(x){var F,K;(K=(F=await A()).setMode)==null||K.call(F,x)},_pendingSelectionFilter:null,setSelectionFilter(x){this._pendingSelectionFilter=x||null,ne!=null&&ne.setSelectionFilter&&ne.setSelectionFilter(x)},flushSelectionFilter(){ne!=null&&ne.setSelectionFilter&&ne.setSelectionFilter(this._pendingSelectionFilter)}},Z=ds({});Pt("legendRows",Z.rows),Pt("normalizedPeopleGroups",N.normalizedPeopleGroups);const pe=yx(()=>V.value),re=uL(te);dL(re);const{onPeopleGroupResult:Q,onAggregateResult:de,onClear:Pe,clearGeocoderProgrammatic:Ne}=Lx({map:V,geocoderRef:$e,clustering:W,mapStore:p,uiStore:f,mapLayers:oe,pplrInstance:re,onSemanticTreeSelect:ka,switchTab:ms,activeTabId:H,clearAllHighlights:Ur,clearCountryHighlight:J,mapId:te,legendRouters:{country:JT,region:YT,religion:KT}});re.activeTab.value=1;function Ke(x){return x==="affinity-block"?0:x==="language-family"?1:0}Me(S,x=>{re.activeTab.value=Ke(x)});const lt={get value(){return N.normalizedPeopleGroups.value||[]}},{langTree:et}=Yl(lt),Rt=[{id:"family",label:"Lang Family",info:"A language family is a group of languages descended from a common ancestor (e.g. Indo-European, Afro-Asiatic)."},{id:"language",label:"Language",info:"A language is a system of communication used by a people (e.g. Arabic, Bengali, Hindi)."},{id:"dialect",label:"Dialect/Variety",info:"A dialect/variety is a regional or social form of a language (e.g. Arabic, Sudanese; Pakistan Sign Language)."}],{affinityTree:Kt}=_h(lt),Ee=[{id:"bloc",label:"Affinity Block",info:"Affinity Block (field: rop1) — broadest grouping by cultural/linguistic/geographic kinship. 16 blocks total. Examples: Malay Peoples, South Asian Peoples, Deaf, Arab World."},{id:"cluster",label:"Cluster",info:'Cluster (field: imb_reg_of_people_2, ROP 2) — finer-grained grouping inside a bloc. 194 clusters total. Suffix "(Cluster)" appears on each row to distinguish from PG/PGIC. Example: Borneo-Kalimantan within Malay Peoples.'},{id:"group",label:"People Group",info:'People Group (field: imb_reg_of_people_25, ROP 2.5) — abstract ethnolinguistic identity, country-agnostic. Suffix "(PG)" on each row. 1,736 PGs total; 131 of them have rows in multiple countries (e.g. Deaf in 123 countries). Example: Abai Sungai (PG) is one ROP25 code regardless of where its people live.'},{id:"pgic",label:"PG in Country",info:'PGIC = People Group In Country (field: imb_reg_of_people_3 + country_code) — one row per (people group, country) pair. Suffix "(PGIC)" on each row. 2,106 rows total. Example: "Abai Sungai, Malaysia (PGIC)" is the Abai Sungai PG specifically as it exists in Malaysia.'}],{regionsTree:Qe}=$h(lt),ro=[{id:"region",label:"WAGF Region",info:'WAGF macro-region (e.g. "Asia", "Africa"). Color-coded on the map.'},{id:"block",label:"WAGF Bloc",info:'WAGF bloc — the organizational sub-grouping within each region (e.g. "South East Asia", "West Africa").'},{id:"country",label:"Country",info:"Individual countries, listed by unreached-population size within their bloc."}],Y=ds(zs(()=>S.value),Dr),he=Y.progress;Pt("legendProgress",he);function Le(x){const F=[];for(const K of x){F.push({id:K.key,label:K.label,color:K.color,count:K.count??0,pop:K.population??0,filter:K.filterKey?["==",["get","_flat_filter"],K.filterKey]:null,children:[]});for(const ie of K.children||[])F.push({id:ie.key,label:ie.label,color:ie.color,count:ie.count??0,pop:ie.population??0,filter:ie.filterKey?["==",["get","_flat_filter"],ie.filterKey]:null,children:[]})}return F}const Ce=ae(()=>["prayer","engagement","adoption","religion"].includes(S.value)),ze=ae(()=>Ce.value?Le(Y.items.value):S.value==="affinity-block"?Kt.value:S.value==="doxa-regions"?Qe.value:et.value),_t=ae(()=>Ce.value?null:S.value==="affinity-block"?Ee:S.value==="doxa-regions"?ro:Rt),Ge=ae(()=>Ce.value),It=ae(()=>S.value==="religion"?d("legend.colLabel.religion"):S.value==="prayer"?d("legend.colLabel.prayer"):S.value==="engagement"?d("legend.colLabel.engagement"):S.value==="adoption"?d("legend.colLabel.adoption"):Ce.value?d("legend.colLabel.status"):""),jt=ae(()=>f.legendState!=="collapsed");function go(x){x?f.openLegend():f.collapseLegend()}const Bn=ae(()=>Ce.value?d("legend.titleBar.legend"):S.value==="affinity-block"?d("legend.titleBar.peopleGroups"):S.value==="doxa-regions"?d("legend.titleBar.wagfRegions"):d("legend.titleBar.languages"));function jn(x,F){var K;for(const ie of x){if(F(ie))return ie;if((K=ie.children)!=null&&K.length){const ye=jn(ie.children,F);if(ye)return ye}}return null}Pt("onSemanticTreeSelect",x=>ka(x)),Pt("getActivePinColor",x=>{var K,ie;const F=zo(((K=T.value)==null?void 0:K.colorStrategy)??"languageFamily");return((ie=F==null?void 0:F.getColor)==null?void 0:ie.call(F,x))??"#1a1a1a"});function DT(x,F){if(!x||!F)return null;const K=x.id;if(F==="prayer"){const ie=["to-number",["get","peoplePraying"]];if(K==="noPrayer")return["==",ie,0];if(K==="fullPrayer")return[">=",ie,Do];if(K==="hasPrayer")return["all",[">",ie,0],["<",ie,Do]]}else if(F==="engagement"){if(K==="hasEngagement")return["==",["get","engagementStatus"],!0];if(K==="notEngaged")return["==",["get","engagementStatus"],!1]}else if(F==="adoption"){if(K==="hasAdoption")return["==",["get","adoptionStatus"],!0];if(K==="notAdopted")return["==",["get","adoptionStatus"],!1]}else if(F==="religion")return["==",["slice",["coalesce",["get","religion"],""],0,1],K];return null}const zT=["case",["has","iso_3166_1_alpha_3"],.7,.7],GT=["case",["has","iso_3166_1_alpha_3"],"rgba(60,60,80,0.35)","rgba(60,60,80,0.35)"],BT=["case",["has","iso_3166_1_alpha_3"],.6,.6];function jT(x){if(!x||!x.getLayer("regions-fill"))return;const F=ye=>["case",["has","iso_3166_1_alpha_3"],ye,ye],K=ye=>Array.isArray(ye)&&(ye[0]==="get"||ye[0]==="has"||ye[0]==="feature-state"||ye.some(K)),ie=(ye,we)=>{if(!x.getLayer(ye))return;const Te=x.getPaintProperty(ye,we);Te!=null&&(K(Te)||x.setPaintProperty(ye,we,F(Te)))};try{ie("regions-fill","fill-opacity"),ie("regions-border","line-color"),ie("regions-border","line-width")}catch{}}function dc(x,F){if(!x||!x.getLayer("regions-fill"))return;const K=Array.isArray(F)?[...new Set(F.filter(Boolean).map(qe=>String(qe).toUpperCase()))].sort():[],ie=["literal",K],ye=K.length?["case",["in",["get","iso_3166_1_alpha_3"],ie],.85,.15]:zT,we=K.length?["case",["in",["get","iso_3166_1_alpha_3"],ie],"#111827","rgba(60,60,80,0.15)"]:GT,Te=K.length?["case",["in",["get","iso_3166_1_alpha_3"],ie],2.5,.3]:BT,Be=(qe,Je,vt)=>{x.getLayer(qe)&&JSON.stringify(x.getPaintProperty(qe,Je))!==JSON.stringify(vt)&&x.setPaintProperty(qe,Je,vt)};try{Be("regions-fill","fill-opacity",ye),Be("regions-border","line-color",we),Be("regions-border","line-width",Te)}catch{}}function ka(x){var ie,ye,we,Te,Be,qe,Je,vt;const F=V.value;if(x){const Ue=Ce.value?DT(x,S.value):null,We=((ie=T.value)==null?void 0:ie.id)==="doxa-regions",st=Ue?{matchExpr:Ue}:{};We&&(st.regionPolygonSource="regions"),(ye=D.zoomToLegendRow)==null||ye.call(D,x,Object.keys(st).length?st:void 0)}if(!x){if(Ce.value){const Ue=S.value;Ue==="prayer"?f.setPrayerFilter(null):Ue==="engagement"?f.setEngagementFilter(null):Ue==="adoption"?f.setAdoptionFilter(null):Ue==="religion"&&f.setReligionFilter(null)}if(F&&F.getLayer("language-family-pins")){try{F.setFilter("language-family-pins",null)}catch{}t(F,null),sn(F,null),oe.syncGlowFilter(null)}F&&F.getLayer("regions-fill")&&(F.setPaintProperty("regions-fill","fill-opacity",.7),F.setPaintProperty("regions-border","line-color","rgba(60,60,80,0.35)"),F.setPaintProperty("regions-border","line-width",.6)),p.selectedFamily&&p.selectFamily(null),p.selectedLanguage&&p.selectLanguage(null),p.selectedDialect&&((we=p.selectDialect)==null||we.call(p,null)),p.selectedRegion&&((Te=p.selectRegion)==null||Te.call(p,null)),Ne();return}if(Ce.value){const Ue=S.value;Ue==="prayer"?f.setPrayerFilter(x.id):Ue==="engagement"?f.setEngagementFilter(x.id):Ue==="adoption"?f.setAdoptionFilter(x.id):Ue==="religion"&&f.setReligionFilter(x.id);return}if(F&&F.getLayer("language-family-pins")&&x.filter){try{F.setFilter("language-family-pins",x.filter)}catch{}t(F,x.filter),sn(F,null),oe.syncGlowFilter(x.filter)}const K=String(x.id||"");if(K.startsWith("fam:"))(Be=p.selectFamily)==null||Be.call(p,x.label);else if(K.startsWith("lang:"))(qe=p.selectLanguage)==null||qe.call(p,x.label);else if(K.startsWith("dial:"))(Je=p.selectDialect)==null||Je.call(p,{key:K.slice(5),originalLabels:x.originalLabels||[]});else if(K.startsWith("bloc:")||K.startsWith("cluster:")||K.startsWith("pg:")||K.startsWith("pgic:")){if(F&&F.getLayer("language-family-pins")&&x.filter){try{F.setFilter("language-family-pins",null)}catch{}t(F,x.filter),sn(F,x.filter),oe.syncGlowFilter(x.filter)}}else if(K.startsWith("region:")||K.startsWith("block:")||K.startsWith("country:")){if(F&&F.getLayer("language-family-pins")&&x.filter){try{F.setFilter("language-family-pins",x.filter)}catch{}t(F,x.filter),sn(F,null)}K.startsWith("region:")&&((vt=p.selectRegion)==null||vt.call(p,K.slice(7))),K.startsWith("region:")||dc(F,x.isoCodes||[])}}Me(()=>f.theme,x=>{re.theme.value=x==="dark"?"dark":"light"},{immediate:!0});function xn(x,F){var ie,ye;if(!F){const we=re.selection.value;we&&((ie=we.id)!=null&&ie.startsWith(x+":"))&&(re.selection.value=null);return}const K=re.selection.value;K&&((ye=K.id)!=null&&ye.startsWith(x+":"))&&K.label===F.label||(re.selection.value=F)}Me(()=>p.selectedFamily,x=>{if(!x)return xn("fam",null);const F=jn(et.value,K=>K.id.startsWith("fam:")&&K.label===x);F&&xn("fam",{...F,depth:0})}),Me(()=>p.selectedLanguage,x=>{if(!x)return xn("lang",null);const F=jn(et.value,K=>K.id.startsWith("lang:")&&K.label===x);F&&xn("lang",{...F,depth:1})}),Me(()=>p.selectedDialect,x=>{if(!(x!=null&&x.key))return xn("dial",null);const F=`dial:${x.key}`,K=jn(et.value,ie=>ie.id===F);K&&xn("dial",{...K,depth:2})}),Me(()=>p.selectedRegion,x=>{if(!x)return xn("region",null);const F=jn(Qe.value,K=>K.id===`region:${x}`);F&&xn("region",{...F,depth:0})});const xa=ke(!1);async function pc(){var x;if(!xa.value){xa.value=!0;try{const[{useMapPoster:F},{defaultPosterSpec:K},{printImageBlob:ie}]=await Promise.all([Nt(()=>Promise.resolve().then(()=>zh),void 0),Nt(()=>Promise.resolve().then(()=>Eh),void 0),Nt(()=>Promise.resolve().then(()=>kT),void 0)]),ye=F(()=>V.value),we=K({widthIn:8.5,heightIn:11,dpi:200,orientation:"portrait"}),Te=y(T.value)||Bn.value||"Doxa Map";we.dir=["ar","fa","he","ur"].includes(String($.value||"").split("-")[0])?"rtl":"ltr",we.slots.title={...we.slots.title,text:Te};const Be=(Y.items.value||[]).flatMap(We=>[We,...We.children||[]]),qe=(Be.length?Be:((x=Z==null?void 0:Z.rows)==null?void 0:x.value)||[]).map(We=>({label:We.label,color:We.color}));we.slots.legend={...we.slots.legend,rows:qe,title:Bn.value},we.slots.scaleBar=!1,we.slots.north=!1;const Je=uk(V.value)==="maplibre";we.slots.footer={...we.slots.footer,left:"pray.doxa.life",right:new Date().toISOString().slice(0,10),attribution:Je?"© OpenFreeMap © OpenMapTiles © OpenStreetMap":"© Mapbox © OpenStreetMap"};const vt=await ye.render(we,"png");ie(vt,{widthIn:we.widthIn??8.5,heightIn:we.heightIn??11,title:Te,alt:Te})||console.error("[research-map] poster print: the host blocked the print frame")}catch(F){console.error("[research-map] poster export failed:",F)}finally{xa.value=!1}}}const UT=ae(()=>String(d("controls.export_poster")||"Export poster…"));function HT(x){if(x==="poster")return pc();if(x==="packet")return qT()}let gc=!1;async function qT(){var x,F,K,ie,ye;if(!gc){gc=!0;try{const[{usePosterPrints:we},{defaultPosterSpec:Te},{useMapPoster:Be},{selectedPinIds:qe}]=await Promise.all([Nt(()=>Promise.resolve().then(()=>ST),void 0),Nt(()=>Promise.resolve().then(()=>Eh),void 0),Nt(()=>Promise.resolve().then(()=>zh),void 0),Nt(()=>Promise.resolve().then(()=>dx),void 0)]),Je=N.normalizedPeopleGroups.value||[],vt=[((F=(x=V.value)==null?void 0:x.getFilter)==null?void 0:F.call(x,"language-family-pins"))||null,jr].filter(Boolean);let Ue=Je;if(vt.length){const ct=qe(V.value,{expressions:vt}),rn=Je.filter(Vr=>ct.has(String(Vr.uniqueId??Vr.id??"")));rn.length?Ue=rn:console.warn(`[research-map] packet: ${ct.size} pin(s) selected but no rows matched; printing the full list`)}const We=Ue.length;Ue.length>50&&(console.warn(`[research-map] packet truncated ${Ue.length} → 50 people groups`),Ue=Ue.slice(0,50));const st=Ue.map(ct=>({slug:String(ct.slug||ct.uniqueId||ct.id||""),name:ct.name,population:ct.population,religion:ct.religionName||ct.religionLabel||ct.religion||"",country_code:ct.countryName||ct.countryIsoLabel||ct.country||ct.countryIso||"",image_url:ct.imageUrl||ct.image_url||""})),Ze=Te({widthIn:8.27,heightIn:11.69,dpi:150,orientation:"portrait"});Ze.slots.title={...Ze.slots.title,text:Bn.value||"Doxa Map"},Ze.slots.legend={...Ze.slots.legend,rows:((K=Z==null?void 0:Z.rows)==null?void 0:K.value)||[]};let At="";try{const ct=await Be(()=>V.value).render(Ze,"png");At=``}catch(ct){console.warn("[research-map] packet map page skipped:",(ct==null?void 0:ct.message)||ct)}const ho=Bn.value||y(T.value)||"Doxa Map",Hn={id:String(((ie=T.value)==null?void 0:ie.id)||"research-map"),label:We>Ue.length?`${ho} — ⁦${Ue.length} / ${We}⁩`:ho,zoneKey:String(((ye=T.value)==null?void 0:ye.id)||"research-map")};await we({records:()=>st,lang:()=>String($.value||"en").split("-")[0],label:()=>Hn.label}).printPacket(Hn,{mapSvg:At})}catch(we){console.error("[research-map] packet export failed:",we)}finally{gc=!1}}}const nf=ke(!1),af=ae(()=>p.selectedFeature),to=ae(()=>f.isDarkTheme),hc=ae(()=>Up.lightPreset==="night");function fc(){var K;const x=V.value;if(!x||!x.getLayer("language-family-pins"))return;const F=hc.value?"#ffffff":["case",[">",["to-number",["get","peoplePraying"],0],0],"#ffffff","#1f2937"];x.setPaintProperty("language-family-pins","circle-stroke-color",F),x.setPaintProperty("language-family-pins","circle-stroke-width",hc.value?rx((K=T.value)==null?void 0:K.colorStrategy):qg)}Me(hc,fc,{immediate:!1}),Me(()=>{var x;return(x=T.value)==null?void 0:x.id},fc),Me(()=>f.theme,()=>R.applyTheme(V.value));function WT(){R.swapTheme(V.value)}const sf=ke(!1);let hs=null;async function fs(){if(!sf.value)return hs||(hs=(async()=>{var x,F,K;try{const ie=await((x=N.loadRegionsData)==null?void 0:x.call(N));ie&&V.value&&((F=oe.addRegionsLayer)==null||F.call(oe,ie,"doxa-regions"),jT(V.value),V.value.getLayer("regions-fill")&&((K=T.value)==null?void 0:K.id)!=="doxa-regions"&&(V.value.setLayoutProperty("regions-fill","visibility","none"),V.value.setLayoutProperty("regions-border","visibility","none")),V.value.getLayer("language-family-pins")&&V.value.moveLayer("language-family-pins")),sf.value=!0,N.regionsData.value=null}catch(ie){console.warn("[research-map] regions layer failed:",ie)}finally{hs=null}})(),hs)}function ms(x){var ie,ye,we;if(x===H.value)return;H.value=x,(ie=f.setActiveTab)==null||ie.call(f,x),Ne();const F=ee.value.find(Te=>Te.id===x);if(!F||!V.value)return;R.setLook(R.lookFor(F.colorStrategy),V.value),F.id==="doxa-regions"&&fs();const K=zo(F.colorStrategy);if(V.value.getLayer("language-family-pins")&&(K!=null&&K.buildColorExpression)){const Te=F.id==="doxa-regions"?"#a30000":K.buildColorExpression();V.value.setPaintProperty("language-family-pins","circle-color",Te),Ur(V.value),F.id==="prayer"?oe.startPrayerGlow():oe.stopPrayerGlow();const Be=F.id==="doxa-regions";V.value.getLayer("regions-fill")&&(V.value.setLayoutProperty("regions-fill","visibility",Be?"visible":"none"),V.value.setLayoutProperty("regions-border","visibility",Be?"visible":"none")),V.value.getLayer("language-family-pins")&&V.value.moveLayer("language-family-pins")}(ye=Z.refresh)==null||ye.call(Z),(we=W.refreshColors)==null||we.call(W)}function rf(x){var K,ie;const F=x==null?void 0:x.detail;!F||F.mapId!==te||(F.center&&Array.isArray(F.center)?(K=D.flyToCoords)==null||K.call(D,{longitude:F.center[0],latitude:F.center[1]},F.zoom??4):F.bounds&&((ie=D.fitBounds)==null||ie.call(D,F.bounds,60)))}function lf(x){var qe,Je,vt;const F=x==null?void 0:x.detail;if(!F||(Ut(F),!((qe=F.coords)!=null&&qe.length)))return;const K=F.coords;if(K.length===1){(Je=D.flyToCoords)==null||Je.call(D,{longitude:K[0][0],latitude:K[0][1]},3);return}let ie=1/0,ye=-1/0,we=1/0,Te=-1/0;for(const[Ue,We]of K)Ueye&&(ye=Ue),WeTe&&(Te=We);const Be=F.kind==="region"?2.2:3;(vt=D.fitBounds)==null||vt.call(D,[[ie,we],[ye,Te]],60,{maxZoom:Be})}let jr=null;function VT(){const x=(p==null?void 0:p.showClusters)&&((p==null?void 0:p.clusteringMode)||"off")!=="off",F=Number(p==null?void 0:p.clusterPinOpacity);return x&&Number.isFinite(F)?Math.min(1,Math.max(0,F)):1}function sn(x,F){var ye;if(F!==void 0&&(jr=F||null),!x||!((ye=x.getLayer)!=null&&ye.call(x,"language-family-pins")))return;const K=VT(),ie=jr?["case",jr,K,0]:["case",["has","uniqueId"],K,K];try{if(JSON.stringify(x.getPaintProperty("language-family-pins","circle-opacity"))===JSON.stringify(ie))return;x.setPaintProperty("language-family-pins","circle-opacity",ie),x.setPaintProperty("language-family-pins","circle-stroke-opacity",ie),x.getLayer("language-family-pins-shadow")&&x.setPaintProperty("language-family-pins-shadow","circle-opacity",ie)}catch{}}Me(()=>[p==null?void 0:p.clusterPinOpacity,p==null?void 0:p.clusteringMode,p==null?void 0:p.showClusters],()=>sn(V.value));const io={family:null,language:null,dialect:null,region:null,prayer:null,engagement:null,adoption:null};function Ur(x){sn(x,null),x.setFilter("language-family-pins",null),t(x,null),oe.syncGlowFilter(null),dc(x,[]),x.getLayer("regions-fill")&&x.setPaintProperty("regions-fill","fill-outline-color",null),io.family=io.language=io.dialect=io.region=null,io.prayer=io.engagement=io.adoption=null,f.prayerFilter&&f.setPrayerFilter(null),f.engagementFilter&&f.setEngagementFilter(null),f.adoptionFilter&&f.setAdoptionFilter(null),f.religionFilter&&f.setReligionFilter(null),W.setSelectionFilter(null),p.selectedFamily&&p.selectFamily(null),p.selectedLanguage&&p.selectLanguage(null),p.selectedDialect&&p.selectDialect(null);try{re&&re.selection&&re.selection.value&&(re.selection.value=null)}catch{}}let Hr=null,qr=0;function Ut(x){var Be,qe,Je,vt,Ue;const F=V.value;if(!F||!F.getLayer("language-family-pins"))return;let K,ie,ye;if(x.kind==="family")ye="family",K="languageFamily",ie=x.familyKey;else if(x.kind==="language")ye="language",K="language",ie=x.languageKey;else if(x.kind==="region")ye="region",K="doxaRegion",ie=x.regionKey;else if(x.kind==="prayer")ye="prayer",K=x.property||"peoplePraying",ie=x.expectedValue;else if(x.kind==="engagement")ye="engagement",K=x.property||"engagementStatus",ie=x.expectedValue;else if(x.kind==="adoption")ye="adoption",K=x.property||"adoptionStatus",ie=x.expectedValue;else if(x.kind==="religion")ye="religion",K=x.property||"religion",ie=x.expectedValue;else if(x.kind==="dialect")ye="dialect",K="language",ie=x.dialectKey||"";else{Ur(F),Ne();for(const We of Object.keys(io))io[We]=null;Hr=null,qr=0;return}const we=Date.now(),Te=`${ye}|${ie}`;if(!(Hr===Te&&we-qr<80)){if(Hr=Te,qr=we,io[ye]===ie){Ur(F),Ne(),Hr=null,qr=0;return}for(const We of Object.keys(io))io[We]=null;if(io[ye]=ie,ye==="family"?(Be=p.selectFamily)==null||Be.call(p,ie):ye==="region"?(qe=p.selectRegion)==null||qe.call(p,ie):ye==="language"?(Je=p.selectLanguage)==null||Je.call(p,ie):ye==="dialect"&&((vt=p.selectDialect)==null||vt.call(p,{key:ie,originalLabels:x.originalLabels||[]})),W.setSelectionFilter({property:K,value:ie}),ye==="region"){if(F.setFilter("language-family-pins",["==",["get","doxaRegion"],ie]),t(F,["==",["get","doxaRegion"],ie]),sn(F,null),F.getLayer("regions-fill")){const We=((Ue=oe.regionIsoMap)==null?void 0:Ue.value)||{},st=ho=>String(ho).toLowerCase().replace(/[^a-z]/g,""),Ze=st(ie);let At=We[ie]||[];if(!At.length){for(const[ho,Hn]of Object.entries(We))if(st(ho)===Ze){At=Hn;break}}dc(F,At)}}else{F.setFilter("language-family-pins",null);let We;if(ye==="prayer"){const st=["to-number",["get",K]];ie==="noPrayer"?We=["==",st,0]:ie==="fullPrayer"?We=[">=",st,Do]:ie==="hasPrayer"?We=["all",[">",st,0],["<",st,Do]]:We=["==",["get",K],ie]}else if(ye==="engagement")We=["==",["get",K],ie==="hasEngagement"];else if(ye==="adoption")We=["==",["get",K],ie==="hasAdoption"];else if(ye==="religion")We=["==",["slice",["coalesce",["get",K],""],0,1],ie];else if(x.filterExpr)We=x.filterExpr;else if(ye==="language")We=["any",["==",["get",K],ie],["==",["slice",["get",K],0,ie.length+1],ie+","],["in"," "+ie,["get",K]]];else if(ye==="dialect"){const st=x.originalLabels||[];st.length===1?We=["==",["get",K],st[0]]:st.length>1?We=["in",["get",K],["literal",st]]:We=["==",["get",K],ie]}else We=["==",["get",K],ie];sn(F,We),t(F,We),oe.syncGlowFilter(We),F.getLayer("regions-fill")&&(F.setPaintProperty("regions-fill","fill-opacity",.2),F.setPaintProperty("regions-border","line-color","rgba(60,60,80,0.35)"),F.setPaintProperty("regions-border","line-width",.6))}}}function KT(x,{map:F,filterLayerId:K}){const ie=x.label;try{F.setFilter(K,null)}catch{}const ye=Object.keys(wo).find(we=>wo[we]===ie);if(ye){const we={id:ye,label:ie,depth:0},Te=()=>{try{F.setFilter(K,null)}catch{}ka(we),re&&re.selection&&(re.selection.value=we)};H.value!=="religion"&&ms("religion"),Ot(Te)}}function YT(x,{map:F,filterLayerId:K}){const ie=x.label,ye=qe=>String(qe).toLowerCase().replace(/[^a-z0-9]/g,""),we=qe=>String(qe||"").replace(/\s*\((?:Region|Bloc)\)\s*$/i,""),Te=ye(ie),Be=()=>{try{F.setFilter(K,null)}catch{}const qe=jn(Qe.value,Je=>(Je.id.startsWith("region:")||Je.id.startsWith("block:"))&&ye(we(Je.label))===Te);qe&&(ka(qe),re&&re.selection&&(re.selection.value=qe))};H.value!=="doxa-regions"?(ms("doxa-regions"),Promise.resolve(fs()).finally(()=>Ot(Be))):Be()}function JT(x){var K,ie,ye,we;if(Array.isArray(x.bounds)&&x.bounds.length===4){const[Te,Be,qe,Je]=x.bounds;(K=D.fitBounds)==null||K.call(D,[[Te,Be],[qe,Je]],60)}else Array.isArray(x.center)&&x.center.length===2&&((ie=D.flyTo)==null||ie.call(D,x.center));const F=bx(x,N.normalizedPeopleGroups.value||[]);if(F&&M(F),F&&((ye=T.value)==null?void 0:ye.id)!=="doxa-regions"&&pe.showCountry(F),F&&((we=T.value)==null?void 0:we.id)==="doxa-regions"){const Te=()=>{const Be=jn(Qe.value,qe=>qe.id.startsWith("country:")&&(qe.isoCodes||[]).includes(F));Be&&(ka(Be),re&&re.selection&&(re.selection.value=Be))};Promise.resolve(fs()).finally(()=>Ot(Te))}}Me(()=>p.filters,()=>{var x,F;(x=oe.applyFilters)==null||x.call(oe,p.filters),(F=W.applyFilters)==null||F.call(W,p.filters)},{deep:!0});let Wr=!1,cf="";Me(()=>{var x;return(x=i==null?void 0:i.value)==null?void 0:x.externalFilters},x=>{var F,K;if(!(!x||typeof x!="object"||!p)){Wr=!0;try{if("region"in x){const ie=x.region||null;(ie||p.selectedRegion)&&((F=p.selectRegion)==null||F.call(p,ie))}if("religion"in x){const ie=String(x.religion||"").trim(),ye=ie?Object.keys(wo).find(we=>String(wo[we]).toLowerCase()===ie.toLowerCase()):"";ie?ye&&(H.value!=="religion"&&ms("religion"),Ot(()=>f.setReligionFilter(ye))):f.religionFilter&&f.setReligionFilter(null)}if("fitSlugs"in x&&eE(x.fitSlugs),"language"in x){const ie=x.language||null;(ie||p.selectedLanguage)&&((K=p.selectLanguage)==null||K.call(p,ie))}}finally{Ot(()=>{Wr=!1})}}},{deep:!0,immediate:!0}),typeof window<"u"&&(window.__researchMapFilterState=()=>{var x,F;return{selectedRegion:(p==null?void 0:p.selectedRegion)||"",externalRegion:((F=(x=i==null?void 0:i.value)==null?void 0:x.externalFilters)==null?void 0:F.region)||"",religionFamily:wo[f==null?void 0:f.religionFilter]||"",selectedLanguage:(p==null?void 0:p.selectedLanguage)||""}},window.__researchMapPinOpacity=()=>{var x,F;try{return((F=(x=V.value)==null?void 0:x.getPaintProperty)==null?void 0:F.call(x,"language-family-pins","circle-opacity"))??null}catch{return null}},window.__researchMapClusterDraw=()=>{var K,ie;const x=V.value,F={};try{for(const ye of((ie=(K=x==null?void 0:x.getStyle)==null?void 0:K.call(x))==null?void 0:ie.layers)||[]){if(!/^(mapbox-clusters|cluster-lines)/.test(ye.id))continue;let we=0;try{we=x.queryRenderedFeatures({layers:[ye.id]}).length}catch{we=-1}F[ye.id]={visibility:ye.layout&&ye.layout.visibility||"visible",rendered:we}}}catch{}return F},window.__researchMapVocabulary=x=>{var ie;const F=((ie=N==null?void 0:N.normalizedPeopleGroups)==null?void 0:ie.value)||[],K=new Set;for(const ye of F){if(x==="religionFamily"){const Te=wo[String((ye==null?void 0:ye.religion)||"").charAt(0)];Te&&K.add(Te);continue}const we=ye&&ye[x];typeof we=="string"&&we&&K.add(we)}return[...K].sort()});const mc=_o();function ZT(){var x,F,K,ie;try{return((ie=(K=(F=(x=mc==null?void 0:mc.proxy)==null?void 0:x.$el)==null?void 0:F.getRootNode)==null?void 0:K.call(F))==null?void 0:ie.host)||null}catch{return null}}function uf(){var st;if(Wr||typeof window>"u")return;const x=ZT();if(!x)return;const F=wo[f==null?void 0:f.religionFilter]||"",K=(p==null?void 0:p.selectedLanguage)||"",ie=(p==null?void 0:p.selectedDialect)||null,ye=Array.isArray(ie==null?void 0:ie.originalLabels)?ie.originalLabels.map(Ze=>String(Ze).trim()).filter(Boolean):[],we=((st=N==null?void 0:N.normalizedPeopleGroups)==null?void 0:st.value)||[],Te=Ze=>{const At=Ze&&(Ze.language??Ze.primary_language);return String((At&&typeof At=="object"?At.label:At)||"").trim()},Be=(Ze,At)=>Ze===At||Ze.startsWith(At+",")||Ze.includes(" "+At),qe=ye.length?we.filter(Ze=>ye.includes(Te(Ze))):K?we.filter(Ze=>Be(Te(Ze),K.trim())):[],Je=[...new Set(qe.map(Ze=>{var At,ho;return String(((ho=(At=Ze==null?void 0:Ze._raw)==null?void 0:At.primary_language)==null?void 0:ho.value)||(Ze!=null&&Ze.language&&typeof Ze.language=="object"?Ze.language.value:"")||"").trim()}).filter(Boolean))],vt=Je.length===1?Je[0]:"",Ue={region:(p==null?void 0:p.selectedRegion)||"",religion:F,language:ye.length?ye.join(" · "):K,languageCode:vt,languageCodes:Je},We=!Ue.region&&!Ue.religion&&!Ue.language&&!Ue.languageCode;if(We&&df){const Ze=typeof performance<"u"?performance.now():Date.now();if(_s||(_s=Ze),Ze-_sclearTimeout(bs)),Me(()=>{var x;return[p==null?void 0:p.selectedRegion,p==null?void 0:p.selectedLanguage,(x=p==null?void 0:p.selectedDialect)==null?void 0:x.key,f==null?void 0:f.religionFilter]},()=>XT()),Me(()=>p.selectedRegion,x=>{Ut(x?{kind:"region",regionKey:x}:{kind:null})}),Me(()=>p.selectedFamily,x=>{x?Ut({kind:"family",familyKey:x}):!p.selectedLanguage&&!p.selectedDialect&&Ut({kind:null})}),Me(()=>p.selectedLanguage,x=>{x?Ut({kind:"language",languageKey:x}):!p.selectedFamily&&!p.selectedDialect&&Ut({kind:null})}),Me(()=>p.selectedDialect,x=>{x!=null&&x.key?Ut({kind:"dialect",dialectKey:x.key,originalLabels:x.originalLabels||[]}):!p.selectedFamily&&!p.selectedLanguage&&Ut({kind:null})}),Me(()=>f.prayerFilter,x=>{Ut(x?{kind:"prayer",property:"peoplePraying",expectedValue:x}:{kind:null})}),Me(()=>f.engagementFilter,x=>{Ut(x?{kind:"engagement",property:"engagementStatus",expectedValue:x}:{kind:null})}),Me(()=>f.adoptionFilter,x=>{Ut(x?{kind:"adoption",property:"adoptionStatus",expectedValue:x}:{kind:null})}),Me(()=>f.religionFilter,x=>{Ut(x?{kind:"religion",property:"religion",expectedValue:x}:{kind:null})});function QT(){try{return typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}function eE(x){var At,ho,Hn;const F=Array.isArray(x)?x.filter(xo=>typeof xo=="string"&&xo):[],K=F.length?`${F.length}:${F[0]}:${F[F.length-1]}`:"";if(K===cf||(cf=K,!F.length))return;const ie=new Set(F),ye=((At=N==null?void 0:N.normalizedPeopleGroups)==null?void 0:At.value)||[];let we=1/0,Te=1/0,Be=-1/0,qe=-1/0,Je=0;for(const xo of ye){if(!xo||!ie.has(xo.slug))continue;const ct=Number(xo.longitude??xo.lng),rn=Number(xo.latitude??xo.lat);!Number.isFinite(ct)||!Number.isFinite(rn)||(ctBe&&(Be=ct),rn>qe&&(qe=rn),Je++)}if(!Je)return;const vt=Be-we,Ue=qe-Te,We={longitude:(we+Be)/2,latitude:(Te+qe)/2},st=vt>IC?{c:We,z:OC}:Je===1||vtp.showClusters,async x=>{$s||(x&&(!p.clusteringMode||p.clusteringMode==="off")?p.clusteringMode="mst":!x&&p.clusteringMode!=="off"&&(p.clusteringMode="off"),await pf())}),Me(()=>p.clusteringMode,async()=>{$s||await pf()});async function tE(x){var F,K,ie,ye,we,Te,Be;p.registerMap(te,V.value),dk(V.value,"mercator"),R.applyTheme(V.value),x!=null&&x.length&&(oe.addLanguageFamilyLayer(x,((F=T.value)==null?void 0:F.colorStrategy)??"languageFamily"),((K=T.value)==null?void 0:K.id)==="doxa-regions"&&((ie=V.value)!=null&&ie.getLayer("language-family-pins"))&&V.value.setPaintProperty("language-family-pins","circle-color","#4b5563"),sn(V.value),((ye=T.value)==null?void 0:ye.id)==="prayer"&&oe.startPrayerGlow(),(we=W.setData)==null||we.call(W,x),(Te=Z.build)==null||Te.call(Z,x),le.initialize()),((Be=T.value)==null?void 0:Be.id)==="doxa-regions"&&(typeof window<"u"&&window.requestIdleCallback?Je=>window.requestIdleCallback(Je,{timeout:2e3}):Je=>setTimeout(Je,800))(()=>{fs()}),fc(),p.setMapReady(te),ue.value=!0}let ys=null,Un=null,Sa=null;function gf(x){const F=z.value;F&&(getComputedStyle(F).getPropertyValue("--map-radius").trim()||(F.style.setProperty("--map-radius","16px"),F.style.setProperty("--map-radius-sm","8px")),x>=700?(F.style.setProperty("--map-btn-size","40px"),F.style.setProperty("--map-toolbar-gap","8px"),F.style.setProperty("--map-font-md","13px"),F.style.setProperty("--map-font-sm","11px"),F.style.setProperty("--map-legend-width","380px")):x>=500?(F.style.setProperty("--map-btn-size","36px"),F.style.setProperty("--map-toolbar-gap","6px"),F.style.setProperty("--map-font-md","12px"),F.style.setProperty("--map-font-sm","10px"),F.style.setProperty("--map-legend-width","360px")):(F.style.setProperty("--map-btn-size","32px"),F.style.setProperty("--map-toolbar-gap","5px"),F.style.setProperty("--map-font-md","11px"),F.style.setProperty("--map-font-sm","10px"),F.style.setProperty("--map-legend-width","280px")))}return Eo(async()=>{var F,K,ie,ye;(F=f.init)==null||F.call(f),H.value=((K=ee.value[0])==null?void 0:K.id)??"doxa-regions",f.isMobile?(ie=f.collapseLegend)==null||ie.call(f):(ye=f.openLegend)==null||ye.call(f),z.value&&(gf(z.value.getBoundingClientRect().width),typeof ResizeObserver<"u"&&(ys=new ResizeObserver(we=>{for(const Te of we)gf(Te.contentRect.width)}),ys.observe(z.value))),window.addEventListener("doxa:legend-row-click",rf),window.addEventListener("legend:highlight",lf);const x=N.loadData().catch(we=>(console.error("[research-map] data load failed:",we),{normalizedPeopleGroups:[]}));try{await se()}catch(we){console.error("[research-map] Map failed to initialize —",we),B.value=String((we==null?void 0:we.message)||we);return}{const we=V.value?Xe(V.value):null;we&&we!==V.value&&(V.value=null,V.value=Yn(we))}if(!V.value){console.error("[research-map] Map failed to initialize — check token and container"),B.value="Map failed to initialize — check token and container";return}V.value.once("style.load",async()=>{try{const{normalizedPeopleGroups:we}=await x;await tE(we)}catch(we){console.error("[research-map] onMapReady failed:",we),B.value=String((we==null?void 0:we.message)||we)}}),n(V.value),Sa=()=>n(V.value);try{Un=new ResizeObserver(Sa);const we=V.value.getContainer&&V.value.getContainer()||null;we&&Un.observe(we);const Te=we?o(we):null;Te&&Un.observe(Te),document.body&&Un.observe(document.body)}catch{}window.addEventListener("resize",Sa)}),co(()=>{var x,F;window.removeEventListener("doxa:legend-row-click",rf),window.removeEventListener("legend:highlight",lf),ys&&(ys.disconnect(),ys=null),Un&&(Un.disconnect(),Un=null),Sa&&(window.removeEventListener("resize",Sa),Sa=null),oe.stopPrayerGlow(),(x=W.cleanup)==null||x.call(W),(F=le.cleanup)==null||F.call(le),p.unregisterMap(te),_e()}),(x,F)=>(ce(),fe("div",{ref_key:"rmRoot",ref:z,class:Fe(["rm-root",{"rm-dark":to.value,"dsm-dark":to.value}])},[C.value?(ce(),fe("div",{key:0,ref_key:"tabBar",ref:be,class:"rm-tab-bar"},[(ce(!0),fe(Ve,null,qt(ee.value,K=>(ce(),fe(Ve,{key:K.id},[O("button",{class:Fe(["rm-tab",{active:H.value===K.id}]),onClick:ie=>ms(K.id)},ve(y(K)),11,AC),K.sepAfter?(ce(),fe("div",PC)):xe("",!0)],64))),128))],512)):xe("",!0),O("div",LC,[!ue.value&&!B.value?(ce(),fe("div",CC,ve(a("dashboard.map_loading","Research map loading…")),1)):xe("",!0),B.value?(ce(),fe("div",TC,ve(a("allPeopleGroups.loadError","The map could not be loaded."))+" "+ve(B.value),1)):xe("",!0),O("div",{ref_key:"mapContainer",ref:ge,class:"rm-map-canvas"},null,512),F[4]||(F[4]=O("div",{class:"map-scroll-edge map-scroll-edge--left"},null,-1)),F[5]||(F[5]=O("div",{class:"map-scroll-edge map-scroll-edge--right"},null,-1)),me(c)!=="mapbox"?(ce(),fe("div",{key:2,class:"rm-provider-badge","data-provider":me(c)},ve(me(L)),9,EC)):xe("",!0),ue.value&&me(V)&&u.value?(ce(),tt(JA,{key:3,ref_key:"geocoderRef",ref:$e,"map-instance":me(V),"access-token":me(l),provider:me(c),"data-source-id":me(k),"is-dark":to.value,placeholder:I.value,"active-context":q.value,onPeopleGroupResult:me(Q),onAggregateResult:me(de),onClear:me(Pe)},null,8,["map-instance","access-token","provider","data-source-id","is-dark","placeholder","active-context","onPeopleGroupResult","onAggregateResult","onClear"])):xe("",!0),xe("",!0),ue.value&&me(V)?(ce(),tt(kA,{key:5,"has-geocoder":u.value},{default:Qt(()=>[it(SA,{map:me(V),"is-dark":to.value},null,8,["map","is-dark"]),it(AA,{map:me(V),"is-dark":to.value},null,8,["map","is-dark"]),it(PA,{map:me(V),"is-dark":to.value},null,8,["map","is-dark"]),it(TA,{"map-container":ge.value,"is-dark":to.value},null,8,["map-container","is-dark"]),it(RA,{"is-dark":to.value,onToggle:WT},null,8,["is-dark"]),it(Dn,{"is-dark":to.value,active:xa.value,disabled:xa.value,title:UT.value,class:"export-poster-btn","aria-busy":xa.value?"true":"false",onClick:pc},{default:Qt(()=>[...F[3]||(F[3]=[O("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},[O("path",{d:"M12 3v12M7 10l5 5 5-5M5 21h14"})],-1)])]),_:1},8,["is-dark","active","disabled","title","aria-busy"]),v.share?(ce(),tt(_P,{key:0,"is-dark":to.value,"embed-path":"doxa-research-map/research-map/index.html"},null,8,["is-dark"])):xe("",!0)]),_:1},8,["has-geocoder"])):xe("",!0),ue.value&&m.value?(ce(),tt(wA,{key:6,"legend-type":S.value,"is-dark":to.value},null,8,["legend-type","is-dark"])):xe("",!0),ue.value?(ce(),tt(MP,{key:7,"is-open":nf.value,onClose:F[1]||(F[1]=K=>nf.value=!1),onOpenPoster:pc},{default:Qt(()=>[it(cL)]),_:1},8,["is-open"])):xe("",!0),O("div",{class:"rm-legend-desktop-slot",style:ft(b.value?{"--stl-top":b.value}:null)},[ue.value&&me(f).legendMode==="detail"&&me(f).selectedPeopleGroup?(ce(),tt(cA,{key:0,"legend-type":S.value,"popup-action":G.value,"initially-collapsed":!1,"is-dark":to.value},null,8,["legend-type","popup-action","is-dark"])):xe("",!0),Hs(O("div",null,[ue.value?(ce(),tt(bh,{key:0,nodes:ze.value,tabs:_t.value,title:Bn.value,hideTabs:Ge.value,columnLabel:It.value,progress:me(he),open:jt.value,"export-enabled":NC,onSelect:ka,onExport:HT,"onUpdate:open":go},null,8,["nodes","tabs","title","hideTabs","columnLabel","progress","open"])):xe("",!0)],512),[[td,!(me(f).legendMode==="detail"&&me(f).selectedPeopleGroup)]])],4),O("div",RC,[ue.value?(ce(),tt(me(s),{key:0,"legend-type":S.value,"popup-action":G.value,"is-dark":to.value},null,8,["legend-type","popup-action","is-dark"])):xe("",!0)]),ue.value&&af.value?(ce(),tt(me(r),{key:8,feature:af.value,action:G.value,dark:to.value,onClose:F[2]||(F[2]=K=>me(p).selectFeature(null))},null,8,["feature","action","dark"])):xe("",!0)])],2))}}},Symbol.toStringTag,{value:"Module"})),BC="",jC={class:"legend-sheet-root"},UC=["src","alt"],HC={key:0,class:"pull-tab-handle"},qC=["aria-label"],WC=["aria-label"],VC=["aria-label"],KC={class:"collapsed-detail-title"},YC={class:"legend-content"},JC=["aria-label"],ZC=["aria-label"],xh=80,XC=48,QC=44,eT=24,Sh="--legend-sheet-h",Ah=Object.freeze(Object.defineProperty({__proto__:null,default:bn({__name:"LegendMobile",props:{legendType:{type:String,required:!0},nodes:{type:Array,default:null},tabs:{type:Array,default:null},defaultTab:{type:Number,default:0},columnLabel:{type:String,default:null},title:{type:String,default:null},columns:{type:Array,default:null},isDark:{type:Boolean,default:!1},popupAction:{type:String,default:"pray",validator:e=>["pray","adopt","none"].includes(e)},disableCollapse:{type:Boolean,default:!1}},setup(e){const{t}=kt();Et(` .floating-mini-image{position:absolute;inset-inline-start:16px;bottom:calc(30% + 16px);z-index:999;pointer-events:auto;cursor:pointer;} .mini-image{width:120px;height:150px;object-fit:cover;border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,0.25);display:block;} .legend-sheet-root{position:absolute;inset:0;pointer-events:none;overflow:hidden;} diff --git a/public/dx-maps/doxa-research-map/research-map/index.html b/public/dx-maps/doxa-research-map/research-map/index.html index 56684ef6..0c2bef40 100644 --- a/public/dx-maps/doxa-research-map/research-map/index.html +++ b/public/dx-maps/doxa-research-map/research-map/index.html @@ -36,7 +36,7 @@ - + - + \n\n" + "script": "\n\n\n\n" }, "instances": [ {