PageSourceSearch

https://kindredly.ai/js/StandaloneExploreNearbyAppBO4CE74Y.js

js kindredly.ai collected 2026-10-02 01:13:38 UTC 30,868 bytes, 6 lines download raw bytes

1import{d as Fe,v as x,i as D,B as Re,P as Ue,a4 as de,b as g,o as v,e as i,j as P,z as S,J as ot,w as z,k as w,N as ze,a1 as it,c as T,y as ie,a7 as Ae,U as lt,f as ee,l as L,F as le,q as ce,n as E,u as ct,Q as ut,S as W}from"./vue-runtimeBHGad_ZB.js";import{t as De,ak as dt,_ as Be,l as pt}from"./chunkReloadRecoveryrjuMb-b8.js";import{L as H}from"./leafletBfN3D-RB.js";import"./cjs-helpersC4iS2aBk.js";import"./bootstrap-vue-nextDXY4qsO1.js";import"./dexie2jmnBxhj.js";const ft=[{id:"curated:central-park-nyc",name:"Central Park",category:"parks",cost:"free",lat:40.7825547,lng:-73.9655834,address:"New York, NY",description:"843-acre park with playgrounds, lawns, a zoo, and miles of paths.",url:"https://www.centralparknyc.org/",tags:["playground","picnic","stroller-friendly"]},{id:"curated:golden-gate-park-sf",name:"Golden Gate Park",category:"parks",cost:"free",lat:37.7694208,lng:-122.4862138,address:"San Francisco, CA",description:"Large city park with gardens, playgrounds, lakes, and museums nearby.",url:"https://sfrecpark.org/770/Golden-Gate-Park",tags:["playground","gardens"]},{id:"curated:exploratorium-sf",name:"Exploratorium",category:"museums",cost:"paid",lat:37.8017206,lng:-122.3972404,address:"Pier 15, San Francisco, CA",description:"Hands-on science museum built for kids and curious adults.",url:"https://www.exploratorium.edu/",tags:["science","hands-on","indoor"]},{id:"curated:santa-monica-beach",name:"Santa Monica State Beach",category:"beach",cost:"free",lat:34.0094213,lng:-118.4973491,address:"Santa Monica, CA",description:"Wide sandy beach with a pier, playgrounds, and a bike path.",url:"https://www.parks.ca.gov/?page_id=22669",tags:["sand","pier","bike-path"]},{id:"curated:griffith-observatory-la",name:"Griffith Observatory",category:"museums",cost:"free",lat:34.1184341,lng:-118.3003935,address:"Los Angeles, CA",description:"Public observatory with exhibits, telescopes, and city views.",url:"https://griffithobservatory.org/",tags:["science","views","telescopes"]},{id:"curated:lincoln-park-zoo-chicago",name:"Lincoln Park",category:"parks",cost:"free",lat:41.9211982,lng:-87.6336504,address:"Chicago, IL",description:"Lakefront park with a free zoo, beaches, and playgrounds.",url:"https://www.chicagoparkdistrict.com/parks-facilities/lincoln-park",tags:["zoo","lakefront","playground"]},{id:"curated:boston-public-library",name:"Boston Public Library",category:"libraries",cost:"free",lat:42.3493753,lng:-71.0780042,address:"Copley Square, Boston, MA",description:"Historic central library with a dedicated children's room and events.",url:"https://www.bpl.org/",tags:["kids-room","events","indoor"]},{id:"curated:venice-skatepark-la",name:"Venice Beach Skatepark",category:"skateboarding",cost:"free",lat:33.9857137,lng:-118.4742193,address:"Venice, CA",description:"Oceanfront concrete skatepark with bowls and a street section.",url:"https://www.laparks.org/skatepark/venice",tags:["bowls","street","outdoor"]},{id:"curated:minnehaha-falls-mpls",name:"Minnehaha Regional Park",category:"trails",cost:"free",lat:44.9153609,lng:-93.2110023,address:"Minneapolis, MN",description:"Walking trails to a 53-foot waterfall, plus a playground and picnic areas.",url:"https://www.minneapolisparks.org/parks-destinations/minnehaha_regional_park/",tags:["waterfall","playground","stroller-friendly"]},{id:"curated:kelly-drive-bike-path-philly",name:"Schuylkill River Trail",category:"biking",cost:"free",lat:39.9676189,lng:-75.1820745,address:"Philadelphia, PA",description:"Paved, mostly flat riverside trail that is great for family bike rides.",url:"https://schuylkillrivertrail.com/",tags:["paved","flat","riverside"]}],me=6,Z=[{id:"parks",label:"Parks",mark:"PARK",icon:"tree",color:"#2e7d32",overpass:[{key:"leisure",value:"park"},{key:"leisure",value:"playground"},{key:"leisure",value:"garden"}]},{id:"trails",label:"Trails",mark:"TRAIL",icon:"signpost-split",color:"#6d4c41",overpass:[{key:"route",value:"hiking"},{key:"highway",value:"path"},{key:"leisure",value:"nature_reserve"}]},{id:"swimming",label:"Swimming",mark:"SWIM",icon:"water",color:"#0277bd",overpass:[{key:"leisure",value:"swimming_pool"},{key:"leisure",value:"water_park"},{key:"sport",value:"swimming"}]},{id:"biking",label:"Biking",mark:"BIKE",icon:"bicycle",color:"#ef6c00",overpass:[{key:"highway",value:"cycleway"},{key:"route",value:"bicycle"}]},{id:"skateboarding",label:"Skateboarding",mark:"SKATE",icon:"lightning-charge",color:"#7b1fa2",overpass:[{key:"leisure",value:"skatepark"},{key:"sport",value:"skateboard"}]},{id:"beach",label:"Beaches",mark:"BEACH",icon:"umbrella",color:"#00838f",overpass:[{key:"natural",value:"beach"},{key:"leisure",value:"beach_resort"}]},{id:"museums",label:"Museums",mark:"MUSEUM",icon:"bank",color:"#c62828",overpass:[{key:"tourism",value:"museum"},{key:"tourism",value:"gallery"}]},{id:"camping",label:"Camping",mark:"CAMP",icon:"tropical-storm",color:"#558b2f",overpass:[{key:"tourism",value:"camp_site"},{key:"tourism",value:"caravan_site"}]},{id:"libraries",label:"Libraries",mark:"LIB",icon:"book",color:"#4527a0",overpass:[{key:"amenity",value:"library"}]},{id:"family-businesses",label:"Family spots",mark:"FAMILY",icon:"balloon",color:"#ad1457",overpass:[{key:"tourism",value:"theme_park"},{key:"leisure",value:"trampoline_park"},{key:"leisure",value:"amusement_arcade"},{key:"leisure",value:"bowling_alley"},{key:"amenity",value:"cinema"}]}],qe=new Map(Z.map(e=>[e.id,e])),mt=new Set(Z.map(e=>e.id)),vt=new Set(["free","free_with_paid","paid","unknown"]);function yt(e){var t;return((t=qe.get(e))==null?void 0:t.label)||"Place"}const gt={label:"Place",icon:"geo-alt",color:"#455a64",mark:"GO"};function pe(e){const t=qe.get(e);return t?{label:t.label,icon:t.icon,color:t.color,mark:t.mark}:gt}function bt(e){return Array.isArray(e)?[...new Set(e.filter(t=>typeof t=="string"&&t.length>0))]:[]}function ae(e){const t=Number(e);return Number.isFinite(t)?t:null}function ht(e){return e==="no"||e===!1?"free":e==="yes"||e===!0?"paid":"unknown"}function Ke(e){if(!e||typeof e!="object")return null;const t=e,s=typeof t.id=="string"?t.id.trim():"",r=typeof t.name=="string"?t.name.trim():"",o=typeof t.category=="string"&&mt.has(t.category)?t.category:null,p=ae(t.lat),u=ae(t.lng);if(!s||!r||!o||p==null||u==null)return null;const f=typeof t.cost=="string"&&vt.has(t.cost)?t.cost:"unknown",l=t.source==="osm"?"osm":"curated",y={id:s,name:r,category:o,cost:f,lat:p,lng:u,s
1ource:l};typeof t.address=="string"&&t.address.trim()&&(y.address=t.address.trim()),typeof t.description=="string"&&t.description.trim()&&(y.description=t.description.trim()),typeof t.url=="string"&&t.url.trim()&&(y.url=t.url.trim()),typeof t.wikipediaUrl=="string"&&t.wikipediaUrl.trim()&&(y.wikipediaUrl=t.wikipediaUrl.trim());const b=bt(t.tags);return b.length>0&&(y.tags=b),y}const $e=ft.map(e=>Ke({...e,source:"curated"})).filter(e=>!!e);function Me(){return{categories:[],cost:null,query:"",favoritesOnly:!1,maxDistanceKm:null}}function ne(){return{favorites:[],lastLocation:null,recentLocations:[]}}function O(e){return`${e.lat.toFixed(3)},${e.lng.toFixed(3)}`}function kt(e,t,s=me){const r=O(t),o=e.filter(p=>O(p)!==r);return[t,...o].slice(0,s)}function Ne(e){if(!e||typeof e!="object")return null;const t=e,s=ae(t.lat),r=ae(t.lng);if(s==null||r==null)return null;const o=typeof t.label=="string"&&t.label.trim()?t.label.trim():void 0;return{lat:s,lng:r,label:o}}function ve(e){if(!e||typeof e!="object")return ne();const t=e,s=Array.isArray(t.favorites)?t.favorites.map(l=>Ke(l)).filter(l=>!!l):[],r=new Set,o=s.filter(l=>r.has(l.id)?!1:(r.add(l.id),!0)),p=Array.isArray(t.recentLocations)?t.recentLocations.map(l=>Ne(l)).filter(l=>!!l):[],u=new Set,f=p.filter(l=>{const y=O(l);return u.has(y)?!1:(u.add(y),!0)}).slice(0,me);return{favorites:o,lastLocation:Ne(t.lastLocation),recentLocations:f}}function wt(e,t){const s=new Map;for(const o of[...e.favorites,...t.favorites])s.has(o.id)||s.set(o.id,o);const r=new Map;for(const o of[...e.recentLocations,...t.recentLocations]){const p=O(o);r.has(p)||r.set(p,o)}return{favorites:[...s.values()],lastLocation:e.lastLocation||t.lastLocation,recentLocations:[...r.values()].slice(0,me)}}function re(e){return e.favorites.length>0||e.lastLocation!=null||e.recentLocations.length>0}function xt(e,t){return e.favorites.some(s=>s.id===t)}function _t(e,t){return e.some(s=>s.id===t.id)?e.filter(s=>s.id!==t.id):[...e,t]}const St=6371;function te(e){return e*Math.PI/180}function Q(e,t){const s=te(t.lat-e.lat),r=te(t.lng-e.lng),o=te(e.lat),p=te(t.lat),u=Math.sin(s/2)**2+Math.cos(o)*Math.cos(p)*Math.sin(r/2)**2;return 2*St*Math.asin(Math.min(1,Math.sqrt(u)))}function Ct(e){return e<1?`${Math.round(e*1e3)} m`:e<10?`${e.toFixed(1)} km`:`${Math.round(e)} km`}function Te(e){return e.toLowerCase().replace(/[^a-z0-9]+/g," ").trim()}const Lt=.15;function Et(e,t){const s=[...e];for(const r of t)e.some(p=>{const u=p.category===r.category,f=Q(p,r)<=Lt;return u&&f?!0:Te(p.name)===Te(r.name)&&f})||s.push(r);return s}function At(e,t){return t==null?!0:t==="free"?e==="free"||e==="free_with_paid":e==="paid"||e==="free_with_paid"}function $t(e,t,s){if(t.favoritesOnly&&!s.favoriteIds.has(e.id)||t.categories.length>0&&!t.categories.includes(e.category)||!At(e.cost,t.cost)||t.maxDistanceKm!=null&&s.origin&&Q(s.origin,e)>t.maxDistanceKm)return!1;const r=t.query.trim().toLowerCase();return r?[e.name,e.address,e.description,yt(e.category),...e.tags||[]].filter(Boolean).join(" ").toLowerCase().includes(r):!0}function Ie(e,t,s={}){const r=s.favoriteIds||new Set,o=s.origin||null;return e.filter(p=>$t(p,t,{favoriteIds:r,origin:o})).sort((p,u)=>o?Q(o,p)-Q(o,u):p.name.localeCompare(u.name))}const Pe=["https://overpass-api.de/api/interpreter","https://overpass.private.coffee/api/interpreter","https://overpass.kumi.systems/api/interpreter"],Mt="https://nominatim.openstreetmap.org/search",Nt=8e3,Ve=200;function je(e){if(!e||e.length===0)return Z;const t=new Set(e);return Z.filter(s=>t.has(s.id))}function Tt(e,t,s=Ve){const r=`(${e.south},${e.west},${e.north},${e.east})`,o=new Set,p=[];for(const u of je(t))for(const f of u.overpass){const l=f.value?`["${f.key}"="${f.value}"]`:`["${f.key}"]`;if(!o.has(l)){o.add(l);for(const y of["node","way","relation"])p.push(`  ${y}${l}${r};`)}}return`[out:json][timeout:25];
2(
3${p.join(`
4`)}
5);
6out center ${s};`}function It(e,t){for(const s of t)for(const r of s.overpass){const o=e[r.key];if(o!=null&&(!r.value||o===r.value))return s.id}return null}function Pt(e){if(!e)return;const t=e.indexOf(":");if(t<=0)return;
6const s=e.slice(0,t).trim(),r=e.slice(t+1).trim();if(!(!s||!r))return`https://${s}.wikipedia.org/wiki/${encodeURIComponent(r.replace(/ /g,"_"))}`}function Ot(e){const t=[[e["addr:housenumber"],e["addr:street"]].filter(Boolean).join(" "),e["addr:city"],e["addr:state"]].filter(s=>s&&s.trim().length>0);return t.length>0?t.join(", "):void 0}function Ft(e,t){var h,_;const s=e.tags||{},r=(s.name||"").trim();if(!r)return null;const o=e.lat??((h=e.center)==null?void 0:h.lat),p=e.lon??((_=e.center)==null?void 0:_.lon);if(typeof o!="number"||typeof p!="number")return null;const u=It(s,t);if(!u)return null;const f={id:`osm:${e.type}:${e.id}`,name:r,category:u,cost:ht(s.fee),lat:o,lng:p,source:"osm"},l=Ot(s);l&&(f.address=l);const y=(s.website||s["contact:website"]||"").trim();y&&(f.url=y);const b=Pt(s.wikipedia);return b&&(f.wikipediaUrl=b),f}async function Rt(e,t,s){const r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:`data=${encodeURIComponent(t)}`,signal:s});if(!r.ok)throw new Error(`Overpass ${e} failed (${r.status})`);const o=await r.json();return Array.isArray(o.elements)?o.elements:[]}const Ut=new Set(["trails","biking"]);function zt(e){return e.toLowerCase().replace(/[^a-z0-9]+/g," ").trim()}function Dt(e,t){const s=je(t),r=new Map,o=new Set;for(const p of e){const u=Ft(p,s);if(u){if(Ut.has(u.category)){const f=`${u.category}:${zt(u.name)}`;if(o.has(f))continue;o.add(f)}r.has(u.id)||r.set(u.id,u)}}return[...r.values()]}async function Bt(e,t,s={}){var l,y,b;const r=s.limit??Ve,o=Tt(e,t,r),p=Pe.map(()=>new AbortController),u=()=>p.forEach(h=>h.abort());(l=s.signal)==null||l.addEventListener("abort",u);const f=p.map(h=>setTimeout(()=>h.abort(),Nt));try{const h=Pe.map((A,$)=>Rt(A,o,p[$].signal)),_=await Promise.any(h);return Dt(_,t)}catch{throw(y=s.signal)!=null&&y.aborted?new DOMException("Aborted","AbortError"):new Error("All Overpass endpoints failed")}finally{u(),f.forEach(h=>clearTimeout(h)),(b=s.signal)==null||b.removeEventListener("abort",u)}}async function qt(e,t={}){var y;const s=e.trim();if(!s)return null;let r=`${Mt}?format=json&limit=1&q=${encodeURIComponent(s)}`;if(t.near){const h=t.near.lng-1.5,_=t.near.lng+1.5,A=t.near.lat+1.5,$=t.near.lat-1.5;r+=`&viewbox=${h},${A},${_},${$}&bounded=0`}const o=await fetch(r,{headers:{Accept:"application/json"},signal:t.signal});if(!o.ok)return null;const u=(await o.json())[0];if(!u)return null;const f=Number(u.lat),l=Number(u.lon);return!Number.isFinite(f)||!Number.isFinite(l)?null:{lat:f,lng:l,label:((y=u.display_name)==null?void 0:y.split(",").slice(0,2).join(",").trim())||s}}const fe="apps.exploreNearby.state.v1",ye=dt.clientKv("exploreNearby"),ge="guestState.v1";async function Kt(){const e=await ye.getRaw(ge);return ve(e)}async function Vt(e){await ye.setRaw(ge,e)}async function jt(){await ye.clear(ge)}async function Gt(e){var s;if(!e)return ne();const t=await De("/user/prefs/get",{userId:e,keys:[fe]});return ve((s=t==null?void 0:t.result)==null?void 0:s[fe])}async function Oe(e,t){e&&await De("/user/prefs/update",{userId:e,updates:{[fe]:t}})}function Yt(e,t){return e?re(t)?"Saved to your account.":"Signed in. Saved spots will sync to your account.":re(t)?"Saved on this device for now.":"Using guest mode. Saved spots stay on this device until you sign in."}const Wt={class:"explore-nearby-map-wrap rounded-4"},Ht={key:0,class:"explore-nearby-map-loading"},ue=13,Zt=Fe({__name:"ExploreNearbyMap",props:{places:{},selectedId:{},hoveredId:{},center:{},loading:{type:Boolean}},emits:["select","hover","request-search"],setup(e,{expose:t,emit:s}){const r=e,o=s,p={lat:37.7749,lng:-122.4194},u=x(null),f=x(!1);let l=null,y=null;const b=new Map;let h=!1,_=null;function A(){if(!l)return null;const c=l.getBounds();return{south:c.getSouth(),west:c.getWest(),north:c.getNorth(),east:c.getEast()}}function $(c,m=.12){return{south:c.lat-m,north:c.lat+m,west:c.lng-m,east:c.lng+m}}function F(c){return c.replace(/[&<>"']/g,m=>{switch(m){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";default:return"&#39;"}})}function R(c,m){const C=pe(c.category),U=m?"explore-nearby-pin explore-nearby-pin--active":`explore-nearby-pin en-cat--${c.category}`;return H.divIcon({className:"explore-nearby-pin-wrap",html:`<span class="${U}"><i class="bi bi-${C.icon}"></i></span>`,iconSize:[30,30],iconAnchor:[15,30],popupAnchor:[0,-28]})}function B(c){return c.id===r.selectedId||c.id===r.hoveredId}function q(){if(!(!l||!y)){y.clearLayers(),b.clear();for(const c of r.places){const m=H.marker([c.lat,c.lng],{icon:R(c,B(c))}),C=pe(c.category);m.bindPopup(`<strong>${F(c.name)}</strong><br>${F(C.label)}`),m.on("click",()=>o("select",c.id)),m.on("mouseover",()=>o("hover",c.id)),m.on("mouseout",()=>o("hover",null)),m.addTo(y),b.set(c.id,m)}}}function K(){for(const c of r.places){const m=b.get(c.id);m==null||m.setIcon(R(c,B(c)))}}function N(){if(!u.value||l)return;const c=r.center||p;l=H.map(u.value,{zoomControl:!0,zoomSnap:0,wheelPxPerZoomLevel:60,wheelDebounceTime:20}
6).setView([c.lat,c.lng],ue),H.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png",{maxZoom:19,attribution:"&copy; OpenStreetMap contributors"}).addTo(l),y=H.layerGroup().addTo(l),l.on("moveend",()=>{if(h){h=!1;return}f.value=!0}),q()}let X=!1;function V(c){l&&(h=!0,_&&clearTimeout(_),_=setTimeout(()=>{h=!1},1200),l.invalidateSize({pan:!1}),X?l.flyTo([c.lat,c.lng],ue,{duration:.8}):(l.setView([c.lat,c.lng],ue,{animate:!1}),X=!0),f.value=!1,o("request-search",$(c)))}function j(){if(!l)return;f.value=!1;const c=l.getSize();let m;if(c.x>0&&c.y>0)m=A();else{const C=l.getCenter();m=$({lat:C.lat,lng:C.lng})}m&&o("request-search",m)}function se(){ze(()=>setTimeout(()=>l==null?void 0:l.invalidateSize(),50))}return t({refreshSize:se,searchHere:j}),D(()=>r.places,()=>q()),D(()=>[r.selectedId,r.hoveredId],()=>K()),D(()=>r.selectedId,c=>{var C;if(!c||!l)return;const m=r.places.find(U=>U.id===c);m&&(l.panTo([m.lat,m.lng]),(C=b.get(c))==null||C.openPopup())}),D(()=>r.center,c=>{c&&V(c)}),Re(()=>{N(),r.center&&V(r.center)}),Ue(()=>{_&&clearTimeout(_),l==null||l.remove(),l=null}),(c,m)=>{const C=de("b-spinner");return v(),g("div",Wt,[i("div",{ref_key:"mapEl",ref:u,class:"explore-nearby-map"},null,512),P(ot,{name:"fade"},{default:z(()=>[f.value?(v(),g("button",{key:0,type:"button",class:"explore-nearby-search-area btn btn-sm btn-light shadow-sm rounded-pill",onClick:j},[...m[0]||(m[0]=[i("i",{class:"bi bi-arrow-repeat me-1"},null,-1),w("Search this area ",-1)])])):S("",!0)]),_:1}),e.loading?(v(),g("div",Ht,[P(C,{small:""}),m[1]||(m[1]=i("span",null,"Finding places…",-1))])):S("",!0)])}}}),Qt=Be(Zt,[["__scopeId","data-v-609c607b"]]),Xt={class:"explore-nearby-shell rounded-4 p-3 p-md-4"},Jt={class:"d-flex flex-wrap align-items-center gap-2 mb-2"},ea={class:"input-group input-group-sm explore-nearby-search flex-grow-1 flex-md-grow-0"},ta={key:1},aa={key:1,class:"bi bi-crosshair"},na={key:1},ra={class:"ms-auto small text-muted d-flex align-items-center gap-2"},sa={key:0},oa={key:0,class:"text-success"},ia={key:0,class:"d-flex flex-wrap align-items-center gap-1 mb-2"},la=["onClick"],ca={class:"explore-nearby-filterbar d-flex flex-wrap align-items-center gap-2 mb-2"},ua={class:"explore-nearby-cats d-flex flex-wrap gap-1"},da=["aria-pressed"],pa=["aria-pressed","onClick"],fa=["aria-pressed"],ma={key:0},va={class:"input-group input-group-sm explore-nearby-text-filter"},ya={class:"d-lg-none mb-2"},ga={class:"btn-group btn-group-sm w-100",role:"group","aria-label":"View mode"},ba={key:1,class:"alert alert-warning py-2 px-3 small mb-2 d-flex align-items-center justify-content-between gap-2"},ha={class:"explore-nearby-layout d-lg-flex gap-3"},ka={key:0,class:"text-center text-muted p-4"},wa={key:0},xa={key:1},_a={key:2},Sa={key:1,class:"d-flex flex-column gap-2 p-2"},Ca=["data-place-id","onClick","onMouseenter"],La={class:"d-flex gap-2"},Ea={class:"flex-grow-1 min-width-0"},Aa={class:"fw-semibold text-truncate"},$a={class:"small text-muted"},Ma={key:0},Na={class:"fw-medium"},Ta={key:1},Ia={key:0,class:"small text-muted mb-2 mt-1 explore-nearby-desc"},Pa={class:"d-flex flex-wrap gap-3 mt-1"},Oa=["onClick"],Fa=["href"],Ra=["href"],Ua=["href"],za=["href"],Da={class:"small text-muted mt-2"},Ba=Fe({__name:"StandaloneExploreNearbyApp",setup(e){const t=Z,s=t.map(n=>n.id),r=it(Me());r.categories=[...s];const o=x(ne()),p=x("list"),u=x(null),f=x(""),l=x([]),y=x(!1),b=x(""),h=x(!1),_=x(!1),A=x(null),$=x(null),F=x("idle"),R=x(!1),B=x(null),q=x(null),K=x(null),N=T(()=>{var n;return((n=pt.currentUser)==null?void 0:n._id)||null}),X=T(()=>Yt(!!N.value,o.value)),V=T(()=>new Set(o.value.favorites.map(n=>n.id))),j=T(()=>o.value.recentLocations);function se(n){return O(n)}function c(n){var k;const a=(k=n.label)==null?void 0:k.trim();return a?a.split(",")[0].trim():`${n.lat.toFixed(2)}, ${n.lng.toFixed(2)}`}function m(n){return!!u.value&&O(u.value)===O(n)}function C(n){oe(n)}const U=T({get:()=>r.maxDistanceKm??0,set:n=>{r.maxDistanceKm=n>0?n:null}}),J=T(()=>r.categories.length===s.length),be=T(()=>{let n=0;return J.value||n++,r.maxDistanceKm!=null&&n++,r.favoritesOnly&&n++,r.query.trim().length>0&&n++,n});function Ge(n,a){return a.lat>=n.south&&a.lat<=n.north&&a.lng>=n.west&&a.lng<=n.east}const Ye=T(()=>{if(r.favoritesOnly)return o.value.favorites;const n=B.value,a=n?$e.filter(k=>Ge(n,k)):$e;return Et(a,l.value)}),G=T(()=>r.favoritesOnly?Ie(o.value.favorites,{...r,categories:[]},{favoriteIds:V.value,origin:u.value}):r.categories.length===0?[]:Ie(Ye.value,r,{favoriteIds:V.value,origin:u.value}));function he(n){return pe(n)}function ke(n){return xt(o.value,n)}function We(n){return u.value?Ct(Q(u.value,n)):""}function He(n){return`https://www.openstreetmap.org/directions?to=${n.lat}%2C${n.lng}`}function Ze(n){var I;const a=n.address||((I=u.value)==null?void 0:I.label)||"",k=`${n.name} ${a}`.trim();return`https://www.google.com/search?q=${encodeURIComponent(k)}`}function Qe(){r.categories=J.value?[]:[...s]}function Xe(n){const a=r.categories.indexOf(n);a>=0?r.categories.splice(a,1):r.categories.push(n)}
6function Je(){Object.assign(r,Me()),r.categories=[...s]}function et(n){A.value=n.id}function tt(n){A.value=n,we(n)}function we(n){ze(()=>{var a,k;(k=(a=q.value)==null?void 0:a.querySelector(`[data-place-id="${n}"]`))==null||k.scrollIntoView({block:"nearest",behavior:"smooth"})})}function xe(n){var a;p.value=n,n==="map"&&((a=K.value)==null||a.refreshSize())}let M=null;async function at(n){B.value=n,await nt(n)}async function nt(n){M==null||M.abort();const a=new AbortController;M=a,y.value=!0,b.value="";try{const k=await Bt(n,[],{signal:a.signal,limit:250});M===a&&(l.value=k)}catch{a.signal.aborted||(b.value="Could not load places right now.")}finally{M===a&&(y.value=!1,M=null)}}function _e(){var n;(n=K.value)==null||n.searchHere()}function Se(){return new Promise(n=>{if(typeof navigator>"u"||!navigator.geolocation){n(null);return}navigator.geolocation.getCurrentPosition(a=>n({lat:a.coords.latitude,lng:a.coords.longitude,label:"Your location"}),()=>n(null),{enableHighAccuracy:!1,timeout:8e3,maximumAge:5*60*1e3})})}async function rt(){_.value=!0,b.value="";try{const n=await Se();n?await oe(n):b.value="Location is unavailable. Try searching for a place instead."}finally{_.value=!1}}async function Ce(){const n=f.value.trim();if(n){h.value=!0,b.value="";try{const a=await qt(n,{near:u.value});a?await oe(a):b.value="Could not find that location."}catch{b.value="Location search failed. Please try again."}finally{h.value=!1}}}async function oe(n,a=!0){u.value=n,f.value=n.label||"",o.value={...o.value,lastLocation:n,recentLocations:a?kt(o.value.recentLocations,n):o.value.recentLocations},await Le()}async function st(n){o.value={...o.value,favorites:_t(o.value.favorites,n)},await Le()}async function Le(){if(!R.value)try{const n=ve(o.value);o.value=n,N.value?await Oe(N.value,n):await Vt(n),F.value="saved"}catch{F.value="error"}}async function Ee(){R.value=!0;try{const n=await Kt();if(N.value){const a=await Gt(N.value),k=wt(a,n);o.value=k,re(k)&&await Oe(N.value,k),re(n)&&await jt()}else o.value=n}catch{o.value=ne()}finally{R.value=!1}}return D(A,n=>{n&&we(n)}),D(N,()=>{Ee()}),Re(async()=>{await Ee();const n=o.value.recentLocations[0]||o.value.lastLocation;u.value=n||await Se()||{lat:37.7749,lng:-122.4194,label:"San Francisco, CA"},f.value=u.value.label||""}),Ue(()=>{M==null||M.abort()}),(n,a)=>{const k=de("b-spinner"),I=de("b-button");return v(),g("div",Xt,[a[31]||(a[31]=i("div",{class:"mb-3"},[i("div",{class:"explore-nearby-kicker mb-1"},"Out & about"),i("h1",{class:"explore-nearby-title mb-1"},"Explore Nearby"),i("p",{class:"text-muted mb-0"},"Find family-friendly places to go — parks, trails, museums, libraries and more.")],-1)),i("div",Jt,[i("div",ea,[a[12]||(a[12]=i("span",{class:"input-group-text"},[i("i",{class:"bi bi-geo-alt"})],-1)),ie(i("input",{"onUpdate:modelValue":a[0]||(a[0]=d=>f.value=d),type:"text",class:"form-control",placeholder:"Search a city, address or ZIP","aria-label":"Search location",onKeyup:lt(Ce,["enter"])},null,544),[[Ae,f.value]]),P(I,{variant:"outline-secondary",size:"sm",disabled:h.value,onClick:Ce},{default:z(()=>[h.value?(v(),ee(k,{key:0,small:""})):(v(),g("span",ta,"Go"))]),_:1},8,["disabled"]),P(I,{variant:"primary",size:"sm",class:"explore-nearby-locbtn",disabled:_.value,"aria-label":"Use my location",title:"Use my location",onClick:rt},{default:z(()=>[_.value?(v(),ee(k,{key:0,small:""})):(v(),g("i",aa))]),_:1},8,["disabled"])]),P(I,{variant:"outline-primary",size:"sm",class:"explore-nearby-searchbtn",disabled:y.value,title:"Search this area",onClick:_e},{default:z(()=>[y.value?(v(),ee(k,{key:0,small:""})):(v(),g("span",na,[...a[13]||(a[13]=[i("i",{class:"bi bi-arrow-repeat me-1"},null,-1),w("Search area",-1)])]))]),_:1},8,["disabled"]),i("div",ra,[i("span",null,[w(L(G.value.length)+" place",1),G.value.length!==1?(v(),g("span",sa,"s")):S("",!0)]),F.value==="saved"?(v(),g("span",oa,[...a[14]||(a[14]=[i("i",{class:"bi bi-check2"},null,-1),w(" Saved",-1)])])):S("",!0)])]),j.value.length>1?(v(),g("div",ia,[a[15]||(a[15]=i("span",{class:"small text-muted me-1",title:"Recent locations"},[i("i",{class:"bi bi-clock-history"})],-1)),(v(!0),g(le,null,ce(j.value,d=>(v(),g("button",{key:se(d),type:"button",class:E(["explore-nearby-pill explore-nearby-pill--ghost",{"explore-nearby-pill--on":m(d)}]),onClick:Y=>C(d)},L(c(d)),11,la))),128))])):S("",!0),i("div",ca,[i("div",ua,[i("button",{type:"button",class:E(["explore-nearby-pill",{"explore-nearby-pill--on":J.value}]),"aria-pressed":J.value,onClick:Qe}," All ",10,da),(v(!0),g(le,null,ce(ct(t),d=>(v(),g("button",{key:d.id,type:"button",class:E(["explore-nearby-pill d-inline-flex align-items-center gap-1",r.categories.includes(d.id)?`explore-nearby-pill--cat en-cat--${d.id}`:""]),"aria-pressed":r.categories.includes(d.id),onClick:Y=>Xe(d.id)},[i("i",{class:E(["bi",[`bi-${d.icon}`,r.categories.includes(d.id)?"":`en-cat-text--${d.id}
6`]])},null,2),i("span",null,L(d.label),1)],10,pa))),128))]),a[20]||(a[20]=i("div",{class:"vr d-none d-md-block mx-1"},null,-1)),ie(i("select",{"onUpdate:modelValue":a[1]||(a[1]=d=>U.value=d),class:"form-select form-select-sm explore-nearby-distance","aria-label":"Distance"},[...a[16]||(a[16]=[i("option",{value:0},"Any distance",-1),i("option",{value:2},"Within 2 km",-1),i("option",{value:5},"Within 5 km",-1),i("option",{value:10},"Within 10 km",-1),i("option",{value:25},"Within 25 km",-1)])],512),[[ut,U.value,void 0,{number:!0}]]),i("button",{type:"button",class:E(["explore-nearby-pill d-inline-flex align-items-center gap-1",{"explore-nearby-pill--star":r.favoritesOnly}]),"aria-pressed":r.favoritesOnly,onClick:a[2]||(a[2]=d=>r.favoritesOnly=!r.favoritesOnly)},[a[18]||(a[18]=i("i",{class:"bi bi-star-fill"},null,-1)),i("span",null,[a[17]||(a[17]=w("Saved",-1)),o.value.favorites.length?(v(),g("span",ma," ("+L(o.value.favorites.length)+")",1)):S("",!0)])],10,fa),i("div",va,[a[19]||(a[19]=i("span",{class:"input-group-text"},[i("i",{class:"bi bi-search"})],-1)),ie(i("input",{"onUpdate:modelValue":a[3]||(a[3]=d=>r.query=d),type:"text",class:"form-control",placeholder:"Filter results","aria-label":"Filter by keyword"},null,512),[[Ae,r.query]])]),be.value>0?(v(),ee(I,{key:0,variant:"link",size:"sm",class:"px-1 ms-auto",onClick:Je},{default:z(()=>[w(" Clear ("+L(be.value)+") ",1)]),_:1})):S("",!0)]),i("div",ya,[i("div",ga,[i("button",{type:"button",class:E(["btn",p.value==="list"?"btn-primary":"btn-outline-secondary"]),onClick:a[4]||(a[4]=d=>xe("list"))},[...a[21]||(a[21]=[i("i",{class:"bi bi-list-ul me-1"},null,-1),w("List ",-1)])],2),i("button",{type:"button",class:E(["btn",p.value==="map"?"btn-primary":"btn-outline-secondary"]),onClick:a[5]||(a[5]=d=>xe("map"))},[...a[22]||(a[22]=[i("i",{class:"bi bi-map me-1"},null,-1),w("Map ",-1)])],2)])]),b.value?(v(),g("div",ba,[i("span",null,L(b.value),1),P(I,{variant:"outline-secondary",size:"sm",disabled:y.value,onClick:_e},{default:z(()=>[...a[23]||(a[23]=[w("Retry",-1)])]),_:1},8,["disabled"])])):S("",!0),i("div",ha,[i("div",{ref_key:"listEl",ref:q,class:E(["explore-nearby-results rounded-4",[p.value==="list"?"":"d-none","d-lg-block"]])},[G.value.length===0?(v(),g("div",ka,[a[25]||(a[25]=i("i",{class:"bi bi-compass d-block fs-3 mb-2"},null,-1)),r.favoritesOnly?(v(),g("div",wa,"No saved spots yet. Tap the star on a place to save it.")):r.categories.length===0?(v(),g("div",xa,[...a[24]||(a[24]=[w("Pick a category above — or tap ",-1),i("span",{class:"fw-medium"},"All",-1),w(" — to see places.",-1)])])):(v(),g("div",_a,"No places match here. Widen the distance, clear filters, or move the map and tap “Search this area”."))])):(v(),g("div",Sa,[(v(!0),g(le,null,ce(G.value,d=>(v(),g("button",{key:d.id,type:"button","data-place-id":d.id,class:E(["explore-nearby-card p-3 rounded-4 text-start",{"explore-nearby-card--active":d.id===A.value}]),onClick:Y=>et(d),onMouseenter:Y=>$.value=d.id,onMouseleave:a[10]||(a[10]=Y=>$.value=null)},[i("div",La,[i("span",{class:E(["explore-nearby-swatch flex-shrink-0",`en-cat--${d.category}`])},[i("i",{class:E(["bi",`bi-${he(d.category).icon}`])},null,2)],2),i("div",Ea,[i("div",Aa,L(d.name),1),i("div",$a,[w(L(he(d.category).label)+" ",1),u.value?(v(),g("span",Ma,[a[26]||(a[26]=w(" · ",-1)),i("span",Na,L(We(d)),1)])):S("",!0),d.address?(v(),g("span",Ta," · "+L(d.address),1)):S("",!0)]),d.description?(v(),g("p",Ia,L(d.description),1)):S("",!0),i("div",Pa,[i("span",{class:"btn btn-link btn-sm p-0 explore-nearby-link",role:"button",onClick:W(Y=>st(d),["stop"])},[i("i",{class:E(["bi",ke(d.id)?"bi-star-fill text-warning":"bi-star"])},null,2),w(" "+L(ke(d.id)?"Saved":"Save"),1)],8,Oa),i("a",{href:He(d),target:"_blank",rel:"noopener noreferrer",class:"btn btn-link btn-sm p-0 explore-nearby-link",onClick:a[6]||(a[6]=W(()=>{},["stop"]))},[...a[27]||(a[27]=[i("i",{class:"bi bi-signpost-2 me-1"},null,-1),w("Directions ",-1)])],8,Fa),d.url?(v(),g("a",{key:0,href:d.url,target:"_blank",rel:"noopener noreferrer",class:"btn btn-link btn-sm p-0 explore-nearby-link",onClick:a[7]||(a[7]=W(()=>{},["stop"]))},[...a[28]||(a[28]=[i("i",{class:"bi bi-box-arrow-up-right me-1"},null,-1),w("Website ",-1)])],8,Ra)):S("",!0),d.wikipediaUrl?(v(),g("a",{key:1,href:d.wikipediaUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-link btn-sm p-0 explore-nearby-link",onClick:a[8]||(a[8]=W(()=>{},["stop"]))},[...a[29]||(a[29]=[i("i",{class:"bi bi-journal-text me-1"},null,-1),w("Wikipedia ",-1)])],8,Ua)):S("",!0),!d.url&&!d.wikipediaUrl?(v(),g("a",{key:2,href:Ze(d),target:"_blank",rel:"noopener noreferrer",class:"btn btn-link btn-sm p-0 explore-nearby-link",onClick:a[9]||(a[9]=W(()=>{},["stop"]))},[...a[30]||(a[30]=[i("i",{class:"bi bi-search me-1"},null,-1),w("Look up ",-1)])],8,za)):S("",!0)])])])],42,Ca))),128))]))],2),i("div",{class:E(["explore-nearby-mapcol",[p.value==="map"?"":"d-none","d-lg-block"]])},[P(Qt,{ref_key:"mapRef",ref:K,places:G.value,"selected-id":A.value,"hovered-id":$.value,center:u.value,loading:y.value,onSelect:tt,onHover:a[11]||(a[11]=d=>$.value=d),onRequestSearch:at},null,8,["places","selected-id","hovered-id","center","loading"])],2)]),i("div",Da,"Places and map data from OpenStreetMap. "+L(X.value),1)])}}}),Wa=Be(Ba,[["__scopeId","data-v-ec72f030"]]);export{Wa as default};

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.