1export class StoreSelector extends window.BAO.CustomElement(){testMode=!1;connectedCallback(){if(super.connectedCallback(),this.storedCountry&&document.body.setAttribute("data-country",this.storedCountry),window.location.href.indexOf("#geo")>-1)return this.forceRedirect();if(this.testMode){this.setupCountrySwitcherModal("ES");return}this.runLocationFlow()}forceRedirect(){this.detectCountry().then(userCountry=>{userCountry&&this.switchTo(userCountry)})}setupListeners(){super.setupListeners(),this.onDocumentClick=this.onDocumentClick.bind(this),this.onSearchInput=this.onSearchInput.bind(this),this.onConfirmClick=this.onConfirmClick.bind(this),this.onCloseClick=this.onCloseClick.bind(this),this.onLanguageChange=this.onLanguageChange.bind(this),this.listeners.add(document,"click",this.onDocumentClick),this.els?.search?.exists&&this.els.search.elements.forEach(searchEl=>{this.listeners.add(searchEl,"input",this.onSearchInput)}),this.els?.confirm.exists&&this.els.confirm.elements.forEach(confirmEl=>{this.listeners.add(confirmEl,"click",this.onConfirmClick)}),this.els?.close?.exists&&this.els.close.elements.forEach(closeEL=>{this.listeners.add(closeEL,"click",this.onCloseClick)}),this.els?.language?.exists&&this.els.language.elements.forEach(languageEl=>{this.listeners.add(languageEl,"change",this.onLanguageChange)})}onDocumentClick(event){event.target.closest('[data-store-selector-external-el="trigger"]')&&(event.preventDefault(),this.setupCountrySwitcherModal(this.storedCountry||this.currentCountry,{forceOpen:!0}))}onSearchInput(event){this.filterList(event.currentTarget.value)}onConfirmClick(event){event.preventDefault();const code=event.currentTarget.dataset.code;if(!code)return;this.switchTo(code,this.selectedLocale())==="noop"&&this.closeDrawer()}onCloseClick(event){event.preventDefault(),this.setStoredCountry(this.currentCountry),this.closeDrawer()}closeDrawer(){this.dismissGeo(),this.contains(document.activeElement)&&document.activeElement.blur(),this.setAttribute("aria-hidden","true"),document.body.classList.remove("util-StoreSelectorOpen"),!document.body.classList.contains("util-DrawersOpen")&&document.body.classList.remove("util-SiteOverflowed")}onLanguageChange(event){const locale=event.currentTarget.value,input=event.currentTarget.form?.querySelector('input[name="locale_code"]');input&&(input.value=locale),this.setConfirmEnabled(!0)}setupCountrySwitcherModal(countryCode,options={}){const code=(countryCode||"").toUpperCase();if(!options.forceOpen&&this.ensureMarketCountry(code))return;const selected=options.forceOpen&&this.currentCountry?this.currentCountry:code||this.currentCountry;this.buildList(selected),this.setAttribute("aria-hidden","false"),document.body.classList.add("util-SiteOverflowed","util-StoreSelectorOpen"),this.releaseSearchFocus()}sortedCountries(){return Object.entries(this.countries).sort(([,a],[,b])=>a.name.localeCompare(b.name))}countriesWithSavedFirst(countries){const saved=(this.savedCountry||"").toUpperCase();if(!saved||!countries.length)return countries;const savedIndex=countries.findIndex(([code])=>code.toUpperCase()===saved);if(savedIndex<=0)return countries;const ordered=countries.slice(),[savedEntry]=ordered.splice(savedIndex,1);return ordered.unshift(savedEntry),ordered}buildList(selectedCode){const code=(selectedCode||"").toUpperCase();this.savedCountry=code,this.currentSelection=code,this.allCountries=this.sortedCountries(),this.renderList(this.allCountries),this.setConfirmFor(this.currentSelection),this.syncLanguageSelect(this.currentSelection),this.setConfirmEnabled(!1),this.els?.search?.exists&&this.els.search.elements.forEach(searchEl=>{searchEl.value=""})}filterList(query){const term=(query||"").trim().toLowerCase();if(!term){this.renderList(this.allCountries);return}const filtered=this.allCountries.filter(([,value])=>value.name.toLowerCase().includes(term)||value.alternateNames?.length&&value.alternateNames.some(name=>name.toLowerCase().includes(term)));this.renderList(filtered)}renderList(countries){if(!this.els?.list?.exists)return;const listEl=this.els.list.element;listEl.innerHTML=this.countriesWithSavedFirst(countries).map(([code,value])=>this.createItemElement(code,value)).join(""),listEl.querySelectorAll('[data-store-selector-el="item"]').forEach(itemEl=>{itemEl.addEventListener("click",()=>this.selectItem(itemEl.dataset.code))})}createItemElement(code,value){const{name,site,currency}=value,host=this.hostFor(site),isSelected=code.toUpperCase()===this.currentSelection,label=currency?`${name} - ${currency}`:name;return`<button 2 type="button" 3 class="sec-StoreSelector_Item" 4 data-store-selector-el="item" 5 data-code="${code}" 6 data-site="${site}" 7 data-host="${host}" 8 aria-pressed="${isSelected}" 9 >
10 <span class="sec-StoreSelector_ItemFlag" aria-hidden="true">${this.flagEmoji(code)}</span> 11 <span class="sec-StoreSelector_ItemName fz-15_21">${label}</span> 12 <svg class="sec-StoreSelector_ItemCheck" viewBox="0 0 12 9" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> 13 <path d="M1 4.3 4.3 7.6 11 1" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/> 14 </svg> 15 </button>`}flagEmoji(code){if(!code||code.length!==2)return"";const codePoints=code.toUpperCase().split("").map(char=>127397+char.charCodeAt(0));return String.fromCodePoint(...codePoints)}selectItem(code){this.currentSelection=(code||"").toUpperCase(),this.setConfirmFor(this.currentSelection),this.syncLanguageSelect(this.currentSelection,{ignoreOverride:this.currentSelection!==this.currentCountry}),this.setConfirmEnabled(!0),this.els?.list?.exists&&this.els.list.element.querySelectorAll('[data-store-selector-el="item"]').forEach(itemEl=>{const isSelected=itemEl.dataset.code.toUpperCase()===this.currentSelection;itemEl.setAttribute("aria-pressed",isSelected?"true":"false")})}setConfirmFor(code){const entry=this.countries[code];if(!entry)return;const host=this.hostFor(entry.site);this.els?.confirm?.exists&&this.els.confirm.elements.forEach(confirmEl=>{confirmEl.dataset.code=code,confirmEl.dataset.host=host})}setConfirmEnabled(enabled){this.els?.confirm?.exists&&this.els.confirm.elements.forEach(confirmEl=>{confirmEl.disabled=!enabled})}selectedLocale(){return this.els?.language?.exists&&(this.els.language.element||this.els.language.elements[0])?.value||null}releaseSearchFocus(){const title=this.querySelector(".sec-StoreSelector_Title");if(title&&title.focus({preventScroll:!0}),!this.els?.search?.exists)return;const blurSearch=()=>{this.els.search.elements.forEach(searchEl=>{document.activeElement===searchEl&&searchEl.blur()})};blurSearch(),window.requestAnimationFrame(blurSearch)}get countries(){return window.theme&&window.theme.countries||{}}get storeHosts(){return window.theme&&window.theme.storeHosts||{}}get currentHost(){return window.location.hostname}get storedCountry(){const value=window.localStorage.getItem(this.countryKey);return value?value.toUpperCase():null}get isGeoDismissed(){return window.sessionStorage.getItem(this.geoDismissedKey)==="true"}get countryKey(){return"BAO-location-sunspel"}get choiceKey(){return"BAO-store-sunspel"}get geoDismissedKey(){return"BAO-geo-dismissed-sunspel"}get marketApplyKey(){return"BAO-market-apply-sunspel"}get localeOverrideKey(){return"BAO-locale-override-sunspel"}get localeApplyKey(){return"BAO-locale-apply-sunspel"}get currentLocale(){return(this.dataset.locale||"").toLowerCase()}hostFor(site){const key=(site||"UK").toUpperCase();return this.storeHosts[key]||this.storeHosts.UK||this.currentHost}hasEuPathPrefix(){return/^\/eu(\/|$)/i.test(window.location.pathname)}pathWithoutLocalePrefix(){const root=(window.Shopify?.routes?.root||"/").replace(/\/$/,""),path=window.location.pathname;return root&&(path===root||path.startsWith(`${root}/`))?path.slice(root.length)||"/":path}pathWithoutEuPrefix(){const stripped=this.pathWithoutLocalePrefix().replace(/^\/eu(?=\/|$)/i,"");return stripped===""?"/":stripped}pathForLocale(locale,countryCode){let path=this.pathWithoutEuPrefix();if(!locale)return path;const hasEnglishPrefix=/^\/en(\/|$)/i.test(path),isEnglishOverride=locale&&this.localeMatches(locale,"en")&&this.hasEnglishOverride(countryCode||this.currentSelection||this.currentCountry);return isEnglishOverride&&!hasEnglishPrefix?path==="/"?"/en":`/en${path}`:!isEnglishOverride&&hasEnglishPrefix?(path=path.replace(/^\/en(?=\/|$)/i,""),path===""?"/":path):path}returnToForLocale(locale,countryCode){const path=this.pathForLocale(locale,countryCode),previewId=this.previewThemeId();if(!previewId)return path;const separator=path.includes("?")?"&":"?";return`${path}${separator}preview_theme_id=${encodeURIComponent(previewId)}`}redirectHostFor(countryCode){const code=(countryCode||"").toUpperCase(),site=(this.countries[code]?.site||"").toUpperCase();if(site==="US"||site==="JP")return this.hostFor(site);if(!this.isOnSite("UK")){if(code==="FR"||site==="FR")return this.hostFor("FR");if(code==="DE"||site==="DE")return this.hostFor("DE")}return this.isSharedMarketsHost()||this.isPreviewTheme()||site==="UK"||site==="EU"||site===""?this.currentHost:this.hostFor(site)}isPreviewTheme(){const role=window.Shopify?.theme?.role;return!!this.getParam("preview_theme_id")||role==="development"||role==="unpublished"}previewThemeId(){return this.getParam("preview_theme_id")||(this.isPreviewTheme()?window.Shopify?.theme?.id:null)}isSharedMarketsHost(){const host=(this.currentHost||"").toLowerCase();return host.includes("sunspel-us")||host==="us.sunspel.com"||host.includes("sunspel-jp")||host==="www.sunspel.jp"||host==="sunspel.jp"?!1:host.includes("myshopify.com")}currentSite(){const shop=(window.Shopify?.shop||"").toLowerCase();if(shop.includes("sunspel-us"))return"US";if(shop.includes("sunspel-jp"))return"JP";const host=(this.currentHost||"").toLowerCase();return this.isSharedMarketsHost()?null:host.includes("sunspel-us")||host==="us.sunspel.com"?"US":host.includes("sunspel-jp")||host==="www.sunspel.jp"||host==="sunspel.jp"?"JP":host==="sunspel.fr"||host==="www.sunspel.fr"?"FR":host==="sunspel.de"||host==="www.sunspel.de"?"DE":host==="eu.sunspel.com"||host==="www.eu.sunspel.com"||this.hasEuPathPrefix()&&(host==="www.sunspel.com"||host==="sunspel.com")?"EU":"UK"}isOnSite(site){const key=(site||"UK").toUpperCase();if(key==="US"||key==="JP")return this.currentSite()===key;if(this.isSharedMarketsHost())return!0;const current=this.currentSite();
15return current==="US"||current==="JP"?!1:key==="UK"||key==="FR"||key==="DE"||key==="EU"?current==="UK"||current==="FR"||current==="DE"||current==="EU"||current===null:current===key}setStoredCountry(code){if(!code)return;const upper=code.toUpperCase();window.localStorage.setItem(this.countryKey,upper),window.localStorage.setItem(this.choiceKey,"true"),document.body.setAttribute("data-country",upper)}markMarketApplyAttempted(code){code&&window.sessionStorage.setItem(this.marketApplyKey,`${this.currentHost}:${code.toUpperCase()}`)}hasMarketApplyAttempted(code){return code?window.sessionStorage.getItem(this.marketApplyKey)===`${this.currentHost}:${code.toUpperCase()}`:!1}markLocaleApplyAttempted(locale){locale&&window.sessionStorage.setItem(this.localeApplyKey,`${this.currentHost}:${locale.toLowerCase()}`)}hasLocaleApplyAttempted(locale){return locale?window.sessionStorage.getItem(this.localeApplyKey)===`${this.currentHost}:${locale.toLowerCase()}`:!1}hasEnglishOverride(countryCode){const code=(countryCode||"").toUpperCase();return this.localeMatches(this.getLocaleOverrides()[code],"en")}defaultLocaleFor(countryCode){const code=(countryCode||"").toUpperCase();if(code==="FR")return"fr";if(code==="DE")return"de";const entry=this.countries[code]||{},site=(entry.site||"").toUpperCase();if(site==="FR")return"fr";if(site==="DE")return"de";const name=(entry.name||"").toLowerCase();return name==="france"?"fr":name==="germany"?"de":null}isUkShopCountry(countryCode){const site=(this.countries[countryCode]?.site||"").toUpperCase();return site!=="US"&&site!=="JP"}englishLocaleValue(){if(!this.els?.language?.exists)return null;const languageEl=this.els.language.element||this.els.language.elements[0];return this.findLanguageOption(languageEl,"en")}defaultLanguagePref(countryCode){const defaultLocale=this.defaultLocaleFor(countryCode);return defaultLocale||(this.isUkShopCountry(countryCode)?this.englishLocaleValue():null)}languagePrefFor(countryCode){const code=(countryCode||"").toUpperCase(),override=this.getLocaleOverrides()[code];return override||this.defaultLanguagePref(code)}localeMatches(left,right){return!left||!right?!1:left.toLowerCase().split("-")[0]===right.toLowerCase().split("-")[0]}getLocaleOverrides(){try{const stored=window.localStorage.getItem(this.localeOverrideKey);if(!stored)return{};const parsed=JSON.parse(stored);return parsed&&typeof parsed=="object"?parsed:{}}catch{return{}}}setLocaleOverride(countryCode,locale){const code=(countryCode||"").toUpperCase();if(!code)return;const overrides=this.getLocaleOverrides(),implicitLocale=this.defaultLocaleFor(code)||(this.isUkShopCountry(code)?"en":null);!locale||this.localeMatches(locale,implicitLocale)||!this.localeMatches(locale,"en")?delete overrides[code]:overrides[code]=locale,window.localStorage.setItem(this.localeOverrideKey,JSON.stringify(overrides))}findLanguageOption(selectEl,locale){if(!selectEl||!locale)return null;const target=locale.toLowerCase(),options=[...selectEl.options],exact=options.find(option=>option.value.toLowerCase()===target);if(exact)return exact.value;const prefix=options.find(option=>option.value.toLowerCase().startsWith(`${target}-`));if(prefix)return prefix.value;const language=target.split("-")[0],byLanguage=options.find(option=>option.value.toLowerCase().split("-")[0]===language);return byLanguage?byLanguage.value:null}localeToApply(countryCode){return this.languagePrefFor(countryCode)}syncLanguageSelect(countryCode,options={}){if(!this.els?.language?.exists)return;const locale=options.ignoreOverride?this.defaultLanguagePref(countryCode):this.languagePrefFor(countryCode);locale&&this.els.language.elements.forEach(languageEl=>{const match=this.findLanguageOption(languageEl,locale);if(!match)return;languageEl.value=match;const input=languageEl.form?.querySelector('input[name="locale_code"]');input&&(input.value=match)})}ensureMarketCountry(countryCode){const code=(countryCode||"").toUpperCase();return!code||!this.countries[code]||!this.isOnSite(this.countries[code].site)?!1:this.currentCountry&&code===this.currentCountry?(this.setStoredCountry(code),!0):this.hasMarketApplyAttempted(code)?(this.setStoredCountry(this.currentCountry||code),!0):(this.switchTo(code,null,{countryOnly:!0}),!0)}dismissGeo(){window.sessionStorage.setItem(this.geoDismissedKey,"true")}getParam(name){return new URLSearchParams(window.location.search).get(name)}stripParam(name){const url=new URL(window.location.href);
15url.searchParams.has(name)&&(url.searchParams.delete(name),window.history.replaceState({},"",url.toString()))}updateSearchParams(params){const searchParams=new URLSearchParams(window.location.search);Object.keys(params).forEach(key=>searchParams.set(key,params[key])),window.location.search=searchParams.toString()}submitLocalization(countryCode,locale,targetHost){const form=document.getElementById("store-selector-language-form");if(!form){if(targetHost&&targetHost.toLowerCase()!==(this.currentHost||"").toLowerCase()){this.goToStore(targetHost,countryCode,locale);return}const params={country:countryCode};locale&&(params.locale=locale),this.updateSearchParams(params);return}let countryInput=form.querySelector('input[name="country_code"]');countryInput||(countryInput=document.createElement("input"),countryInput.type="hidden",countryInput.name="country_code",form.appendChild(countryInput)),countryCode&&(countryInput.value=countryCode);const localeInput=form.querySelector('input[name="locale_code"]');localeInput&&locale&&(localeInput.value=locale);let returnTo=form.querySelector('input[name="return_to"]');returnTo||(returnTo=document.createElement("input"),returnTo.type="hidden",returnTo.name="return_to",form.appendChild(returnTo)),returnTo.value=this.returnToForLocale(locale,countryCode);const host=(targetHost||"").toLowerCase();if(host&&host!==(this.currentHost||"").toLowerCase())try{const action=new URL(form.getAttribute("action")||"/localization",window.location.origin);action.protocol="https:",action.hostname=targetHost,form.action=action.toString()}catch{this.goToStore(targetHost,countryCode,locale);return}form.submit()}goToStore(targetHost,countryCode,locale){const searchParams=new URLSearchParams(window.location.search);searchParams.delete("currency");const previewId=this.previewThemeId();previewId&&!searchParams.has("preview_theme_id")&&searchParams.set("preview_theme_id",previewId),countryCode&&searchParams.set("country",countryCode.toUpperCase()),locale?searchParams.set("locale",locale):searchParams.delete("locale");const path=this.pathForLocale(locale,countryCode),query=searchParams.toString();window.location.href=`https://${targetHost}${path}${query?`?${query}`:""}`}switchTo(countryCode,selectedLocale,options={}){const code=(countryCode||"").toUpperCase(),entry=this.countries[code];if(!entry)return"noop";const locale=options.countryOnly?null:selectedLocale||this.localeToApply(code);options.countryOnly||this.setLocaleOverride(code,locale);const currentCountry=this.currentCountry,countryOk=currentCountry&&code===currentCountry,localeOk=!locale||this.localeMatches(locale,this.currentLocale),targetHost=this.redirectHostFor(code),hostChanged=targetHost&&targetHost.toLowerCase()!==(this.currentHost||"").toLowerCase();return this.isOnSite(entry.site)&&!hostChanged?countryOk&&localeOk?(this.setStoredCountry(code),"noop"):(this.setStoredCountry(code),this.markMarketApplyAttempted(code),locale&&this.markLocaleApplyAttempted(locale),this.submitLocalization(code,locale),"markets"):(this.setStoredCountry(code),this.goToStore(targetHost,code,locale),"redirect")}handleCountryParam(){const param=this.getParam("country"),localeParam=this.getParam("locale");if(!param&&!localeParam)return!1;if(param){const code=param.toUpperCase();this.countries[code]&&(!this.currentCountry||code===this.currentCountry?this.setStoredCountry(code):(this.setStoredCountry(this.currentCountry),this.markMarketApplyAttempted(code))),this.stripParam("country")}return localeParam&&(this.stripParam("locale"),!this.localeMatches(localeParam,this.currentLocale)&&!this.hasLocaleApplyAttempted(localeParam))&&(this.markLocaleApplyAttempted(localeParam),this.submitLocalization(this.currentCountry,localeParam)),!0}async detectCountry(){try{return(await fetch("/browsing_context_suggestions.json").then(response=>response.json()))?.detected_values?.country?.handle||null}catch(error){return console.error("Error detecting country:",error),null}}resolveCountry(code){const upper=(code||"").toUpperCase();return this.countries[upper]?{code:upper,...this.countries[upper]}:null}async runLocationFlow(){try{if(this.handleCountryParam()||window.Shopify?.designMode)return;const stored=this.storedCountry;if(stored&&this.countries[stored]){if(this.defaultLocaleFor(this.currentCountry)&&stored!==this.currentCountry){this.setStoredCountry(this.currentCountry);return}if(this.ensureMarketCountry(stored))return;this.isGeoDismissed||this.setupCountrySwitcherModal(stored);return}const detected=await this.detectCountry(),resolved=detected?this.resolveCountry(detected):null;if(resolved){if(this.ensureMarketCountry(resolved.code))return;this.isGeoDismissed||this.setupCountrySwitcherModal(resolved.code)}}catch(error){console.error("Error in runLocationFlow:",error)}}get currentCountry(){return(this.dataset.countryCode||this.dataset.store||"").toUpperCase()}}customElements.get("store-selector")||customElements.define("store-selector",StoreSelector); 16//# sourceMappingURL=/cdn/shop/t/532/assets/store-selector.js.map?v=153009347657058557791789988752
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.