1import{DialogComponent}from"@theme/dialog";const STORAGE_KEY="uf-growing-zone",EVENT_NAME="uf-zone:updated",ZIP3_STATES=[[5,5,"NY"],[6,9,"PR"],[10,27,"MA"],[28,29,"RI"],[30,38,"NH"],[39,49,"ME"],[50,54,"VT"],[55,55,"MA"],[56,59,"VT"],[60,69,"CT"],[70,89,"NJ"],[90,99,"AE"],[100,149,"NY"],[150,196,"PA"],[197,199,"DE"],[200,200,"DC"],[201,201,"VA"],[202,205,"DC"],[206,219,"MD"],[220,246,"VA"],[247,268,"WV"],[270,289,"NC"],[290,299,"SC"],[300,319,"GA"],[320,349,"FL"],[350,369,"AL"],[370,385,"TN"],[386,397,"MS"],[398,399,"GA"],[400,427,"KY"],[430,459,"OH"],[460,479,"IN"],[480,499,"MI"],[500,528,"IA"],[530,549,"WI"],[550,567,"MN"],[570,577,"SD"],[580,588,"ND"],[590,599,"MT"],[600,629,"IL"],[630,658,"MO"],[660,679,"KS"],[680,693,"NE"],[700,714,"LA"],[716,729,"AR"],[730,749,"OK"],[750,799,"TX"],[800,816,"CO"],[820,831,"WY"],[832,838,"ID"],[840,847,"UT"],[850,865,"AZ"],[870,884,"NM"],[889,898,"NV"],[900,961,"CA"],[967,968,"HI"],[969,969,"GU"],[970,979,"OR"],[980,994,"WA"],[995,999,"AK"]],stateFromZip=zip=>{const prefix=Number.parseInt(zip.slice(0,3),10);if(Number.isNaN(prefix))return"";for(const[start,end,state]of ZIP3_STATES)if(prefix>=start&&prefix<=end)return state;return""},zoneNumber=zone=>{const match=String(zone).match(/(\d{1,2})/);return match?Number.parseInt(match[1],10):null},extractZoneNumbers=raw=>raw?String(raw).match(/\d{1,2}/g)?.map(value=>Number.parseInt(value,10)).filter(value=>value>=1&&value<=13)||[]:[],parseRecommendedZones=raw=>{const values=extractZoneNumbers(raw);if(!values.length)return null;const isRange=/[â\-]|(\d)\s*to\s*(\d)/i.test(String(raw))&&values.length>=2;return{min:Math.min(...values),max:Math.max(...values),values,isRange}},zoneIsRecommended=(number,recommended)=>number==null||!recommended?null:recommended.isRange?number>=recommended.min&&number<=recommended.max:recommended.values.includes(number);export const readSavedZone=()=>{try{const raw=localStorage.getItem(STORAGE_KEY);if(!raw)return null;const parsed=JSON.parse(raw);return!parsed?.zip||!parsed?.zone?null:{zip:String(parsed.zip),zone:String(parsed.zone),state:String(parsed.state||"")}}catch{return null}};const saveZone=record=>{localStorage.setItem(STORAGE_KEY,JSON.stringify({zip:record.zip,zone:record.zone,state:record.state||stateFromZip(record.zip),updatedAt:Date.now()}))};class UfGrowingZoneModal extends DialogComponent{requiredRefs=["dialog","form","zipInput","setButton"];#lookup=null;#lookupPromise=null;#current=null;#product={title:"",zones:""};connectedCallback(){super.connectedCallback(),this.#current=readSavedZone(),this.#bindOpeners(),this.#paintBars(),document.addEventListener(EVENT_NAME,this.#onZoneUpdated)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener(EVENT_NAME,this.#onZoneUpdated),document.removeEventListener("click",this.#onDocumentClick)}openForProduct(view){const nextView=view||(this.#current?"result":"set");this.#setView(nextView),this.showDialog(),this.#preloadLookup(),(nextView==="set"||nextView==="edit")&&requestAnimationFrame(()=>this.refs.zipInput?.focus())}#setView(view){this.dataset.view=view,this.#renderResult(),this.#clearError(),(view==="set"||view==="edit")&&this.#current&&(this.refs.zipInput.value=this.#current.zip)}#bindOpeners(){document.addEventListener("click",this.#onDocumentClick)}#onDocumentClick=event=>{const opener=event.target instanceof Element?event.target.closest("[data-uf-zone-open]"):null;if(!opener)return;event.preventDefault();const bar=opener.closest("[data-uf-zone-bar]");this.#product={title:bar?.getAttribute("data-product-title")||this.dataset.productTitle||"",zones:bar?.getAttribute("data-product-zones")||""};const view=opener.getAttribute("data-uf-zone-open")||"";this.openForProduct(view==="edit"?"edit":void 0)};#onZoneUpdated=()=>{this.#current=readSavedZone(),this.#paintBars()};handleEdit=()=>{this.#setView("edit"),requestAnimationFrame(()=>this.refs.zipInput?.focus())};handleDone=()=>{this.closeDialog()};handleLocate=async()=>{if(!navigator.geolocation){this.#showError(this.#copy("locateUnsupported"));return}this.#setBusy(!0),this.#clearError();try{const position=await new Promise((resolve,reject)=>{navigator.geolocation.getCurrentPosition(resolve,reject,{enableHighAccuracy:!1,timeout:1e4,maximumAge:3e5})}),zip=await this.#zipFromCoordinates(position.coords.latitude,position.coords.longitude);if(!zip){this.#showError(this.#copy("locateFailed"));return}
1this.refs.zipInput.value=zip,await this.#applyZip(zip)}catch(error){const denied=!!(error&&typeof error=="object"&&"code"in error&&error.code===1);this.#showError(this.#copy(denied?"locateDenied":"locateFailed"))}finally{this.#setBusy(!1)}};handleSubmit=async event=>{event.preventDefault();const zip=this.refs.zipInput.value.replace(/\D/g,"").slice(0,5);if(this.refs.zipInput.value=zip,!/^\d{5}$/.test(zip)){this.#showError(this.#copy("zipInvalid")),this.refs.zipInput.focus();return}this.#setBusy(!0),this.#clearError();try{await this.#applyZip(zip)}finally{this.#setBusy(!1)}};async#applyZip(zip){const zone=(await this.#preloadLookup())?.[zip];if(!zone){this.#showError(this.#copy("zipUnknown"));return}const record={zip,zone,state:stateFromZip(zip)};this.#current=record,saveZone(record),this.#setView("result"),document.dispatchEvent(new CustomEvent(EVENT_NAME,{detail:record}))}async#preloadLookup(){if(this.#lookup)return this.#lookup;if(this.#lookupPromise)return this.#lookupPromise;const url=this.dataset.lookupUrl;return url?(this.#lookupPromise=this.#fetchLookup(url),this.#lookupPromise):null}async#fetchLookup(url){try{const response=await fetch(url);if(!response.ok)throw new Error("lookup failed");const data=await response.json();return this.#lookup=data.z||data,this.#lookup}catch{return this.#lookupPromise=null,this.#showError(this.#copy("lookupFailed")),null}}async#zipFromCoordinates(latitude,longitude){const url=new URL("https://geocoding.geo.census.gov/geocoder/geographies/coordinates");url.searchParams.set("x",String(longitude)),url.searchParams.set("y",String(latitude)),url.searchParams.set("benchmark","Public_AR_Current"),url.searchParams.set("vintage","Current_Current"),url.searchParams.set("format","json");const response=await fetch(url);if(!response.ok)return null;const geographies=(await response.json())?.result?.geographies||{},zcta=geographies["Census ZIP Code Tabulation Areas"]?.[0]||geographies["2020 Census ZIP Code Tabulation Areas"]?.[0]||geographies.ZCTAs?.[0],zip=String(zcta?.ZCTA5||zcta?.GEOID||zcta?.BASENAME||"").replace(/\D/g,"");return/^\d{5}$/.test(zip)?zip:null}#renderResult(){const record=this.#current;if(!record)return;const number=zoneNumber(record.zone);this.refs.resultZone&&(this.refs.resultZone.textContent=this.#copy("zoneLabel").replace("[[zone]]",String(number??record.zone))),this.refs.resultPlace&&(this.refs.resultPlace.textContent=[record.state,record.zip].filter(Boolean).join(" "));const range=parseRecommendedZones(this.#product.zones),inRange=zoneIsRecommended(number,range);this.dataset.match=inRange==null?"unknown":inRange?"good":"bad",this.refs.resultPin&&this.refs.resultPin.classList.toggle("uf-zone-modal__pin--warning",inRange===!1);const{lead,rest}=this.#alertCopy(inRange,range,number);this.refs.alertLead&&(this.refs.alertLead.textContent=lead),this.refs.alertRest&&(this.refs.alertRest.textContent=rest?` ${rest}`:"")}#alertCopy(inRange,range,number){const title=this.#product.title||this.#copy("thisVariety"),rangeText=range?`${range.min}\u2013${range.max}`:"";return inRange===!0?{lead:this.#copy("successLead").replace("[[title]]",title),rest:this.#copy("successRest").replace("[[range]]",rangeText)}:inRange===!1?{lead:this.#copy("warningLead"),rest:this.#copy("warningRest").replace("[[title]]",title).replace("[[range]]",rangeText).replace("[[zone]]",String(number??""))}:{lead:this.#copy("zoneSaved").replace("[[zone]]",String(number??"")),rest:""}}#paintBars(){const bars=document.querySelectorAll("[data-uf-zone-bar]"),record=this.#current;for(const bar of bars){const zipEl=bar.querySelector("[data-uf-zone-zip]"),labelEl=bar.querySelector("[data-uf-zone-label]"),status=bar.querySelector("[data-uf-zone-status]"),statusText=bar.querySelector("[data-uf-zone-status-text]"),pin=bar.querySelector("[data-uf-zone-pin]"),action=bar.querySelector("[data-uf-zone-action]"),range=parseRecommendedZones(bar.getAttribute("data-product-zones")||""),number=record?zoneNumber(record.zone):null,inRange=record?zoneIsRecommended(number,range):null;bar.dataset.zoneState=record?inRange===!1?"bad":inRange===!0?"good":"set":"pending",labelEl&&(labelEl.textContent=record?this.#copy("zoneLabel").replace("[[zone]]",String(number??record.zone)):labelEl.getAttribute("data-default-label")||this.#copy("hardinessFallback")),zipEl&&(zipEl.textContent=record?[record.state,record.zip].filter(
1Boolean).join(" "):""),status&&statusText&&(status.classList.remove("uf-pit__zone-status--success","uf-pit__zone-status--warning","uf-pit__zone-status--neutral"),inRange===!0?(status.classList.add("uf-pit__zone-status--success"),statusText.textContent=this.#copy("barSuccess")):inRange===!1?(status.classList.add("uf-pit__zone-status--warning"),statusText.textContent=this.#copy("barWarning")):(status.classList.add("uf-pit__zone-status--neutral"),statusText.textContent=record?this.#copy("barSet"):this.#copy("barPending"))),pin&&pin.classList.toggle("uf-pit__zone-pin--warning",inRange===!1),action&&(action.textContent=record?action.getAttribute("data-label-change")||this.#copy("barChange"):action.getAttribute("data-label-enter")||this.#copy("enterZipFallback"))}}#setBusy(busy){this.dataset.busy=busy?"true":"false",this.refs.setButton.disabled=busy,this.refs.locateButton&&(this.refs.locateButton.disabled=busy),this.refs.zipInput.disabled=busy}#showError(message){this.refs.error&&(this.refs.error.hidden=!1,this.refs.error.textContent=message)}#clearError(){this.refs.error&&(this.refs.error.hidden=!0,this.refs.error.textContent="")}#copy(key){const datasetKey=`copy${key.charAt(0).toUpperCase()}${key.slice(1)}`;return this.dataset[datasetKey]||""}}customElements.get("uf-growing-zone-modal")||customElements.define("uf-growing-zone-modal",UfGrowingZoneModal); 2//# sourceMappingURL=/cdn/shop/t/17/assets/uf-growing-zone.js.map?v=73829001522357470521788289534
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.