From 7eef2a73937b8ed83476497c3ddeaea1f750169d Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Wed, 30 Sep 2026 05:50:40 +0000 Subject: [PATCH] UPG-100 wall: "Posters per row: 2" shows two on a phone The select read 2 while the wall showed one. The shared clamp (210px per card) forced one column at 390 and silently overrode it. The wall now opts into PosterWall's minCardPx (150), as the country posters did, so a phone keeps the columns the reader chose. Measured at 390, en + ar, with this bundle overlaid on the frozen item-5 candidate: 2 columns (select 2), cards 162px, 0 of 12 action labels clipped. The poster thumbnails are 114px wide, so a poster's title band renders about 9px tall (25px at one per row). The title is not readable at that size; the two-up choice was made with that in view. The two-line "Show on map" pill and the print options overhanging the card are PosterWall's own (their fixes are separate). --- plugin-designs/my-upg-100-list/poster-wall.vue | 7 +++++++ public/dx-maps/doxa-maps-spa/manifest.json | 12 ++++++------ public/dx-maps/manifest.json | 12 ++++++------ public/dx-maps/my-upg-100-list/my-upg-100-list.js | 2 +- .../dx-maps/my-upg-100-list/poster-wall/index.html | 2 +- .../dx-maps/my-upg-100-list/upg-100-list/index.html | 2 +- .../dx-maps/my-upg-100-list/upg-100-mfe/index.html | 2 +- 7 files changed, 23 insertions(+), 16 deletions(-) diff --git a/plugin-designs/my-upg-100-list/poster-wall.vue b/plugin-designs/my-upg-100-list/poster-wall.vue index e71fddfbd..9190089b0 100644 --- a/plugin-designs/my-upg-100-list/poster-wall.vue +++ b/plugin-designs/my-upg-100-list/poster-wall.vue @@ -286,5 +286,12 @@ const wallTag = computed(() => t('messages.upg100WallTag')) :hide-prayer-list-when-soon="true" download-prefix="doxa-upg-100" :columns-control="true" + :min-card-px="150" /> + + diff --git a/public/dx-maps/doxa-maps-spa/manifest.json b/public/dx-maps/doxa-maps-spa/manifest.json index af9fbbb31..94b4f7022 100644 --- a/public/dx-maps/doxa-maps-spa/manifest.json +++ b/public/dx-maps/doxa-maps-spa/manifest.json @@ -880,7 +880,7 @@ "bundle": "my-upg-100-list", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "output": "dx-maps/my-upg-100-list/my-upg-100-list.js", - "integrity": "sha384-+QpVXNn0/QCB8TGqtAHrUNtDtJjwiF/77N4vCZaqSiH7uo/Y63dOqDjLpViWkF3f", + "integrity": "sha384-I2y74+R42Gc5RVpmHixQe2Hei0u15YPV3oAE6vbyoO7gFe82VdfakUhrqog8Kwlc", "elements": [ "my-upg-100-list-map" ], @@ -903,7 +903,7 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -919,8 +919,8 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -936,8 +936,8 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/manifest.json b/public/dx-maps/manifest.json index af9fbbb31..94b4f7022 100644 --- a/public/dx-maps/manifest.json +++ b/public/dx-maps/manifest.json @@ -880,7 +880,7 @@ "bundle": "my-upg-100-list", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "output": "dx-maps/my-upg-100-list/my-upg-100-list.js", - "integrity": "sha384-+QpVXNn0/QCB8TGqtAHrUNtDtJjwiF/77N4vCZaqSiH7uo/Y63dOqDjLpViWkF3f", + "integrity": "sha384-I2y74+R42Gc5RVpmHixQe2Hei0u15YPV3oAE6vbyoO7gFe82VdfakUhrqog8Kwlc", "elements": [ "my-upg-100-list-map" ], @@ -903,7 +903,7 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -919,8 +919,8 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -936,8 +936,8 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/my-upg-100-list/my-upg-100-list.js b/public/dx-maps/my-upg-100-list/my-upg-100-list.js index 0f3170385..7d858f8aa 100644 --- a/public/dx-maps/my-upg-100-list/my-upg-100-list.js +++ b/public/dx-maps/my-upg-100-list/my-upg-100-list.js @@ -81,7 +81,7 @@ } `,"pin-hint"),(z,U)=>c.value?vs((Y(),se("div",{key:0,ref_key:"hintEl",ref:x,class:Ge(["pin-hint",{dark:s.value}]),role:"status"},[N("span",Y_,[U[0]||(U[0]=N("span",{class:"pin-hint-dot","aria-hidden":"true"},null,-1)),Rt(" "+pe(l.value)+" ",1),N("button",{class:"pin-hint-x",type:"button","aria-label":t("aria.dismissHint","Dismiss hint"),onClick:I},"×",8,Z_)])],2)),[[Ld,u.value&&p.value]]):Pe("",!0)}},X_=".lsn-bar[data-v-9a589f6f]{display:flex;align-items:flex-start;gap:8px;flex:none;margin:0;padding-block:8px;padding-inline:12px 8px;background:#fff8e1;border-block-end:1px solid #f0d68a;color:#4a3b00;font:400 13px/1.4 system-ui,-apple-system,Segoe UI,sans-serif}.lsn-bar__text[data-v-9a589f6f]{flex:1 1 auto;margin:0}.lsn-bar__x[data-v-9a589f6f]{flex:none;min-width:24px;min-height:24px;padding:0;border:0;border-radius:4px;background:transparent;color:inherit;font:600 18px/1 system-ui,sans-serif;cursor:pointer}.lsn-bar__x[data-v-9a589f6f]:focus-visible{outline:2px solid #1a73e8;outline-offset:2px}.lsn-block[data-v-9a589f6f]{display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:100%;height:100%;min-height:200px;padding:24px;background:#f7f7f5;color:#333;text-align:center;font:400 15px/1.5 system-ui,-apple-system,Segoe UI,sans-serif}.lsn-block__text[data-v-9a589f6f]{max-width:28em;margin:0}",qa=(e,t)=>{const o=e.__vccOpts||e;for(const[a,n]of t)o[a]=n;return o},Q_={key:0,class:"lsn-block",role:"status"},ey={class:"lsn-block__text"},ty={key:0},oy={key:1,class:"lsn-bar",role:"note"},ay={class:"lsn-bar__text"},ny=["aria-label","title"],$g=qa({__name:"LargerScreenNotice",props:{mode:{type:String,required:!0},label:{type:String,default:""},locale:{type:String,default:""}},emits:["dismiss"],setup(e){const t=e,o=(i,s)=>Aa(i,t.locale||void 0)||s,a=te(()=>o("messages.largerScreenNotice","This experimental map is built for larger screens. It opens here, but parts of it may not fit or work well on a phone.")),n=te(()=>o("messages.noticeDismiss","Dismiss")),r=te(()=>o("messages.desktopOnlyNotice","{label} only supports desktop — open this page on a desktop to use it.").split("{label}"));return(i,s)=>e.mode==="desktop-only"?(Y(),se("div",Q_,[N("p",ey,[Rt(pe(r.value[0]),1),r.value.length>1?(Y(),se("bdi",ty,pe(e.label),1)):Pe("",!0),Rt(pe(r.value[1]||""),1)])])):(Y(),se("div",oy,[N("p",ay,pe(a.value),1),N("button",{type:"button",class:"lsn-bar__x","aria-label":n.value,title:n.value,onClick:s[0]||(s[0]=l=>i.$emit("dismiss"))},"×",8,ny)]))}},[["styles",[X_]],["__scopeId","data-v-9a589f6f"]]),ry="(max-width: 639.98px)";function iy(e){for(let t=e;t;t=t.parentNode||t.host)if(t.nodeType===1&&t.hasAttribute("data-doxa-gallery"))return!0;return!1}function sy(e){var l;const t=te(()=>{var u;const c=(u=e.value)==null?void 0:u.mobile;return c==="desktop-only"||c==="larger-screens"?c:null});let o=null;try{o=ub()}catch{o=null}const a=o?iy(o):!1,n=$e(!1);if(typeof window<"u"&&typeof window.matchMedia=="function"){const c=window.matchMedia(ry);n.value=c.matches;const u=d=>{n.value=d.matches};(l=c.addEventListener)==null||l.call(c,"change",u),go(()=>{var d;return(d=c.removeEventListener)==null?void 0:d.call(c,"change",u)})}const r=te(()=>{var c;return`dx-maps:larger-screens-dismissed:${((c=e.value)==null?void 0:c.profile)||""}`}),i=$e(!1);st(r,c=>{try{i.value=sessionStorage.getItem(c)==="1"}catch{i.value=!1}},{immediate:!0});function s(){i.value=!0;try{sessionStorage.setItem(r.value,"1")}catch{}}return{flag:t,blocked:te(()=>t.value==="desktop-only"&&n.value&&!a),advise:te(()=>t.value==="larger-screens"&&n.value&&!a&&!i.value),dismiss:s,label:te(()=>{var c,u;return String(((c=e.value)==null?void 0:c.mobileLabel)||((u=e.value)==null?void 0:u.profile)||"")})}}const ly=!1;let cy=0;const uy=qs("ui",{state:()=>({_storeInstanceId:++cy,theme:"light",colorScheme:"default",reducedMotion:!1,highContrast:!1,activeTab:"doxa-regions",sidebarCollapsed:!1,mobileMenuOpen:!1,legendState:"collapsed",_customLegendHeight:null,searchMode:!1,hamburgerMenuOpen:!1,legendMode:"prayer",prayerFilter:null,engagementFilter:null,adoptionFilter:null,religionFilter:null,selectedPeopleGroup:null,breakpoint:"desktop",windowSize:{width:window.innerWidth,height:window.innerHeight},toasts:[],nextToastId:1,toastDuration:5e3,openModals:[],modalData:new Map,isGlobalLoading:!1,globalLoadingMessage:"Loading...",loadingStates:new Map,interactionHistory:[],maxHistoryLength:20,keyboardShortcutsEnabled:!0,screenReaderAnnouncement:"",focusTrapActive:!1,debugMode:!1,showPerformanceOverlay:!1}),getters:{isDarkTheme:e=>!1,isMobile:e=>e.breakpoint==="mobile",isTablet:e=>e.breakpoint==="tablet",isDesktop:e=>e.breakpoint==="desktop"||e.breakpoint==="wide",legendHeight:e=>e._customLegendHeight?e._customLegendHeight:e.legendState==="collapsed"?"48px":e.legendState==="open"?"30%":e.legendState==="fullyOpen"?"calc(100% - 80px)":"48px",caretRotation:e=>e.legendState==="collapsed"?0:90,showPullTab:e=>e.legendState==="open"||e.legendState==="fullyOpen",getToastsByType:e=>t=>e.toasts.filter(o=>o.type===t),hasOpenModal:e=>e.openModals.length>0,topModal:e=>e.openModals.length===0?null:e.openModals[e.openModals.length-1],isModalOpen:e=>t=>e.openModals.includes(t),isAnyLoading:e=>e.isGlobalLoading||e.loadingStates.size>0,isLoading:e=>t=>e.loadingStates.get(t)||!1},actions:{setTheme(e){if(!["light","dark","auto"].includes(e))return;e="light",this.theme=e;const o=this.isDarkTheme;document.documentElement.setAttribute("data-theme",o?"dark":"light");try{localStorage.setItem("theme",e)}catch{}},toggleTheme(){const e=this.theme==="light"?"dark":"light";this.setTheme(e)},setColorScheme(e){this.colorScheme=e,document.documentElement.setAttribute("data-color-scheme",e)},toggleReducedMotion(){this.reducedMotion=!this.reducedMotion,document.documentElement.setAttribute("data-reduced-motion",this.reducedMotion)},toggleHighContrast(){this.highContrast=!this.highContrast,document.documentElement.setAttribute("data-high-contrast",this.highContrast)},setActiveTab(e){this.activeTab=e,this.addToHistory({type:"tab-change",tabId:e,timestamp:Date.now()})},toggleSidebar(){this.sidebarCollapsed=!this.sidebarCollapsed},openMobileMenu(){this.mobileMenuOpen=!0},closeMobileMenu(){this.mobileMenuOpen=!1},setLegendMode(e){["prayer","detail"].includes(e)&&(this.legendMode=e)},setPrayerFilter(e){[null,"noPrayer","hasPrayer","fullPrayer"].includes(e)&&(this.prayerFilter=e)},setEngagementFilter(e){[null,"notEngaged","hasEngagement"].includes(e)&&(this.engagementFilter=e)},setAdoptionFilter(e){[null,"notAdopted","hasAdoption"].includes(e)&&(this.adoptionFilter=e)},setReligionFilter(e){[null,"C","M","H","B","E","J","S","N","O","U"].includes(e)&&(this.religionFilter=e)},selectPeopleGroup(e){const t=e&&!this.selectedPeopleGroup;this.selectedPeopleGroup=e,e?(t&&(this._legendStateBeforeDetail=this.legendState),this.legendState="open",this._customLegendHeight=null,this.setLegendMode("detail")):(this._legendStateBeforeDetail&&(this.legendState=this._legendStateBeforeDetail),this._legendStateBeforeDetail=null,this._customLegendHeight=null,this.setLegendMode("prayer"))},setLegendState(e){["collapsed","open","fullyOpen"].includes(e)&&(this.legendState=e)},toggleSearchMode(){this.searchMode=!this.searchMode},setSearchMode(e){this.searchMode=e},toggleHamburgerMenu(){this.hamburgerMenuOpen=!this.hamburgerMenuOpen},updateBreakpoint(e){let t;e<768?t="mobile":e<1024?t="tablet":e<1920?t="desktop":t="wide",t!==this.breakpoint&&(this.breakpoint=t)},updateWindowSize(e,t){this.windowSize.width=e,this.windowSize.height=t,this.updateBreakpoint(e)},showToast(e){const{message:t,type:o="info",duration:a=this.toastDuration,action:n=null,persistent:r=!1}=e,i={id:this.nextToastId++,message:t,type:o,duration:a,action:n,persistent:r,createdAt:Date.now()};return this.toasts.push(i),!r&&a>0&&setTimeout(()=>{this.removeToast(i.id)},a),i.id},showSuccess(e,t={}){return this.showToast({message:e,type:"success",...t})},showError(e,t={}){return this.showToast({message:e,type:"error",duration:7e3,...t})},showWarning(e,t={}){return this.showToast({message:e,type:"warning",...t})},showInfo(e,t={}){return this.showToast({message:e,type:"info",...t})},removeToast(e){const t=this.toasts.findIndex(o=>o.id===e);t!==-1&&this.toasts.splice(t,1)},clearAllToasts(){this.toasts=[]},openModal(e,t={}){this.openModals.includes(e)||(this.openModals.push(e),this.modalData.set(e,t),this.focusTrapActive=!0)},closeModal(e=null){if(e){const t=this.openModals.indexOf(e);t!==-1&&(this.openModals.splice(t,1),this.modalData.delete(e))}else{const t=this.openModals.pop();t&&this.modalData.delete(t)}this.openModals.length===0&&(this.focusTrapActive=!1)},closeAllModals(){this.openModals=[],this.modalData.clear(),this.focusTrapActive=!1},getModalData(e){return this.modalData.get(e)},showGlobalLoading(e="Loading..."){this.isGlobalLoading=!0,this.globalLoadingMessage=e},hideGlobalLoading(){this.isGlobalLoading=!1},setLoading(e,t=!0){t?this.loadingStates.set(e,!0):this.loadingStates.delete(e)},addToHistory(e){this.interactionHistory.push(e),this.interactionHistory.length>this.maxHistoryLength&&this.interactionHistory.shift()},clearHistory(){this.interactionHistory=[]},announce(e,t="polite"){this.screenReaderAnnouncement=e,setTimeout(()=>{this.screenReaderAnnouncement===e&&(this.screenReaderAnnouncement="")},1e3)},toggleKeyboardShortcuts(){this.keyboardShortcutsEnabled=!this.keyboardShortcutsEnabled},toggleDebugMode(){this.debugMode=!this.debugMode},togglePerformanceOverlay(){this.showPerformanceOverlay=!this.showPerformanceOverlay},toggleLegend(){this.legendState==="fullyOpen"?this.legendState="open":this.legendState==="open"?this.legendState="collapsed":this.legendState="open",this._customLegendHeight=null},openLegend(){this.legendState="open",this._customLegendHeight=null},fullyOpenLegend(){this.legendState="fullyOpen",this._customLegendHeight=null},collapseLegend(){this.legendState="collapsed",this._customLegendHeight=null},setLegendHeight(e){this._customLegendHeight=e},handleLegendItemClick(){this.legendState==="fullyOpen"&&(this.legendState="open")},enableSearchMode(){this.searchMode=!0},disableSearchMode(){this.searchMode=!1},toggleHamburgerMenu(){this.hamburgerMenuOpen=!this.hamburgerMenuOpen},openHamburgerMenu(){this.hamburgerMenuOpen=!0},closeHamburgerMenu(){this.hamburgerMenuOpen=!1},init(){let e=null;try{e=localStorage.getItem("theme")}catch{}e&&this.setTheme(e),new ResizeObserver(o=>{for(const a of o)this.updateWindowSize(a.contentRect.width,a.contentRect.height)}).observe(document.documentElement),window.matchMedia&&(window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",o=>{this.theme==="auto"&&document.documentElement.setAttribute("data-theme",o.matches?"dark":"light")}),window.matchMedia("(prefers-reduced-motion: reduce)").addEventListener("change",o=>{this.reducedMotion=o.matches,document.documentElement.setAttribute("data-reduced-motion",o.matches)}))}}}),dy=qs("map",{state:()=>({maps:{},activeMapId:null,selectedRegion:null,selectedFamily:null,selectedAffinityBlock:null,selectedLanguage:null,selectedDialect:null,activeLegendTab:"family",selectedResource:null,selectedPeopleGroup:null,selectedPinIds:[],globalFilters:{},searchQuery:"",autoFly:{isActive:!1,speed:1,interval:5e3,currentIndex:0,items:[],timerId:null},guidedTour:{isActive:!1,currentStep:0,steps:[]},showClusters:!1,clusterMode:"region",clusteringMode:"off",clusterPinOpacity:.6,clusterFilterProperty:null,clusterFilterValue:null,flySpeed:"normal",fullscreenMapId:null,preferences:{theme:"light",defaultMapStyle:"streets",enableAnimations:!0,autoSavePreferences:!0}}),getters:{getMapById:e=>t=>e.maps[t],activeMap:e=>e.activeMapId?e.maps[e.activeMapId]:null,hasMap:e=>t=>t in e.maps,allMapIds:e=>Object.keys(e.maps),hasSelection:e=>!!(e.selectedRegion||e.selectedFamily||e.selectedAffinityBlock||e.selectedPeopleGroup),isAutoFlying:e=>e.autoFly.isActive,isGuidedTourActive:e=>e.guidedTour.isActive,isMapFullscreen:e=>t=>e.fullscreenMapId===t},actions:{registerMap(e,t,o={}){let a=1.5;o.zoom!==void 0?a=o.zoom:t&&typeof t.getZoom=="function"&&(a=t.getZoom());let n=[0,0];if(o.center)n=o.center;else if(t&&typeof t.getCenter=="function"){const r=t.getCenter();r&&(n=[r.lng,r.lat])}this.maps[e]={instance:t,config:o,isReady:!1,zoom:a,center:n,registeredAt:Date.now()},this.activeMapId||(this.activeMapId=e)},setMapReady(e){const t=this.maps[e];t&&(t.isReady=!0)},updateMapState(e,t){const o=this.maps[e];o&&Object.assign(o,t)},unregisterMap(e){if(delete this.maps[e],this.activeMapId===e){const t=this.allMapIds;this.activeMapId=t.length>0?t[0]:null}},setActiveMap(e){e in this.maps&&(this.activeMapId=e)},selectRegion(e){this.selectedFamily=null,this.selectedAffinityBlock=null,this.selectedPeopleGroup=null,this.selectedRegion=e},selectFamily(e){this.selectedRegion=null,this.selectedAffinityBlock=null,this.selectedPeopleGroup=null,this.selectedLanguage=null,this.selectedDialect=null,this.selectedFamily=e},setActiveLegendTab(e){this.activeLegendTab=e},selectLanguage(e){this.selectedRegion=null,this.selectedAffinityBlock=null,this.selectedPeopleGroup=null,this.selectedFamily=null,this.selectedDialect=null,this.selectedLanguage=e},selectDialect(e){this.selectedRegion=null,this.selectedFamily=null,this.selectedLanguage=null,this.selectedAffinityBlock=null,this.selectedPeopleGroup=null,this.selectedDialect=e},selectAffinityBlock(e){this.selectedRegion=null,this.selectedFamily=null,this.selectedPeopleGroup=null,this.selectedAffinityBlock=e},selectPeopleGroup(e){this.selectedPeopleGroup=e},selectResource(e){this.selectedRegion=null,this.selectedFamily=null,this.selectedAffinityBlock=null,this.selectedPeopleGroup=null,this.selectedResource===e?this.selectedResource=null:this.selectedResource=e},clearSelections(){this.selectedRegion=null,this.selectedFamily=null,this.selectedLanguage=null,this.selectedDialect=null,this.selectedAffinityBlock=null,this.selectedResource=null,this.selectedPeopleGroup=null,this.selectedPinIds=[],this.showClusters=!1,this.clusterMode="region"},setSelectedPinIds(e){this.selectedPinIds=e||[]},setFilter(e,t){this.globalFilters[e]=t},removeFilter(e){delete this.globalFilters[e]},clearFilters(){this.globalFilters={},this.searchQuery=""},setSearchQuery(e){this.searchQuery=e},startAutoFly(e,t=1){this.stopAutoFly(),this.autoFly.isActive=!0,this.autoFly.speed=t,this.autoFly.items=e,this.autoFly.currentIndex=0},stopAutoFly(){this.autoFly.timerId&&(clearInterval(this.autoFly.timerId),this.autoFly.timerId=null),this.autoFly.isActive=!1,this.autoFly.currentIndex=0},setAutoFlySpeed(e){this.autoFly.speed=Math.max(.5,Math.min(2,e))},nextAutoFlyItem(){if(!this.autoFly.isActive||this.autoFly.items.length===0)return;this.autoFly.currentIndex=(this.autoFly.currentIndex+1)%this.autoFly.items.length;const e=this.autoFly.items[this.autoFly.currentIndex];e.type==="region"?this.selectRegion(e):e.type==="family"&&this.selectFamily(e)},toggleClusters(e){typeof e=="boolean"?this.showClusters=e:this.showClusters=!this.showClusters},setClusterMode(e){["region","language-family","affinity-block","mst","resource"].includes(e)&&(this.clusterMode=e)},setClusteringMode(e){["off","mapbox","mst","network"].includes(e)&&(this.clusteringMode=e,this.showClusters=e!=="off")},setClusterFilter(e,t){this.clusterFilterProperty=e||null,this.clusterFilterValue=t||null},clearClusterFilter(){this.clusterFilterProperty=null,this.clusterFilterValue=null},setFlySpeed(e){["slow","normal","fast"].includes(e)&&(this.flySpeed=e)},setSelectedFamily(e){this.selectFamily(e)},clearSelectedFamily(){this.selectFamily(null)},setSelectedRegion(e){this.selectRegion(e)},clearSelectedRegion(){this.selectRegion(null)},clearSelectedResource(){this.selectResource(null)},clearSelectedLanguage(){this.selectLanguage(null)},clearSelectedDialect(){this.selectDialect(null)},toggleFullscreen(e){this.fullscreenMapId===e?this.fullscreenMapId=null:this.fullscreenMapId=e},loadPreferences(){try{const e=localStorage.getItem("mapUserPreferences");if(e){const t=JSON.parse(e);this.preferences={...this.preferences,...t}}}catch(e){console.error("[mapStore] Failed to load preferences:",e)}},savePreferences(){try{localStorage.setItem("mapUserPreferences",JSON.stringify(this.preferences))}catch(e){console.error("[mapStore] Failed to save preferences:",e)}},setPreference(e,t){this.preferences[e]=t,this.preferences.autoSavePreferences&&this.savePreferences()}}}),py=qs("data",{state:()=>({sources:{},loadingStates:{}}),actions:{async load(e,t){if(!this.sources[e]){this.loadingStates[e]={isLoading:!0,error:null};try{const o=await t();this.sources[e]=Oa({features:o,timestamp:Date.now()}),this.loadingStates[e]={isLoading:!1,error:null}}catch(o){console.error(`[dataStore] Failed to load source "${e}":`,o),this.loadingStates[e]={isLoading:!1,error:o}}}},clearSource(e){delete this.sources[e],delete this.loadingStates[e]},cacheSourceData(e,t){this.sources[e]=Oa({features:t.normalizedData||[],timestamp:t.timestamp||Date.now()})},hasSourceData(e){return!!this.sources[e]},getSourceData(e){return this.sources[e]?{normalizedData:this.sources[e].features}:null}},getters:{getData:e=>t=>{var o;return((o=e.sources[t])==null?void 0:o.features)??null},isLoading:e=>t=>{var o;return((o=e.loadingStates[t])==null?void 0:o.isLoading)??!1},getError:e=>t=>{var o;return((o=e.loadingStates[t])==null?void 0:o.error)??null}}}),hr={_meta:{_comment:"Single source of truth for data-source connections across all doxa-maps bundles.",_comment_token:"Mapbox access token is fetched at runtime from window.MAP_TOKEN_URL (same modular pattern as window.MAP_APP_API_URL). Not hardcoded to any host — set mapboxTokenUrl below or override window.MAP_TOKEN_URL on the host page.",mapboxTokenUrl:"window.MAP_TOKEN_URL"},activeSource:"pray-tools",sources:{"pray-tools":{id:"pray-tools",name:"Prayer.Tools API",type:"rest-api",description:"pray.doxa.life live API — people-group prayer, engagement, and adoption data. Base URL read from window.MAP_APP_API_URL or VITE_API_BASE_URL at runtime.",endpoints:{bulk:"/api/people-groups/list",detail:"/api/people-groups/detail/{slug}",statistics:"/api/people-groups/statistics"},queryParams:{lang:"en"},defaultFields:["slug","name","latitude","longitude","wagf_region","wagf_block","wagf_member","rop1","imb_reg_of_people_2","imb_reg_of_people_25","imb_reg_of_people_3","country_code","religion","population","has_photo","image_url","people_praying","people_committed","adopted_by_churches","engagement_status","imb_gsec","primary_language","imb_language_family","imb_language_class","imb_language_speakers"],pollFields:["slug","people_praying"],pollInterval:3e5,fallbackSourceId:null,fieldMappings:{uniqueId:"slug",slug:"slug",name:"name",latitude:"latitude",longitude:"longitude",wagfRegion:"wagf_region",doxaRegion:"wagf_region",wagfBlock:"wagf_block",wagfMember:"wagf_member",affinityBlock:"rop1",countryIso:"country_code",religion:"religion",religionCode:"religion",population:"population",hasPhoto:"has_photo",imageUrl:"image_url",photoUrl:"image_url",peoplePraying:"people_praying",peopleCommitted:"people_committed",engagementStatus:"engagement_status",adoptionStatus:"adopted_by_churches",language:"primary_language",cluster:"imb_reg_of_people_2",peopleGroup:"imb_reg_of_people_25",peopleGroupCountry:"imb_reg_of_people_3",languageFamily:"imb_language_family",languageClass:"imb_language_class",languageSpeakers:"imb_language_speakers"},imageConfig:{useField:"imageUrl",fallbackField:null,fallbackUrlTemplate:null,placeholderUrl:"https://www.peoplegroups.org/images/pgphotosearch/NoImageAvailable_search.jpg",useSvgPlaceholder:!0}},"doxa-csv":{id:"doxa-csv",name:"DOXA People Groups CSV",type:"csv",path:"assets/data/Joshua-project-ids-Doxa-1439.csv",description:"People groups dataset from DOXA / Joshua Project",fieldMappings:{uniqueId:"ROP3",peopleGroupId:"ROP3",countryCode:"ROG",peopleId3:"PeopleID3",name:"Name",displayName:"NmDisp",alternateName:"NmAlt",description:"PeopleDesc",locationDescription:"LocationDe",country:"Ctry",countryIso:"ISOalpha3",region:"Regn",subRegion:"RegnSub",wagfRegion:"WAGF Region",doxaRegion:"WAGF Region",wagfBlock:"WAGF BLOCK",affinityBloc:"Affbloc",affinityBlock:"ROP1",affinityCode:"AffCd",affinityName:"Aff",peopleCluster:"PplClstr",ethneName:"Ethne",latitude:"Latitude",longitude:"Longitude",population:"Pop",populationClass:"PopCls",status:"Status",engagementStatus:"EngStat",evangelicalLevel:"EvngLvl",gsec:"GSEC",gsecBrief:"GSECbrf",gsecLong:"GSEClng",spiScore:"SPI",spiDescription:"SPIdesc",language:"Lang",languageCode:"ROL",languageFamily:"LangFamily",religion:"Rlgn",religionCode:"ROR",religionDescription:"RORdesc",religionBase:"RlgnBs",religionDiv:"RlgnDiv",bible:"Bible",jesusFilm:"Jesus",radio:"Radio",gospel:"Gospel",audio:"Audio",stories:"Stories",resourcesTotal:"ResTot",bibleLevel:"LvlBible",yearPublished:"YrPub",photoCredit:"PicCrdt",photoUrl:"PicURL",hasPhoto:"Photo",isIndigenous:"Indigenous"},imageConfig:{useField:"photoUrl",fallbackField:"peopleId3",fallbackUrlTemplate:"https://joshuaproject.net/assets/media/profiles/photos/p{peopleId3}.jpg",placeholderUrl:"https://www.peoplegroups.org/images/pgphotosearch/NoImageAvailable_search.jpg"}}},systemFields:{uniqueId:{description:"Unique identifier per row (slug for API, ROP3+ROG for CSV)",required:!0},peopleGroupId:{description:"People group ID — same group can appear in multiple countries",required:!0},name:{description:"People group display name",required:!0},latitude:{description:"Latitude coordinate for map pin",required:!0},longitude:{description:"Longitude coordinate for map pin",required:!0},engagementStatus:{description:"Boolean — true if engaged_status = 'engaged'",required:!1},adoptionStatus:{description:"Boolean — true if adopted_by_churches > 0",required:!1},peoplePraying:{description:"Number of people currently praying for this group — from pray-tools API",required:!1},peopleCommitted:{description:"Raw count of committed workers for this group — source of engagementStatus",required:!1},languageFamily:{description:"Language family name",required:!1},religion:{description:"Primary religion",required:!1},population:{description:"Population count",required:!1},doxaRegion:{description:"WAGF/DOXA region name",required:!1},photoUrl:{description:"URL to people group photo",required:!1},description:{description:"People group description text",required:!1}}},gy=".profile-loader[data-locale-pending][data-v-ceea9a56] .stl-tabs,.profile-loader[data-locale-pending][data-v-ceea9a56] .stl-title,.profile-loader[data-locale-pending][data-v-ceea9a56] .stl-rows,.profile-loader[data-locale-pending][data-v-ceea9a56] .legend-title,.profile-loader[data-locale-pending][data-v-ceea9a56] .legend-content,.profile-loader[data-locale-pending][data-v-ceea9a56] .legend-reopen-label,.profile-loader[data-locale-pending][data-v-ceea9a56] .lt-btn-text,.profile-loader[data-locale-pending][data-v-ceea9a56] .rd-topbar,.profile-loader[data-locale-pending][data-v-ceea9a56] .rd-exportbar{visibility:hidden}.profile-loader[data-v-ceea9a56]{border-radius:var(--map-radius-corners, var(--map-radius, 0px));width:100%;height:100%;min-height:var(--profile-min-h, 100dvh);position:relative}.profile-loader.has-screen-notice[data-v-ceea9a56]{display:flex;flex-direction:column}.profile-loader.has-screen-notice[data-v-ceea9a56]>:not(.lsn-bar){flex:1 1 auto;min-height:0;position:relative!important;inset:auto!important}.profile-error[data-v-ceea9a56]{padding:1rem;background:#fff3cd;border:1px solid #ffc107;border-radius:4px;font-family:monospace;font-size:13px}",hy=["dir","data-locale-pending"],fy={key:0,class:"profile-error"},my={key:1,class:"profile-error"},by=qa({__name:"ProfileLoader",props:{profileConfig:{type:String,default:""}},setup(e){var I;const o=e,a=Ye("profileConfig",null),n=te(()=>{var le;if(!o.profileConfig)return null;let P;try{P=JSON.parse(o.profileConfig)}catch{return console.error("[ProfileLoader] Invalid profile-config JSON:",o.profileConfig),null}if(P&&P.assetsBase===void 0){const X=(le=a==null?void 0:a.value)==null?void 0:le.assetsBase;typeof X=="string"&&X&&(P.assetsBase=X)}return P}),r=Ye("profileModules",null);if(!r)throw new Error('[ProfileLoader] No profileModules provided. Bundle entry must `app.provide("profileModules", import.meta.glob("./*.vue"))`');const i=(()=>{const P=Object.keys(r||{});if(P.length!==1)return null;const le=P[0].match(/^\.\/(.+)\.vue$/);return le?le[1]:null})(),s=te(()=>{var P;return((P=n.value)==null?void 0:P.profile)||i||null}),l=Lb(),c=te(()=>{var le;const P=(le=n.value)==null?void 0:le.tk;return typeof P=="string"&&P?P:l.value||""});st(()=>{var P;return(P=n.value)==null?void 0:P.tk},P=>{typeof P=="string"&&P&&Js(P)},{immediate:!0}),st(()=>{var P;return(P=n.value)==null?void 0:P.tokenUrl},P=>{var le;P&&!((le=n.value)!=null&&le.tk)&&!l.value&&Cb(P)},{immediate:!0});const u=te(()=>{var P;return((P=n.value)==null?void 0:P.dataSource)||hr.activeSource}),d=te(()=>{var P;return((P=n.value)==null?void 0:P.colorSet)||"default"}),p=te(()=>!1),y=te(()=>{var P;return((P=n.value)==null?void 0:P.pinHint)!==!1}),v=te(()=>{var le,X;const P=(((le=n.value)==null?void 0:le.locale)||((X=n.value)==null?void 0:X.lang)||dg()||"").split("-")[0].toLowerCase();return ur.includes(P)?P:""}),$=Ye("appI18n",null);Mu(()=>{v.value&&($&&($.global.locale.value=v.value),gg(v.value),$l($,v.value).catch(()=>{}))});const m=te(()=>{var P,le;return v.value||((le=(P=$==null?void 0:$.global)==null?void 0:P.locale)==null?void 0:le.value)||"en"}),_=te(()=>Li.has(m.value)?"rtl":"ltr"),{blocked:x,advise:w,dismiss:g,label:b}=sy(n),k=$e(!1);Mu(P=>{const le=m.value;if(!Li.has(le)){k.value=!1;return}let X=!0;P(()=>{X=!1}),k.value=!0,z_(le).finally(()=>{X&&(k.value=!1)})});const L=te(()=>{var P;return((P=n.value)==null?void 0:P.instanceId)||"doxa-map-"+Math.random().toString(36).slice(2,9)}),S=te(()=>{if(!s.value)return null;const P=`./${s.value}.vue`;return r[P]?bg(r[P]):(console.error(`[ProfileLoader] Profile not found: "${s.value}". Available:`,Object.keys(r)),null)});Xt("mapboxToken",c),Xt("dataSource",u),Xt("colorSet",d),Xt("profileConfig",n),Xt("instanceId",L),Xt("lang",m);const C=uy(),Z=dy(),J=py();try{const P=typeof localStorage<"u"?localStorage.getItem("theme"):null;P&&((I=C.setTheme)==null||I.call(C,P))}catch{}return Xt("uiStore",C),Xt("mapStore",Z),Xt("dataStore",J),(P,le)=>(Y(),se("div",{class:Ge(["profile-loader",{"has-screen-notice":de(w)}]),dir:_.value,"data-locale-pending":k.value?"":null},[n.value?S.value?de(x)?(Y(),mt($g,{key:2,mode:"desktop-only",label:de(b),locale:m.value},null,8,["label","locale"])):(Y(),se(Ke,{key:3},[de(w)?(Y(),mt($g,{key:0,mode:"larger-screens",locale:m.value,onDismiss:de(g)},null,8,["locale","onDismiss"])):Pe("",!0),(Y(),mt(Ls(S.value)))],64)):(Y(),se("div",my,[N("p",null,[le[1]||(le[1]=Rt("⚠️ Profile ",-1)),N("strong",null,'"'+pe(s.value)+'"',1),le[2]||(le[2]=Rt(" not found.",-1))])])):(Y(),se("div",fy,[...le[0]||(le[0]=[N("p",null,[Rt("⚠️ "),N("strong",null,"doxa-map"),Rt(": missing or invalid "),N("code",null,"profile-config"),Rt(" prop.")],-1),N("p",null,[Rt("Example: "),N("code",null,`profile-config='{"profile":"example-map","tk":"pk.eyJ..."}'`)],-1)])])),S.value&&p.value?(Y(),mt(Ls(de(null)),{key:4})):Pe("",!0),S.value&&y.value?(Y(),mt(J_,{key:5})):Pe("",!0)],10,hy))}},[["styles",[gy]],["__scopeId","data-v-ceea9a56"]]);function _g(e,t,o){var n;const a=(n=e==null?void 0:e._context)==null?void 0:n.provides;if(a&&t in a){a[t]=o;return}e.provide(t,o)}function $y(e,t){var n;const o=(n=e==null?void 0:e._context)==null?void 0:n.provides,a=o?Object.getPrototypeOf(o):null;a&&Object.setPrototypeOf(o,null);try{return t()}finally{a&&Object.setPrototypeOf(o,a)}}function _y({profileModules:e={},configureApp:t=null}={}){return lb(by,{configureApp(o){const a=yb();$y(o,()=>o.use(a));const n=G_();o.use(n),_g(o,"appI18n",n),_g(o,"profileModules",e),t&&t(o,{pinia:a,i18n:n})}})}const yy=Object.assign({"./poster-wall.vue":()=>ft(()=>Promise.resolve().then(()=>Y1),void 0),"./upg-100-list.vue":()=>ft(()=>Promise.resolve().then(()=>ZP),void 0),"./upg-100-mfe.vue":()=>ft(()=>Promise.resolve().then(()=>LS),void 0)});function vy(){return _y({profileModules:yy,configureApp:(e,{pinia:t,i18n:o})=>{}})}const ky=vy();typeof customElements<"u"&&(customElements.get("my-upg-100-list-map")||customElements.define("my-upg-100-list-map",ky));const vl={default:"doxa",lists:[{id:"doxa",aliases:["2000","project-2000"],label:"Project 2000: DOXA's people groups",definition:"The people groups DOXA serves, as its live list gives them",source:"doxa",filter:null},{id:"unreached",aliases:["7000","project-7000"],label:"Project 7000: unreached people groups",definition:"IMB Lostness Priority 0-2 (Frontier, Pioneer or Expanding Unreached: under 2% evangelical)",source:"imb",filter:{lostness:[0,1,2]}},{id:"frontier",aliases:["4700","project-4700"],label:"Project 4700: frontier people groups",definition:"IMB Lostness Priority 0 (Frontier Unreached: 0.1% evangelical or less)",source:"imb",filter:{lostness:[0]}},{id:"frontier-500k",aliases:["700","project-700"],label:"Project 700: frontier people groups of 500,000 or more",definition:"IMB Lostness Priority 0 and Population of at least 500,000",source:"imb",filter:{lostness:[0],minPopulation:5e5}},{id:"unengaged",aliases:[],label:"Unengaged unreached people groups",definition:"IMB Lostness Priority 0-2 and Engagement Status Unengaged",source:"imb",filter:{lostness:[0,1,2],engagement:["Unengaged"]}}]},wy=on&&on.tagName.toUpperCase()==="SCRIPT"&&on.src||new URL("my-upg-100-list.js",document.baseURI).href,La=e=>String(e||"").trim().replace(/\/+$/,"");function kl(){try{const t=String(wy||"").split(/[?#]/)[0].match(/^(.*)\/([^/]+)\/([^/]+)\.js$/);return!t||t[2]!==t[3]?null:t[1]||null}catch{return null}}function xy(e){const t=e==null?void 0:e.embedBaseUrl;if(typeof t=="string"&&t.trim())return La(t);if(typeof window<"u"){const o=window.MAP_EMBED_BASE_URL;if(typeof o=="string"&&o.trim())return La(o)}return La(kl()||"")}function ua(e){const t=e==null?void 0:e.assetsBase;if(typeof t=="string"&&t.trim()){const a=La(t);if(/^https?:\/\//i.test(a)||a.startsWith("/"))return a}const o=La((e==null?void 0:e.treeBase)||"")||La(kl()||"");if(o)try{const a=typeof document<"u"?document.baseURI:void 0;return La(new URL(o+"/assets",a).href)}catch{return La(o+"/assets")}return"./assets"}function Py({shareUrl:e,embedPath:t,profileConfig:o}={}){const a=o||null,n=typeof window<"u",r=e||(a==null?void 0:a.shareUrl);if(typeof r=="string"&&r.trim())return r.trim();const i=String(t||(a==null?void 0:a.shareEmbedPath)||"").trim();if(i){if(/^https?:\/\//i.test(i))return i;if(i.startsWith("/"))return n?window.location.origin+i:i;const s=xy(a),l=i.replace(/^\.\//,"");if(s)return s+"/"+l;if(typeof document<"u")try{return new URL(l,document.baseURI).href}catch{}return l}return n?window.location.origin+window.location.pathname:""}const fr=vl.default,wl=new Map;for(const e of vl.lists){wl.set(e.id,e);for(const t of e.aliases||[])wl.set(String(t).toLowerCase(),e)}function yg(e){return wl.get(String(e??"").toLowerCase().trim())||null}function vg(e){let t=e;if(t&&typeof t=="object"&&"value"in t&&!("list"in t)&&!("profile"in t)&&(t=t.value),typeof t=="string")try{t=JSON.parse(t)}catch{t=null}return t&&typeof t=="object"?t:null}const kg=new Set;function vn(e){const t=vg(e),o=t==null?void 0:t.list,a=typeof location<"u"?new URLSearchParams(location.search).get("list"):null,n=typeof window<"u"?window.MAP_LIST:void 0,r=o||a||n||fr,i=yg(r);return i?i.id:(kg.has(r)||(kg.add(r),console.warn(`[list] unknown people-group list "${r}", showing "${fr}". Known: ${vl.lists.map(s=>s.id).join(", ")}`)),fr)}const Ti=new Map;function Sy(e,t){const o=`${ua(vg(t))}/people-groups/lists/${e}.json`;return Ti.has(o)||Ti.set(o,mi(o).then(a=>{if(!a.ok)throw new Error(`HTTP ${a.status}`);return a.json()}).then(a=>new Set(Array.isArray(a==null?void 0:a.slugs)?a.slugs:[])).catch(a=>{throw Ti.delete(o),new Error(`list "${e}" membership ${o}: ${a.message}`)})),Ti.get(o)}async function Ei(e,t,{key:o=a=>a==null?void 0:a.slug}={}){const a=vn(t);if(a===fr||!Array.isArray(e))return e;try{const n=await Sy(a,t);return e.filter(r=>n.has(o(r)))}catch(n){return console.error(`[list] ${n.message}. Showing no people groups rather than the wrong list.`),[]}}const Ay='class="stage"';async function Ly(e){const t=new Uint8Array(await e.slice(0,12).arrayBuffer()),o=(a,n)=>String.fromCharCode(...t.slice(a,n));return o(0,4)==="RIFF"&&o(8,12)==="WEBP"||t[0]===137&&o(1,4)==="PNG"||t[0]===255&&t[1]===216&&t[2]===255}async function wg(e,t=fetch){let o;try{o=await t(e)}catch{return null}if(!o||!o.ok)return null;const a=(o.headers.get("content-type")||"").toLowerCase();if(a.startsWith("text/"))return null;const n=await o.blob();return a.startsWith("image/")||await Ly(n)?n:null}async function xg(e,t=fetch){const o=await t(e);if(!o.ok)return{html:null,status:o.status};const a=await o.text();return a.includes(Ay)?{html:a,status:o.status}:{html:null,status:404}}function kn(e,{autoprint:t=!1}={}){const o=document.createElement("iframe");o.setAttribute("aria-hidden","true"),o.style.cssText="position:fixed;right:0;bottom:0;width:1px;height:1px;opacity:0;border:0",document.body.appendChild(o);const a=o.contentDocument;if(!a)return o.remove(),null;a.open(),a.write(e),t&&a.write(' - + - + - +