react-listing-engine 0.7.21 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # react-listing-engine
2
2
 
3
+ ## 0.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add an `onMapReady` prop to `ListingApp` (and the underlying `ListingMap`): it fires with the map SDK's native map object (`MapHandle.raw` -- the `google.maps.Map` for the Google provider) once the map mounts, and again with `null` when it is torn down. This is the escape hatch for provider-specific features the library doesn't wrap -- e.g. Google data-driven-styling `FeatureLayer`s, custom overlays. Typed `unknown`; cast to your SDK's map type. Fully backward-compatible: omit it and nothing changes.
8
+
3
9
  ## 0.7.10
4
10
 
5
11
  ### Patch Changes
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ var ee=class{state;listeners=new Set;constructor(e){this.state=this.freezeState({filters:{...e.filters},results:{items:[],nextCursor:null},bounds:null,selection:null,hovered:null,pagination:{mode:e.mode??"paged",loading:!1,pageIndex:0},layers:{},points:{}})}getState(){return this.state}setFilters(e){this.setState({filters:{...this.state.filters,...e}})}setResults(e){this.setState({results:{items:[...e.items],nextCursor:e.nextCursor,total:e.total}})}appendResults(e){this.setState({results:{items:[...this.state.results.items,...e.items],nextCursor:e.nextCursor,total:e.total}})}setBounds(e){this.setState({bounds:e?{...e}:null})}setSelection(e){this.setState({selection:e})}setHovered(e){this.setState({hovered:e})}setLayerVisible(e,i){this.setState({layers:{...this.state.layers,[e]:i}})}setLoading(e){this.setState({pagination:{...this.state.pagination,loading:e}})}setPageIndex(e){this.setState({pagination:{...this.state.pagination,pageIndex:e}})}setPoints(e,i){this.setState({points:{...this.state.points,[e]:[...i]}})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}setState(e){this.state=this.freezeState({...this.state,...e}),this.notify()}notify(){for(let e of this.listeners)e()}freezeState(e){Object.freeze(e.filters),Object.freeze(e.results.items),Object.freeze(e.results),e.bounds&&Object.freeze(e.bounds),Object.freeze(e.pagination),Object.freeze(e.layers);for(let i of Object.values(e.points))Object.freeze(i);return Object.freeze(e.points),Object.freeze(e)}};var V=class{defs=new Map;add(e){if(this.defs.has(e.key))throw new Error(`FilterRegistry: filter "${e.key}" is already registered`);return this.defs.set(e.key,{...e}),this}remove(e){return this.defs.delete(e),this}replace(e,i){if(!this.defs.has(e))throw new Error(`FilterRegistry: cannot replace unregistered filter "${e}"`);return this.defs.set(e,{...i,key:e}),this}reorder(e){let i=this.list(),n=e.filter(o=>this.defs.has(o));n.forEach((o,s)=>{this.defs.get(o).order=s});let r=new Set(n);return i.filter(o=>!r.has(o.key)).forEach((o,s)=>{o.order=n.length+s}),this}list(){return[...this.defs.values()].sort((e,i)=>e.order-i.order)}has(e){return this.defs.has(e)}toFilters(e){return this.list().filter(n=>Object.hasOwn(e,n.key)).map(n=>n.toParams(e[n.key])).reduce((n,r)=>({...n,...r}),{})}activeKeys(e){return this.list().filter(i=>i.isActive?.(e)).map(i=>i.key)}clearedParams(){return this.list().reduce((e,i)=>Object.assign(e,i.toParams(i.fromParams({}))),{})}};var te=class{defs=new Map;add(e){if(this.defs.has(e.id))throw new Error(`DatasetRegistry: dataset "${e.id}" is already registered`);return this.defs.set(e.id,{...e}),this}get(e){return this.defs.get(e)}has(e){return this.defs.has(e)}list(){return[...this.defs.values()]}visibleIds(){return this.list().filter(e=>e.visible?.()!==!1).map(e=>e.id)}};var ie=class{map=new Map;dispose(){this.map.clear()}emit(e){let i=this.map.get(e.type);if(i)for(let r of[...i])r(e);let n=this.map.get("*");if(n)for(let r of[...n])r(e)}on(e,i){let n=this.map.get(e);return n||(n=new Set,this.map.set(e,n)),n.add(i),()=>{n.delete(i)}}};var Ae={pagination:"paged",pageSize:20,debounceMs:250};var ne=class{options;constructor(e){this.options=Object.freeze({...Ae,...e})}};var re=class{filters;map;datasets;primaryDatasetId;store;emitter=new ie;config;debounceTimer=null;debounceResolve=null;queryToken=0;pointsToken=0;mapHandle=null;constructor(e){this.datasets=e.datasets,this.filters=e.filters??new V,this.map=e.map,this.config=new ne(e.config);let i=e.primaryDatasetId??this.datasets.list()[0]?.id;if(i==null||!this.datasets.has(i))throw new Error(`ListingEngine: primary dataset "${i??""}" is not registered \u2014 pass a valid primaryDatasetId or register at least one dataset`);this.primaryDatasetId=i,this.store=new ee({filters:e.initialFilters??{},mode:this.config.options.pagination})}get state(){return this.store.getState()}get options(){return this.config.options}applyFilters(e){this.store.setFilters(e),this.emitter.emit({type:"FiltersChanged",filters:this.currentFilters()}),this.clearDebounce();let i=++this.queryToken,n=this.config.options.debounceMs;return n<=0?this.runQuery(i):new Promise(r=>{this.debounceResolve=r,this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.debounceResolve=null,r(this.runQuery(i))},n)})}async loadPage(){let e=this.state.results.nextCursor;if(e===null)return;let i=++this.queryToken,n=this.primaryDataset();this.store.setLoading(!0);try{let r=await n.adapter.list(this.currentFilters(),{cursor:e,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.config.options.pagination==="infinite"?this.store.appendResults(r):this.store.setResults(r),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async goToPage(e){if(e<0)return;let i=++this.queryToken,n=this.primaryDataset();this.store.setLoading(!0);try{let r=await n.adapter.list(this.currentFilters(),{offset:e*this.config.options.pageSize,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.store.setResults(r),this.store.setPageIndex(e),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async loadPoints(e){this.store.setBounds(e),this.emitter.emit({type:"BoundsChanged",bounds:e});let i=this.currentFilters(),n=++this.pointsToken;await Promise.allSettled(this.datasets.visibleIds().map(async r=>{let o=this.datasets.get(r);if(!o)return;let s=await o.adapter.getPoints(i,e);n===this.pointsToken&&this.store.setPoints(r,s)}))}setMapHandle(e){this.mapHandle=e}fitBounds(e,i){!this.map||!this.mapHandle||this.map.fitBounds(this.mapHandle,e,i)}selectPoint(e,i){this.store.setSelection(i);let n=this.state.points[e]?.find(r=>r.id===i);n&&this.emitter.emit({type:"PointClicked",datasetId:e,id:n.id,entity:n.entity})}setHovered(e,i){this.store.setHovered(i)}toggleLayer(e){let n=!(this.state.layers[e]??!0);this.store.setLayerVisible(e,n),this.emitter.emit({type:"LayerToggled",datasetId:e,visible:n})}subscribe(e){return this.store.subscribe(e)}on(e,i){return this.emitter.on(e,i)}dispose(){this.clearDebounce(),this.emitter.dispose(),this.mapHandle=null}async runQuery(e){if(e!==this.queryToken)return;let i=this.primaryDataset();this.store.setLoading(!0);try{let n=await i.adapter.list(this.currentFilters(),{cursor:null,limit:this.config.options.pageSize});if(e!==this.queryToken)return;this.store.setResults(n),this.store.setPageIndex(0),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:n.items.length})}finally{e===this.queryToken&&this.store.setLoading(!1)}}primaryDataset(){return this.datasets.get(this.primaryDatasetId)}currentFilters(){return this.store.getState().filters}clearDebounce(){this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.debounceResolve!==null&&(this.debounceResolve(),this.debounceResolve=null)}};function ze(...t){let e={config:{},filters:new V,datasets:new te};for(let i of t)i(e);return e}var Ue=t=>e=>{e.config={...e.config,...t}},Ke=t=>e=>{e.map=t},Ve=t=>e=>{e.datasets.add(t)},qe=t=>e=>{t(e.filters)},Di=t=>e=>{e.urlSync=t},$e=t=>e=>{e.initialFilters=t},Bi=t=>e=>{e.primaryDatasetId=t};import{createContext as bt,useContext as Lt}from"react";import{jsx as k,jsxs as Ge}from"react/jsx-runtime";function Tt(t){return String(t?.title??"")}var Pt=({item:t})=>k("div",{children:Tt(t)}),Ft=()=>k("div",{}),fe=()=>k("div",{}),kt=({children:t})=>k("div",{children:t}),Ct=({children:t})=>k("div",{children:t}),St=({value:t,onChange:e,placeholder:i})=>k("input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":i??"Search"}),wt=()=>k("div",{role:"status",children:"No results"}),It=()=>k("div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),Et=({count:t})=>Ge("div",{children:[t," results"]}),xt=({children:t})=>k("div",{children:t}),Nt=({view:t,onViewChange:e})=>Ge("nav",{"aria-label":"Listing navigation",children:[k("button",{type:"button","aria-pressed":t==="list",onClick:()=>e("list"),children:"List"}),k("button",{type:"button","aria-pressed":t==="map",onClick:()=>e("map"),children:"Map"})]}),F={BottomNav:Nt,Card:Pt,Marker:Ft,Popup:fe,Sidebar:kt,FilterPanel:Ct,Search:St,Empty:wt,Loading:It,ResultHeader:Et,Toolbar:xt},We=bt(F);function je(t){let{BottomNav:e,Card:i,Marker:n,Popup:r,Sidebar:o,FilterPanel:s,Search:a,Empty:p,Loading:d,ResultHeader:l,Toolbar:m,children:c}=t,N={BottomNav:e??F.BottomNav,Card:i??F.Card,Marker:n??F.Marker,Popup:r??F.Popup,Sidebar:o??F.Sidebar,FilterPanel:s??F.FilterPanel,Search:a??F.Search,Empty:p??F.Empty,Loading:d??F.Loading,ResultHeader:l??F.ResultHeader,Toolbar:m??F.Toolbar};return k(We.Provider,{value:N,children:c})}function C(){return Lt(We)}import{createContext as Rt}from"react";var se=Rt(null);import{useContext as Mt}from"react";function v(){let t=Mt(se);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}import{useCallback as Qe,useSyncExternalStore as Dt}from"react";function S(){let t=v(),e=Qe(n=>t.subscribe(n),[t]),i=Qe(()=>t.state,[t]);return Dt(e,i,i)}import{useCallback as Ze}from"react";function oe(){let t=v(),e=S(),i=Ze(r=>t.applyFilters(r),[t]),n=Ze((r,o)=>t.applyFilters({[r]:o}),[t]);return{filters:e.filters,set:i,setField:n}}import{jsx as Q,jsxs as Bt}from"react/jsx-runtime";function ye({className:t,groupClassName:e,hideLabels:i,draft:n,onDraftChange:r}={}){let o=v(),{FilterPanel:s}=C(),{filters:a}=oe(),p=n!==void 0&&r!==void 0,d=p?n:a;return Q(s,{children:Q("div",{className:t??"space-y-5",children:o.filters.list().map(l=>{if(typeof l.render=="string")return Q("div",{"data-filter":l.key,className:e},l.key);let m=l.render;return Bt("div",{className:e,children:[l.label&&!i&&Q("div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:l.label}),Q(m,{value:l.fromParams(d),onChange:c=>p?r(l.toParams(c)):void o.applyFilters(l.toParams(c))})]},l.key)})})})}function q(){return S().results}import{jsx as ae}from"react/jsx-runtime";function Ot(t,e){if(t&&typeof t=="object"&&"id"in t){let i=t.id;if(typeof i=="string"||typeof i=="number")return i}return e}function Xe({className:t}={}){let e=v(),{items:i}=q(),{pagination:n,selection:r}=S(),{Card:o,Empty:s,Loading:a}=C();return n.loading&&i.length===0?ae(a,{}):i.length===0?ae(s,{}):ae("div",{role:"list",className:t,children:i.map((p,d)=>{let l=Ot(p,d);return ae(o,{item:p,selected:r===l,onSelect:()=>e.selectPoint(e.primaryDatasetId,l)},l)})})}import{useEffect as Z,useRef as B,useState as Je}from"react";import{createPortal as _t}from"react-dom";import{jsx as ve,jsxs as tt}from"react/jsx-runtime";var Ht={west:-179.9,south:-85,east:179.9,north:85},Ye=.1,et=.02;function At(t){if(t.length===0)return null;let e=t[0].lng,i=t[0].lng,n=t[0].lat,r=t[0].lat;for(let{lat:a,lng:p}of t)p<e&&(e=p),p>i&&(i=p),a<n&&(n=a),a>r&&(r=a);let o=r>n?(r-n)*Ye:et,s=i>e?(i-e)*Ye:et;return{west:e-s,east:i+s,south:n-o,north:r+o}}function it(t){let{center:e,zoom:i,fallback:n,mapControls:r,onMapReady:o}=t,s=v(),a=S(),p=B(o);p.current=o;let d=B(null),l=B(null),m=B(null),[c,N]=Je(!1),O=B(!1),_=B(!1),I=B(!1),u=s.map;Z(()=>{let P=m.current;if(!u||!P)return;let h=[];for(let g of Object.keys(a.points)){if(a.layers[g]===!1)continue;let f=s.datasets.get(g),x=a.points[g]??[],j={id:g,markers:x.map(R=>({id:R.id,position:R.position,iconUrl:f?.marker.iconUrl?.(R.entity),element:f?.marker.element?.(R.entity)})),clustering:f?.clustering,onMarkerClick:R=>s.selectPoint(g,R)};h.push(u.renderLayer(P,j))}return()=>{h.forEach(g=>g())}},[s,u,c,a.points,a.layers]),Z(()=>{if(!d.current||!u)return;let P=d.current,h=!1,g=null;return(async()=>{let f=await u.mount(P,{center:e,zoom:i,fullscreenTarget:l.current??void 0});if(h){u.destroy(f);return}m.current=f,s.setMapHandle(f),g=u.onBoundsChange(f,x=>{I.current?I.current=!1:_.current=!0,s.loadPoints(x)}),N(!0),p.current?.(f.raw),s.loadPoints(Ht)})(),()=>{h=!0,g?.(),m.current&&(u.destroy(m.current),m.current=null,s.setMapHandle(null),p.current?.(null)),N(!1)}},[s,u]),Z(()=>{let P=m.current;if(!u||!P||e||O.current||_.current)return;let h=[];for(let f of Object.keys(a.points))if(a.layers[f]!==!1)for(let x of a.points[f]??[])h.push(x.position);let g=At(h);g&&(O.current=!0,I.current=!0,u.fitBounds(P,g))},[u,e,c,a.points,a.layers]),Z(()=>{u?.updateMarkerStates(a.selection,a.hovered)},[u,c,a.selection,a.hovered]);let{Popup:L}=C(),T=L!==fe,U=a.points[s.primaryDatasetId]??[],K=a.selection!=null?U.find(P=>P.id===a.selection):void 0,[E,H]=Je(null),Y=B(K);return Y.current=K,Z(()=>{let P=m.current;if(!u||!P||!T)return;let h=Y.current;if(!h)return;let g=u.mountOverlay(h.position);H({entity:h.entity,position:h.position,container:g.container});let f=()=>s.selectPoint(s.primaryDatasetId,null),x=R=>{R.key==="Escape"&&f()};document.addEventListener("keydown",x);let j=u.onMapClick(f);return()=>{document.removeEventListener("keydown",x),j(),g.unmount(),H(null)}},[s,u,c,a.selection,T]),tt("div",{ref:l,className:"relative h-full min-h-0 w-full",children:[tt("div",{ref:d,className:!u&&n?"flex h-full min-h-0 w-full items-center justify-center":"h-full min-h-0 w-full",children:[!u&&n,T&&E?_t(ve(L,{entity:E.entity,onClose:()=>s.selectPoint(s.primaryDatasetId,null)}),E.container):null]}),r!=null&&ve("div",{className:"pointer-events-none absolute inset-0",children:ve("div",{className:"pointer-events-auto",children:r})})]})}import{jsx as X,jsxs as Ut}from"react/jsx-runtime";var he="gap";function zt(t,e){if(t<=7)return Array.from({length:t},(o,s)=>s+1);let i=Math.max(2,e-1),n=Math.min(t-1,e+1),r=[1];i>2&&r.push(he);for(let o=i;o<=n;o+=1)r.push(o);return n<t-1&&r.push(he),r.push(t),r}function nt(){let t=v(),{results:e,pagination:i}=S();if(i.mode==="infinite")return e.nextCursor==null?null:X("button",{type:"button",disabled:i.loading,onClick:()=>{t.loadPage()},children:"Load more"});let n=t.options.pageSize,{pageIndex:r}=i,o=r+1,s=e.total!=null?Math.ceil(e.total/n):null,a=s!=null?o<s:e.nextCursor!=null||e.items.length>=n;if(s!=null?s<=1:r===0&&!a)return null;let p=d=>()=>{t.goToPage(d)};return Ut("nav",{className:"rle-pagination","aria-label":"Pagination",children:[X("button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Previous page",disabled:i.loading||r===0,onClick:p(r-1),children:"\u2039"}),s!=null&&zt(s,o).map((d,l)=>d===he?X("span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${l}`):X("button",{type:"button",className:d===o?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${d}`,"aria-current":d===o?"page":void 0,disabled:i.loading,onClick:p(d-1),children:d},d)),X("button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Next page",disabled:i.loading||!a,onClick:p(r+1),children:"\u203A"})]})}import{jsx as Kt}from"react/jsx-runtime";function rt(){let{items:t,total:e}=q(),{ResultHeader:i}=C();return Kt(i,{count:t.length,total:e})}import{useEffect as Vt,useRef as qt}from"react";function st(t,e){let i=v(),n=qt(e);n.current=e,Vt(()=>i.on(t,r=>n.current(r)),[i,t])}import{useEffect as $t,useState as ot}from"react";import{jsx as Wt}from"react/jsx-runtime";function at(t){let{children:e,...i}=t,[n]=ot(()=>i),[r,o]=ot(null);return $t(()=>{let s=new re({datasets:n.datasets,filters:n.filters,config:n.config,map:n.map,initialFilters:n.initialFilters,primaryDatasetId:n.primaryDatasetId});return n.urlSync&&n.urlSync.start(s),o(s),()=>{n.urlSync&&n.urlSync.stop(),s.dispose(),o(a=>a===s?null:a)}},[n]),r?Wt(se.Provider,{value:r,children:e}):null}import{jsx as w,jsxs as J}from"react/jsx-runtime";function lt({view:t,onViewChange:e}){return w("nav",{className:"rle-bottom-nav","aria-label":"Listing navigation",children:J("div",{className:"rle-viewtoggle",role:"group","aria-label":"View",children:[J("button",{type:"button",className:`rle-viewtoggle__btn${t==="list"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="list",onClick:()=>e("list"),children:[w(jt,{}),"List"]}),J("button",{type:"button",className:`rle-viewtoggle__btn${t==="map"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="map",onClick:()=>e("map"),children:[w(Gt,{}),"Map"]})]})})}function jt(){return J("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[w("line",{x1:"8",y1:"6",x2:"20",y2:"6"}),w("line",{x1:"8",y1:"12",x2:"20",y2:"12"}),w("line",{x1:"8",y1:"18",x2:"20",y2:"18"}),w("line",{x1:"4",y1:"6",x2:"4.01",y2:"6"}),w("line",{x1:"4",y1:"12",x2:"4.01",y2:"12"}),w("line",{x1:"4",y1:"18",x2:"4.01",y2:"18"})]})}function Gt(){return J("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[w("polygon",{points:"1 6 8 3 16 6 23 3 23 18 16 21 8 18 1 21 1 6"}),w("line",{x1:"8",y1:"3",x2:"8",y2:"18"}),w("line",{x1:"16",y1:"6",x2:"16",y2:"21"})]})}function $(t){return typeof t!="number"?t:new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0}).format(t)}import{Fragment as Zt,jsx as M,jsxs as dt}from"react/jsx-runtime";function Qt(t){return t?"rle-card rle-card--selected":"rle-card"}function be({item:t,selected:e,onSelect:i}){let n=t??{},r=Qt(e),o=dt(Zt,{children:[n.imageUrl?M("img",{src:n.imageUrl,alt:n.title??"",className:"rle-card-media"}):M("div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),dt("div",{className:"rle-card-body",children:[n.title&&M("span",{className:"rle-card-title",children:n.title}),n.subtitle&&M("span",{className:"rle-card-address",children:n.subtitle}),n.badge&&M("div",{className:"rle-card-info",children:M("span",{className:"rle-card-info-item",children:n.badge})}),n.price!=null&&M("span",{className:"rle-card-price",children:$(n.price)})]})]});return i?M("button",{type:"button",onClick:i,"aria-pressed":e??!1,className:r,children:o}):M("article",{className:r,children:o})}import{jsx as le,jsxs as pt}from"react/jsx-runtime";function Le(t){return pt("div",{role:"status",className:"rle-empty",children:[pt("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",className:"rle-empty-icon","aria-hidden":"true",children:[le("circle",{cx:"11",cy:"11",r:"7"}),le("path",{d:"m21 21-4.3-4.3"})]}),le("p",{className:"rle-empty-title",children:"No results"}),le("p",{className:"rle-empty-hint",children:"Try adjusting your filters or search terms."})]})}import{jsx as Xt}from"react/jsx-runtime";function Te({children:t}){return Xt("div",{className:"rle-filter-panel",children:t})}import{jsx as de,jsxs as Jt}from"react/jsx-runtime";function Pe(t){return de("div",{className:"rle-loading",role:"status","aria-busy":"true","aria-label":"Loading results",children:Array.from({length:3}).map((e,i)=>Jt("div",{className:"rle-loading-item",children:[de("div",{className:"rle-skeleton",style:{aspectRatio:"4 / 3",width:"100%"}}),de("div",{className:"rle-skeleton",style:{height:16,width:"65%"}}),de("div",{className:"rle-skeleton",style:{height:12,width:"35%"}})]},i))})}import{jsx as Yt}from"react/jsx-runtime";function Fe({point:t}){let e=t.entity??{};return Yt("span",{className:"rle-pin",children:e.price!=null?$(e.price):""})}import{jsx as W,jsxs as ke}from"react/jsx-runtime";function Ce({entity:t,onClose:e}){let i=t??{};return ke("div",{className:"rle-popup",role:"group","aria-label":"Location details",children:[W("button",{type:"button",onClick:e,"aria-label":"Close",className:"rle-popup-close",children:ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[W("path",{d:"M18 6 6 18"}),W("path",{d:"m6 6 12 12"})]})}),ke("div",{children:[i.title&&W("div",{className:"rle-card-title",children:i.title}),i.subtitle&&W("div",{className:"rle-card-address",children:i.subtitle}),i.price!=null&&W("div",{className:"rle-card-price",children:$(i.price)})]})]})}import{jsx as ei}from"react/jsx-runtime";function Se({count:t,total:e}){let i=e!=null&&e!==t?`${t} of ${e} results`:`${t} results`;return ei("div",{className:"rle-result-header",children:i})}import{jsx as ti}from"react/jsx-runtime";function we({value:t,onChange:e,placeholder:i}){return ti("input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":i??"Search",className:"rle-input"})}import{jsx as ii}from"react/jsx-runtime";function Ie({children:t}){return ii("aside",{className:"rle-sidebar",children:t})}import{jsx as ni}from"react/jsx-runtime";function Ee({children:t}){return ni("div",{className:"rle-toolbar",children:t})}var ut={BottomNav:lt,Card:be,Marker:Fe,Popup:Ce,Sidebar:Ie,FilterPanel:Te,Search:we,Empty:Le,Loading:Pe,ResultHeader:Se,Toolbar:Ee};import{useEffect as xe,useRef as ri,useState as ct}from"react";import{createPortal as si}from"react-dom";import{Fragment as ai,jsx as D,jsxs as pe}from"react/jsx-runtime";function mt({open:t,onOpenChange:e,title:i,children:n,footer:r}){let o=ri(null),[s,a]=ct(!1),[p,d]=ct(!1);return xe(()=>{if(!t){d(!1),a(!1);return}a(!0);let l=requestAnimationFrame(()=>d(!0));return()=>cancelAnimationFrame(l)},[t]),xe(()=>{if(!s)return;let l=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=l}},[s]),xe(()=>{if(!s)return;o.current?.focus();function l(m){m.key==="Escape"&&e(!1)}return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[s,e]),!s||typeof document>"u"?null:si(pe(ai,{children:[D("div",{className:`rle-sheet-backdrop${p?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),pe("div",{ref:o,className:`rle-sheet${p?" rle-sheet--open":""}`,role:"dialog","aria-modal":"true","aria-label":i,tabIndex:-1,children:[D("div",{className:"rle-sheet__handle","aria-hidden":"true"}),pe("div",{className:"rle-sheet__header",children:[i&&D("div",{className:"rle-sheet__title",children:i}),D("button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:D(oi,{})})]}),D("div",{className:"rle-sheet__body",children:n}),r&&D("div",{className:"rle-sheet__footer",children:r})]})]}),document.body)}function oi(){return pe("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[D("path",{d:"M18 6 6 18"}),D("path",{d:"m6 6 12 12"})]})}import{useEffect as ce,useRef as Ne,useState as z}from"react";import{jsx as b,jsxs as ue}from"react/jsx-runtime";function gt({search:t,onFiltersClick:e,filterCount:i=0,action:n}){let{Search:r}=C();return ue("header",{className:"rle-mobile-header",children:[t&&b("div",{className:"rle-mobile-header__search",children:b(r,{value:t.value,onChange:t.onChange,placeholder:t.placeholder})}),ue("button",{type:"button",className:"rle-btn rle-mobile-header__btn",onClick:e,children:[b(li,{}),b("span",{children:"Filters"}),i>0&&b("span",{className:"rle-mobile-header__count",children:i})]}),n&&b("button",{type:"button",className:"rle-btn rle-mobile-header__btn rle-mobile-header__btn--icon",onClick:n.onClick,"aria-label":n.label,children:n.icon??b(di,{})})]})}function li(){return ue("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[b("line",{x1:"4",y1:"6",x2:"20",y2:"6"}),b("circle",{cx:"9",cy:"6",r:"2",fill:"currentColor",stroke:"none"}),b("line",{x1:"4",y1:"12",x2:"20",y2:"12"}),b("circle",{cx:"15",cy:"12",r:"2",fill:"currentColor",stroke:"none"}),b("line",{x1:"4",y1:"18",x2:"20",y2:"18"}),b("circle",{cx:"11",cy:"18",r:"2",fill:"currentColor",stroke:"none"})]})}function di(){return ue("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[b("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),b("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}import{Fragment as mi,jsx as y,jsxs as A}from"react/jsx-runtime";var pi=y("div",{className:"rle-empty",children:"Map unavailable"});function ui(){let t=Ne(null),[e,i]=z(!0),[n,r]=z(!0);return ce(()=>{let o=t.current;if(!o)return;let s=()=>{let{clientWidth:m,scrollLeft:c,scrollWidth:N}=o;i(c<=0),r(c+m>=N-1)},a=0,p=()=>{a||(a=requestAnimationFrame(()=>{a=0,s()}))};s(),o.addEventListener("scroll",s,{passive:!0});let d,l;return typeof ResizeObserver<"u"&&(d=new ResizeObserver(s),d.observe(o)),typeof MutationObserver<"u"&&(l=new MutationObserver(p),l.observe(o,{characterData:!0,childList:!0,subtree:!0})),()=>{o.removeEventListener("scroll",s),d?.disconnect(),l?.disconnect(),a&&cancelAnimationFrame(a)}},[]),{atEnd:n,atStart:e,ref:t}}function ci(t,e){if(t===e)return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;let i=t,n=e,r=new Set([...Object.keys(i),...Object.keys(n)]);for(let o of r)if(i[o]!==n[o])return!1;return!0}function ft({search:t,filterBarStart:e,toolbarEnd:i,mobileAction:n,autoFetch:r=!0,hasMap:o,mapCenter:s,mapZoom:a,mapControls:p,onMapReady:d,mobileSheetFooter:l,className:m}){let c=v(),{BottomNav:N,Search:O}=C(),_=q(),{filters:I,set:u}=oe(),{pagination:L}=S(),T=o??c.map!=null,[U,K]=z("list"),[E,H]=z(!1),{atEnd:Y,atStart:P,ref:h}=ui(),g=Ne(null);ce(()=>{L.mode==="paged"&&g.current&&(g.current.scrollTop=0)},[L.mode,L.pageIndex]);let[f,x]=z(I),[j,R]=z(E);E!==j&&(R(E),E&&x(I));let Me=ge=>x(ht=>({...ht,...ge})),[De,Be]=z(!1),me=Ne(!1);ce(()=>{if(De){if(L.loading){me.current=!0;return}me.current&&(me.current=!1,Be(!1),H(!1))}},[De,L.loading]);let G=t?{value:String(I[t.filterKey]??""),onChange:ge=>{u({[t.filterKey]:ge||void 0})},placeholder:t.placeholder}:void 0;ce(()=>{r!==!1&&c.applyFilters({})},[c,r]);let Oe=()=>{Me(c.filters.clearedParams())},_e=()=>{if(ci(f,I)){H(!1);return}Be(!0),c.applyFilters(f)},vt=c.filters.activeKeys(I).length,He=_.total??_.items.length;return A("div",{className:m?`rle-app ${m}`:"rle-app",children:[A("div",{className:"rle-filter-bar",children:[A("div",{className:"rle-filter-bar__scroll",ref:h,children:[G&&y("div",{className:"rle-filter-bar__search",children:y(O,{value:G.value,onChange:G.onChange,placeholder:G.placeholder})}),e&&y("div",{className:"rle-filter-bar__slot",children:e}),y(ye,{className:"rle-filters-row",groupClassName:"rle-filter-group",hideLabels:!0})]}),!P&&y("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!Y&&y("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),y(gt,{search:G,onFiltersClick:()=>H(!0),filterCount:vt,action:n}),A("div",{className:`rle-body ${T?"rle-split":"rle-body--list-only"}`,"data-mobile-view":U,children:[A("div",{className:"rle-list",ref:g,children:[A("div",{className:"rle-list-header",children:[y(rt,{}),i&&y("div",{className:"rle-list-header__toolbar",children:i})]}),y(Xe,{className:"rle-list-grid"}),y(nt,{})]}),T&&y("div",{className:"rle-map",children:y(it,{center:s,zoom:a,fallback:pi,mapControls:p,onMapReady:d})})]}),T&&y(N,{view:U,onViewChange:K}),y(mt,{title:"Filters",open:E,onOpenChange:H,footer:l?l({draft:f,apply:_e,clear:Oe,resultCount:He,loading:L.loading}):A(mi,{children:[y("button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:Oe,children:"Clear all"}),y("button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:L.loading,onClick:_e,children:L.loading?y("span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${He} results`})]}),children:y(ye,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:f,onDraftChange:Me})})]})}import{useEffect as gi,useRef as fi,useState as yi}from"react";import{jsx as Re,jsxs as bi}from"react/jsx-runtime";function yt(t){return"provider"in t}function vi(t){let e=t!=null&&!yt(t),i=e?t.apiKey:void 0,n=e?t.mapId:void 0,r=e?t.mapOptions:void 0,o=e?t.styles:void 0,s=e?t.overlayMarkers:void 0,[a,p]=yi(()=>!t||yt(t)?{ready:!0,provider:t?.provider}:{ready:!1});return gi(()=>{if(!i)return;let d=!1;return import("./maps/google/index.js").then(({googleProvider:l})=>{d||p({ready:!0,provider:l({apiKey:i,mapId:n,mapOptions:r,styles:o,overlayMarkers:s})})}),()=>{d=!0}},[i,n]),a}function hi({onFiltersChange:t}){let e=fi(t);return e.current=t,st("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function Ar(t){let{datasets:e,filters:i,map:n,components:r,initialFilters:o,onFiltersChange:s,mobileAction:a,search:p,filterBarStart:d,toolbarEnd:l,mapControls:m,onMapReady:c,mobileSheetFooter:N,config:O,autoFetch:_,className:I}=t,{ready:u,provider:L}=vi(n);if(!u)return null;let T=[];for(let E of e)T.push(Ve(E));i&&T.push(qe(i)),L&&T.push(Ke(L)),o&&T.push($e(o)),O&&T.push(Ue(O));let U=ze(...T),K={...ut,...r};return bi(at,{...U,children:[s&&Re(hi,{onFiltersChange:s}),Re(je,{...K,children:Re(ft,{className:I,search:p,filterBarStart:d,toolbarEnd:l,mobileAction:a,autoFetch:_,mapCenter:n?.center,mapZoom:n?.zoom,mapControls:m,onMapReady:c,mobileSheetFooter:N})})]})}export{ee as a,V as b,te as c,ie as d,Ae as e,ne as f,re as g,ze as h,Ue as i,Ke as j,Ve as k,qe as l,Di as m,$e as n,Bi as o,fe as p,je as q,C as r,se as s,v as t,S as u,oe as v,ye as w,q as x,Xe as y,it as z,nt as A,rt as B,st as C,at as D,lt as E,be as F,Le as G,Te as H,Pe as I,Fe as J,Ce as K,Se as L,we as M,Ie as N,Ee as O,ut as P,mt as Q,ft as R,Ar as S};
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5;"use client";
2
+ var ee= (_class =class{__init() {this.listeners=new Set}constructor(e){;_class.prototype.__init.call(this);this.state=this.freezeState({filters:{...e.filters},results:{items:[],nextCursor:null},bounds:null,selection:null,hovered:null,pagination:{mode:_nullishCoalesce(e.mode, () => ("paged")),loading:!1,pageIndex:0},layers:{},points:{}})}getState(){return this.state}setFilters(e){this.setState({filters:{...this.state.filters,...e}})}setResults(e){this.setState({results:{items:[...e.items],nextCursor:e.nextCursor,total:e.total}})}appendResults(e){this.setState({results:{items:[...this.state.results.items,...e.items],nextCursor:e.nextCursor,total:e.total}})}setBounds(e){this.setState({bounds:e?{...e}:null})}setSelection(e){this.setState({selection:e})}setHovered(e){this.setState({hovered:e})}setLayerVisible(e,i){this.setState({layers:{...this.state.layers,[e]:i}})}setLoading(e){this.setState({pagination:{...this.state.pagination,loading:e}})}setPageIndex(e){this.setState({pagination:{...this.state.pagination,pageIndex:e}})}setPoints(e,i){this.setState({points:{...this.state.points,[e]:[...i]}})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}setState(e){this.state=this.freezeState({...this.state,...e}),this.notify()}notify(){for(let e of this.listeners)e()}freezeState(e){Object.freeze(e.filters),Object.freeze(e.results.items),Object.freeze(e.results),e.bounds&&Object.freeze(e.bounds),Object.freeze(e.pagination),Object.freeze(e.layers);for(let i of Object.values(e.points))Object.freeze(i);return Object.freeze(e.points),Object.freeze(e)}}, _class);var V= (_class2 =class{constructor() { _class2.prototype.__init2.call(this); }__init2() {this.defs=new Map}add(e){if(this.defs.has(e.key))throw new Error(`FilterRegistry: filter "${e.key}" is already registered`);return this.defs.set(e.key,{...e}),this}remove(e){return this.defs.delete(e),this}replace(e,i){if(!this.defs.has(e))throw new Error(`FilterRegistry: cannot replace unregistered filter "${e}"`);return this.defs.set(e,{...i,key:e}),this}reorder(e){let i=this.list(),n=e.filter(o=>this.defs.has(o));n.forEach((o,s)=>{this.defs.get(o).order=s});let r=new Set(n);return i.filter(o=>!r.has(o.key)).forEach((o,s)=>{o.order=n.length+s}),this}list(){return[...this.defs.values()].sort((e,i)=>e.order-i.order)}has(e){return this.defs.has(e)}toFilters(e){return this.list().filter(n=>Object.hasOwn(e,n.key)).map(n=>n.toParams(e[n.key])).reduce((n,r)=>({...n,...r}),{})}activeKeys(e){return this.list().filter(i=>_optionalChain([i, 'access', _2 => _2.isActive, 'optionalCall', _3 => _3(e)])).map(i=>i.key)}clearedParams(){return this.list().reduce((e,i)=>Object.assign(e,i.toParams(i.fromParams({}))),{})}}, _class2);var te= (_class3 =class{constructor() { _class3.prototype.__init3.call(this); }__init3() {this.defs=new Map}add(e){if(this.defs.has(e.id))throw new Error(`DatasetRegistry: dataset "${e.id}" is already registered`);return this.defs.set(e.id,{...e}),this}get(e){return this.defs.get(e)}has(e){return this.defs.has(e)}list(){return[...this.defs.values()]}visibleIds(){return this.list().filter(e=>_optionalChain([e, 'access', _4 => _4.visible, 'optionalCall', _5 => _5()])!==!1).map(e=>e.id)}}, _class3);var ie= (_class4 =class{constructor() { _class4.prototype.__init4.call(this); }__init4() {this.map=new Map}dispose(){this.map.clear()}emit(e){let i=this.map.get(e.type);if(i)for(let r of[...i])r(e);let n=this.map.get("*");if(n)for(let r of[...n])r(e)}on(e,i){let n=this.map.get(e);return n||(n=new Set,this.map.set(e,n)),n.add(i),()=>{n.delete(i)}}}, _class4);var Ae={pagination:"paged",pageSize:20,debounceMs:250};var ne=class{constructor(e){this.options=Object.freeze({...Ae,...e})}};var re= (_class5 =class{__init5() {this.emitter=new ie}__init6() {this.debounceTimer=null}__init7() {this.debounceResolve=null}__init8() {this.queryToken=0}__init9() {this.pointsToken=0}__init10() {this.mapHandle=null}constructor(e){;_class5.prototype.__init5.call(this);_class5.prototype.__init6.call(this);_class5.prototype.__init7.call(this);_class5.prototype.__init8.call(this);_class5.prototype.__init9.call(this);_class5.prototype.__init10.call(this);this.datasets=e.datasets,this.filters=_nullishCoalesce(e.filters, () => (new V)),this.map=e.map,this.config=new ne(e.config);let i=_nullishCoalesce(e.primaryDatasetId, () => (_optionalChain([this, 'access', _6 => _6.datasets, 'access', _7 => _7.list, 'call', _8 => _8(), 'access', _9 => _9[0], 'optionalAccess', _10 => _10.id])));if(i==null||!this.datasets.has(i))throw new Error(`ListingEngine: primary dataset "${_nullishCoalesce(i, () => (""))}" is not registered \u2014 pass a valid primaryDatasetId or register at least one dataset`);this.primaryDatasetId=i,this.store=new ee({filters:_nullishCoalesce(e.initialFilters, () => ({})),mode:this.config.options.pagination})}get state(){return this.store.getState()}get options(){return this.config.options}applyFilters(e){this.store.setFilters(e),this.emitter.emit({type:"FiltersChanged",filters:this.currentFilters()}),this.clearDebounce();let i=++this.queryToken,n=this.config.options.debounceMs;return n<=0?this.runQuery(i):new Promise(r=>{this.debounceResolve=r,this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.debounceResolve=null,r(this.runQuery(i))},n)})}async loadPage(){let e=this.state.results.nextCursor;if(e===null)return;let i=++this.queryToken,n=this.primaryDataset();this.store.setLoading(!0);try{let r=await n.adapter.list(this.currentFilters(),{cursor:e,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.config.options.pagination==="infinite"?this.store.appendResults(r):this.store.setResults(r),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async goToPage(e){if(e<0)return;let i=++this.queryToken,n=this.primaryDataset();this.store.setLoading(!0);try{let r=await n.adapter.list(this.currentFilters(),{offset:e*this.config.options.pageSize,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.store.setResults(r),this.store.setPageIndex(e),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async loadPoints(e){this.store.setBounds(e),this.emitter.emit({type:"BoundsChanged",bounds:e});let i=this.currentFilters(),n=++this.pointsToken;await Promise.allSettled(this.datasets.visibleIds().map(async r=>{let o=this.datasets.get(r);if(!o)return;let s=await o.adapter.getPoints(i,e);n===this.pointsToken&&this.store.setPoints(r,s)}))}setMapHandle(e){this.mapHandle=e}fitBounds(e,i){!this.map||!this.mapHandle||this.map.fitBounds(this.mapHandle,e,i)}selectPoint(e,i){this.store.setSelection(i);let n=_optionalChain([this, 'access', _11 => _11.state, 'access', _12 => _12.points, 'access', _13 => _13[e], 'optionalAccess', _14 => _14.find, 'call', _15 => _15(r=>r.id===i)]);n&&this.emitter.emit({type:"PointClicked",datasetId:e,id:n.id,entity:n.entity})}setHovered(e,i){this.store.setHovered(i)}toggleLayer(e){let n=!(_nullishCoalesce(this.state.layers[e], () => (!0)));this.store.setLayerVisible(e,n),this.emitter.emit({type:"LayerToggled",datasetId:e,visible:n})}subscribe(e){return this.store.subscribe(e)}on(e,i){return this.emitter.on(e,i)}dispose(){this.clearDebounce(),this.emitter.dispose(),this.mapHandle=null}async runQuery(e){if(e!==this.queryToken)return;let i=this.primaryDataset();this.store.setLoading(!0);try{let n=await i.adapter.list(this.currentFilters(),{cursor:null,limit:this.config.options.pageSize});if(e!==this.queryToken)return;this.store.setResults(n),this.store.setPageIndex(0),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:n.items.length})}finally{e===this.queryToken&&this.store.setLoading(!1)}}primaryDataset(){return this.datasets.get(this.primaryDatasetId)}currentFilters(){return this.store.getState().filters}clearDebounce(){this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.debounceResolve!==null&&(this.debounceResolve(),this.debounceResolve=null)}}, _class5);function ze(...t){let e={config:{},filters:new V,datasets:new te};for(let i of t)i(e);return e}var Ue=t=>e=>{e.config={...e.config,...t}},Ke= exports.j =t=>e=>{e.map=t},Ve= exports.k =t=>e=>{e.datasets.add(t)},qe= exports.l =t=>e=>{t(e.filters)},Di= exports.m =t=>e=>{e.urlSync=t},$e= exports.n =t=>e=>{e.initialFilters=t},Bi= exports.o =t=>e=>{e.primaryDatasetId=t};var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function Tt(t){return String(_nullishCoalesce(_optionalChain([t, 'optionalAccess', _16 => _16.title]), () => ("")))}var Pt=({item:t})=>_jsxruntime.jsx.call(void 0, "div",{children:Tt(t)}),Ft=()=>_jsxruntime.jsx.call(void 0, "div",{}),fe= exports.p =()=>_jsxruntime.jsx.call(void 0, "div",{}),kt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Ct=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),St=({value:t,onChange:e,placeholder:i})=>_jsxruntime.jsx.call(void 0, "input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":_nullishCoalesce(i, () => ("Search"))}),wt=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status",children:"No results"}),It=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),Et=({count:t})=>_jsxruntime.jsxs.call(void 0, "div",{children:[t," results"]}),xt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Nt=({view:t,onViewChange:e})=>_jsxruntime.jsxs.call(void 0, "nav",{"aria-label":"Listing navigation",children:[_jsxruntime.jsx.call(void 0, "button",{type:"button","aria-pressed":t==="list",onClick:()=>e("list"),children:"List"}),_jsxruntime.jsx.call(void 0, "button",{type:"button","aria-pressed":t==="map",onClick:()=>e("map"),children:"Map"})]}),F={BottomNav:Nt,Card:Pt,Marker:Ft,Popup:fe,Sidebar:kt,FilterPanel:Ct,Search:St,Empty:wt,Loading:It,ResultHeader:Et,Toolbar:xt},We=_react.createContext.call(void 0, F);function je(t){let{BottomNav:e,Card:i,Marker:n,Popup:r,Sidebar:o,FilterPanel:s,Search:a,Empty:p,Loading:d,ResultHeader:l,Toolbar:m,children:c}=t,N={BottomNav:_nullishCoalesce(e, () => (F.BottomNav)),Card:_nullishCoalesce(i, () => (F.Card)),Marker:_nullishCoalesce(n, () => (F.Marker)),Popup:_nullishCoalesce(r, () => (F.Popup)),Sidebar:_nullishCoalesce(o, () => (F.Sidebar)),FilterPanel:_nullishCoalesce(s, () => (F.FilterPanel)),Search:_nullishCoalesce(a, () => (F.Search)),Empty:_nullishCoalesce(p, () => (F.Empty)),Loading:_nullishCoalesce(d, () => (F.Loading)),ResultHeader:_nullishCoalesce(l, () => (F.ResultHeader)),Toolbar:_nullishCoalesce(m, () => (F.Toolbar))};return _jsxruntime.jsx.call(void 0, We.Provider,{value:N,children:c})}function C(){return _react.useContext.call(void 0, We)}var se=_react.createContext.call(void 0, null);function v(){let t=_react.useContext.call(void 0, se);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}function S(){let t=v(),e=_react.useCallback.call(void 0, n=>t.subscribe(n),[t]),i=_react.useCallback.call(void 0, ()=>t.state,[t]);return _react.useSyncExternalStore.call(void 0, e,i,i)}function oe(){let t=v(),e=S(),i=_react.useCallback.call(void 0, r=>t.applyFilters(r),[t]),n=_react.useCallback.call(void 0, (r,o)=>t.applyFilters({[r]:o}),[t]);return{filters:e.filters,set:i,setField:n}}function ye({className:t,groupClassName:e,hideLabels:i,draft:n,onDraftChange:r}={}){let o=v(),{FilterPanel:s}=C(),{filters:a}=oe(),p=n!==void 0&&r!==void 0,d=p?n:a;return _jsxruntime.jsx.call(void 0, s,{children:_jsxruntime.jsx.call(void 0, "div",{className:_nullishCoalesce(t, () => ("space-y-5")),children:o.filters.list().map(l=>{if(typeof l.render=="string")return _jsxruntime.jsx.call(void 0, "div",{"data-filter":l.key,className:e},l.key);let m=l.render;return _jsxruntime.jsxs.call(void 0, "div",{className:e,children:[l.label&&!i&&_jsxruntime.jsx.call(void 0, "div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:l.label}),_jsxruntime.jsx.call(void 0, m,{value:l.fromParams(d),onChange:c=>p?r(l.toParams(c)):void o.applyFilters(l.toParams(c))})]},l.key)})})})}function q(){return S().results}function Ot(t,e){if(t&&typeof t=="object"&&"id"in t){let i=t.id;if(typeof i=="string"||typeof i=="number")return i}return e}function Xe({className:t}={}){let e=v(),{items:i}=q(),{pagination:n,selection:r}=S(),{Card:o,Empty:s,Loading:a}=C();return n.loading&&i.length===0?_jsxruntime.jsx.call(void 0, a,{}):i.length===0?_jsxruntime.jsx.call(void 0, s,{}):_jsxruntime.jsx.call(void 0, "div",{role:"list",className:t,children:i.map((p,d)=>{let l=Ot(p,d);return _jsxruntime.jsx.call(void 0, o,{item:p,selected:r===l,onSelect:()=>e.selectPoint(e.primaryDatasetId,l)},l)})})}var _reactdom = require('react-dom');var Ht={west:-179.9,south:-85,east:179.9,north:85},Ye=.1,et=.02;function At(t){if(t.length===0)return null;let e=t[0].lng,i=t[0].lng,n=t[0].lat,r=t[0].lat;for(let{lat:a,lng:p}of t)p<e&&(e=p),p>i&&(i=p),a<n&&(n=a),a>r&&(r=a);let o=r>n?(r-n)*Ye:et,s=i>e?(i-e)*Ye:et;return{west:e-s,east:i+s,south:n-o,north:r+o}}function it(t){let{center:e,zoom:i,fallback:n,mapControls:r,onMapReady:o}=t,s=v(),a=S(),p=_react.useRef.call(void 0, o);p.current=o;let d=_react.useRef.call(void 0, null),l=_react.useRef.call(void 0, null),m=_react.useRef.call(void 0, null),[c,N]=_react.useState.call(void 0, !1),O=_react.useRef.call(void 0, !1),_=_react.useRef.call(void 0, !1),I=_react.useRef.call(void 0, !1),u=s.map;_react.useEffect.call(void 0, ()=>{let P=m.current;if(!u||!P)return;let h=[];for(let g of Object.keys(a.points)){if(a.layers[g]===!1)continue;let f=s.datasets.get(g),x=_nullishCoalesce(a.points[g], () => ([])),j={id:g,markers:x.map(R=>({id:R.id,position:R.position,iconUrl:_optionalChain([f, 'optionalAccess', _17 => _17.marker, 'access', _18 => _18.iconUrl, 'optionalCall', _19 => _19(R.entity)]),element:_optionalChain([f, 'optionalAccess', _20 => _20.marker, 'access', _21 => _21.element, 'optionalCall', _22 => _22(R.entity)])})),clustering:_optionalChain([f, 'optionalAccess', _23 => _23.clustering]),onMarkerClick:R=>s.selectPoint(g,R)};h.push(u.renderLayer(P,j))}return()=>{h.forEach(g=>g())}},[s,u,c,a.points,a.layers]),_react.useEffect.call(void 0, ()=>{if(!d.current||!u)return;let P=d.current,h=!1,g=null;return(async()=>{let f=await u.mount(P,{center:e,zoom:i,fullscreenTarget:_nullishCoalesce(l.current, () => (void 0))});if(h){u.destroy(f);return}m.current=f,s.setMapHandle(f),g=u.onBoundsChange(f,x=>{I.current?I.current=!1:_.current=!0,s.loadPoints(x)}),N(!0),_optionalChain([p, 'access', _24 => _24.current, 'optionalCall', _25 => _25(f.raw)]),s.loadPoints(Ht)})(),()=>{h=!0,_optionalChain([g, 'optionalCall', _26 => _26()]),m.current&&(u.destroy(m.current),m.current=null,s.setMapHandle(null),_optionalChain([p, 'access', _27 => _27.current, 'optionalCall', _28 => _28(null)])),N(!1)}},[s,u]),_react.useEffect.call(void 0, ()=>{let P=m.current;if(!u||!P||e||O.current||_.current)return;let h=[];for(let f of Object.keys(a.points))if(a.layers[f]!==!1)for(let x of _nullishCoalesce(a.points[f], () => ([])))h.push(x.position);let g=At(h);g&&(O.current=!0,I.current=!0,u.fitBounds(P,g))},[u,e,c,a.points,a.layers]),_react.useEffect.call(void 0, ()=>{_optionalChain([u, 'optionalAccess', _29 => _29.updateMarkerStates, 'call', _30 => _30(a.selection,a.hovered)])},[u,c,a.selection,a.hovered]);let{Popup:L}=C(),T=L!==fe,U=_nullishCoalesce(a.points[s.primaryDatasetId], () => ([])),K=a.selection!=null?U.find(P=>P.id===a.selection):void 0,[E,H]=_react.useState.call(void 0, null),Y=_react.useRef.call(void 0, K);return Y.current=K,_react.useEffect.call(void 0, ()=>{let P=m.current;if(!u||!P||!T)return;let h=Y.current;if(!h)return;let g=u.mountOverlay(h.position);H({entity:h.entity,position:h.position,container:g.container});let f=()=>s.selectPoint(s.primaryDatasetId,null),x=R=>{R.key==="Escape"&&f()};document.addEventListener("keydown",x);let j=u.onMapClick(f);return()=>{document.removeEventListener("keydown",x),j(),g.unmount(),H(null)}},[s,u,c,a.selection,T]),_jsxruntime.jsxs.call(void 0, "div",{ref:l,className:"relative h-full min-h-0 w-full",children:[_jsxruntime.jsxs.call(void 0, "div",{ref:d,className:!u&&n?"flex h-full min-h-0 w-full items-center justify-center":"h-full min-h-0 w-full",children:[!u&&n,T&&E?_reactdom.createPortal.call(void 0, _jsxruntime.jsx.call(void 0, L,{entity:E.entity,onClose:()=>s.selectPoint(s.primaryDatasetId,null)}),E.container):null]}),r!=null&&_jsxruntime.jsx.call(void 0, "div",{className:"pointer-events-none absolute inset-0",children:_jsxruntime.jsx.call(void 0, "div",{className:"pointer-events-auto",children:r})})]})}var he="gap";function zt(t,e){if(t<=7)return Array.from({length:t},(o,s)=>s+1);let i=Math.max(2,e-1),n=Math.min(t-1,e+1),r=[1];i>2&&r.push(he);for(let o=i;o<=n;o+=1)r.push(o);return n<t-1&&r.push(he),r.push(t),r}function nt(){let t=v(),{results:e,pagination:i}=S();if(i.mode==="infinite")return e.nextCursor==null?null:_jsxruntime.jsx.call(void 0, "button",{type:"button",disabled:i.loading,onClick:()=>{t.loadPage()},children:"Load more"});let n=t.options.pageSize,{pageIndex:r}=i,o=r+1,s=e.total!=null?Math.ceil(e.total/n):null,a=s!=null?o<s:e.nextCursor!=null||e.items.length>=n;if(s!=null?s<=1:r===0&&!a)return null;let p=d=>()=>{t.goToPage(d)};return _jsxruntime.jsxs.call(void 0, "nav",{className:"rle-pagination","aria-label":"Pagination",children:[_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Previous page",disabled:i.loading||r===0,onClick:p(r-1),children:"\u2039"}),s!=null&&zt(s,o).map((d,l)=>d===he?_jsxruntime.jsx.call(void 0, "span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${l}`):_jsxruntime.jsx.call(void 0, "button",{type:"button",className:d===o?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${d}`,"aria-current":d===o?"page":void 0,disabled:i.loading,onClick:p(d-1),children:d},d)),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Next page",disabled:i.loading||!a,onClick:p(r+1),children:"\u203A"})]})}function rt(){let{items:t,total:e}=q(),{ResultHeader:i}=C();return _jsxruntime.jsx.call(void 0, i,{count:t.length,total:e})}function st(t,e){let i=v(),n=_react.useRef.call(void 0, e);n.current=e,_react.useEffect.call(void 0, ()=>i.on(t,r=>n.current(r)),[i,t])}function at(t){let{children:e,...i}=t,[n]=_react.useState.call(void 0, ()=>i),[r,o]=_react.useState.call(void 0, null);return _react.useEffect.call(void 0, ()=>{let s=new re({datasets:n.datasets,filters:n.filters,config:n.config,map:n.map,initialFilters:n.initialFilters,primaryDatasetId:n.primaryDatasetId});return n.urlSync&&n.urlSync.start(s),o(s),()=>{n.urlSync&&n.urlSync.stop(),s.dispose(),o(a=>a===s?null:a)}},[n]),r?_jsxruntime.jsx.call(void 0, se.Provider,{value:r,children:e}):null}function lt({view:t,onViewChange:e}){return _jsxruntime.jsx.call(void 0, "nav",{className:"rle-bottom-nav","aria-label":"Listing navigation",children:_jsxruntime.jsxs.call(void 0, "div",{className:"rle-viewtoggle",role:"group","aria-label":"View",children:[_jsxruntime.jsxs.call(void 0, "button",{type:"button",className:`rle-viewtoggle__btn${t==="list"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="list",onClick:()=>e("list"),children:[_jsxruntime.jsx.call(void 0, jt,{}),"List"]}),_jsxruntime.jsxs.call(void 0, "button",{type:"button",className:`rle-viewtoggle__btn${t==="map"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="map",onClick:()=>e("map"),children:[_jsxruntime.jsx.call(void 0, Gt,{}),"Map"]})]})})}function jt(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "line",{x1:"8",y1:"6",x2:"20",y2:"6"}),_jsxruntime.jsx.call(void 0, "line",{x1:"8",y1:"12",x2:"20",y2:"12"}),_jsxruntime.jsx.call(void 0, "line",{x1:"8",y1:"18",x2:"20",y2:"18"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"6",x2:"4.01",y2:"6"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"12",x2:"4.01",y2:"12"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"18",x2:"4.01",y2:"18"})]})}function Gt(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "polygon",{points:"1 6 8 3 16 6 23 3 23 18 16 21 8 18 1 21 1 6"}),_jsxruntime.jsx.call(void 0, "line",{x1:"8",y1:"3",x2:"8",y2:"18"}),_jsxruntime.jsx.call(void 0, "line",{x1:"16",y1:"6",x2:"16",y2:"21"})]})}function $(t){return typeof t!="number"?t:new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0}).format(t)}function Qt(t){return t?"rle-card rle-card--selected":"rle-card"}function be({item:t,selected:e,onSelect:i}){let n=_nullishCoalesce(t, () => ({})),r=Qt(e),o=_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[n.imageUrl?_jsxruntime.jsx.call(void 0, "img",{src:n.imageUrl,alt:_nullishCoalesce(n.title, () => ("")),className:"rle-card-media"}):_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{className:"rle-card-body",children:[n.title&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-title",children:n.title}),n.subtitle&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-address",children:n.subtitle}),n.badge&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-info",children:_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-info-item",children:n.badge})}),n.price!=null&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-price",children:$(n.price)})]})]});return i?_jsxruntime.jsx.call(void 0, "button",{type:"button",onClick:i,"aria-pressed":_nullishCoalesce(e, () => (!1)),className:r,children:o}):_jsxruntime.jsx.call(void 0, "article",{className:r,children:o})}function Le(t){return _jsxruntime.jsxs.call(void 0, "div",{role:"status",className:"rle-empty",children:[_jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",className:"rle-empty-icon","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "circle",{cx:"11",cy:"11",r:"7"}),_jsxruntime.jsx.call(void 0, "path",{d:"m21 21-4.3-4.3"})]}),_jsxruntime.jsx.call(void 0, "p",{className:"rle-empty-title",children:"No results"}),_jsxruntime.jsx.call(void 0, "p",{className:"rle-empty-hint",children:"Try adjusting your filters or search terms."})]})}function Te({children:t}){return _jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-panel",children:t})}function Pe(t){return _jsxruntime.jsx.call(void 0, "div",{className:"rle-loading",role:"status","aria-busy":"true","aria-label":"Loading results",children:Array.from({length:3}).map((e,i)=>_jsxruntime.jsxs.call(void 0, "div",{className:"rle-loading-item",children:[_jsxruntime.jsx.call(void 0, "div",{className:"rle-skeleton",style:{aspectRatio:"4 / 3",width:"100%"}}),_jsxruntime.jsx.call(void 0, "div",{className:"rle-skeleton",style:{height:16,width:"65%"}}),_jsxruntime.jsx.call(void 0, "div",{className:"rle-skeleton",style:{height:12,width:"35%"}})]},i))})}function Fe({point:t}){let e=_nullishCoalesce(t.entity, () => ({}));return _jsxruntime.jsx.call(void 0, "span",{className:"rle-pin",children:e.price!=null?$(e.price):""})}function Ce({entity:t,onClose:e}){let i=_nullishCoalesce(t, () => ({}));return _jsxruntime.jsxs.call(void 0, "div",{className:"rle-popup",role:"group","aria-label":"Location details",children:[_jsxruntime.jsx.call(void 0, "button",{type:"button",onClick:e,"aria-label":"Close",className:"rle-popup-close",children:_jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "path",{d:"M18 6 6 18"}),_jsxruntime.jsx.call(void 0, "path",{d:"m6 6 12 12"})]})}),_jsxruntime.jsxs.call(void 0, "div",{children:[i.title&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-title",children:i.title}),i.subtitle&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-address",children:i.subtitle}),i.price!=null&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-price",children:$(i.price)})]})]})}function Se({count:t,total:e}){let i=e!=null&&e!==t?`${t} of ${e} results`:`${t} results`;return _jsxruntime.jsx.call(void 0, "div",{className:"rle-result-header",children:i})}function we({value:t,onChange:e,placeholder:i}){return _jsxruntime.jsx.call(void 0, "input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":_nullishCoalesce(i, () => ("Search")),className:"rle-input"})}function Ie({children:t}){return _jsxruntime.jsx.call(void 0, "aside",{className:"rle-sidebar",children:t})}function Ee({children:t}){return _jsxruntime.jsx.call(void 0, "div",{className:"rle-toolbar",children:t})}var ut={BottomNav:lt,Card:be,Marker:Fe,Popup:Ce,Sidebar:Ie,FilterPanel:Te,Search:we,Empty:Le,Loading:Pe,ResultHeader:Se,Toolbar:Ee};function mt({open:t,onOpenChange:e,title:i,children:n,footer:r}){let o=_react.useRef.call(void 0, null),[s,a]=_react.useState.call(void 0, !1),[p,d]=_react.useState.call(void 0, !1);return _react.useEffect.call(void 0, ()=>{if(!t){d(!1),a(!1);return}a(!0);let l=requestAnimationFrame(()=>d(!0));return()=>cancelAnimationFrame(l)},[t]),_react.useEffect.call(void 0, ()=>{if(!s)return;let l=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=l}},[s]),_react.useEffect.call(void 0, ()=>{if(!s)return;_optionalChain([o, 'access', _31 => _31.current, 'optionalAccess', _32 => _32.focus, 'call', _33 => _33()]);function l(m){m.key==="Escape"&&e(!1)}return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[s,e]),!s||typeof document>"u"?null:_reactdom.createPortal.call(void 0, _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, "div",{className:`rle-sheet-backdrop${p?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{ref:o,className:`rle-sheet${p?" rle-sheet--open":""}`,role:"dialog","aria-modal":"true","aria-label":i,tabIndex:-1,children:[_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__handle","aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{className:"rle-sheet__header",children:[i&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__title",children:i}),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:_jsxruntime.jsx.call(void 0, oi,{})})]}),_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__body",children:n}),r&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__footer",children:r})]})]}),document.body)}function oi(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "path",{d:"M18 6 6 18"}),_jsxruntime.jsx.call(void 0, "path",{d:"m6 6 12 12"})]})}function gt({search:t,onFiltersClick:e,filterCount:i=0,action:n}){let{Search:r}=C();return _jsxruntime.jsxs.call(void 0, "header",{className:"rle-mobile-header",children:[t&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-mobile-header__search",children:_jsxruntime.jsx.call(void 0, r,{value:t.value,onChange:t.onChange,placeholder:t.placeholder})}),_jsxruntime.jsxs.call(void 0, "button",{type:"button",className:"rle-btn rle-mobile-header__btn",onClick:e,children:[_jsxruntime.jsx.call(void 0, li,{}),_jsxruntime.jsx.call(void 0, "span",{children:"Filters"}),i>0&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-mobile-header__count",children:i})]}),n&&_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-btn rle-mobile-header__btn rle-mobile-header__btn--icon",onClick:n.onClick,"aria-label":n.label,children:_nullishCoalesce(n.icon, () => (_jsxruntime.jsx.call(void 0, di,{})))})]})}function li(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"6",x2:"20",y2:"6"}),_jsxruntime.jsx.call(void 0, "circle",{cx:"9",cy:"6",r:"2",fill:"currentColor",stroke:"none"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"12",x2:"20",y2:"12"}),_jsxruntime.jsx.call(void 0, "circle",{cx:"15",cy:"12",r:"2",fill:"currentColor",stroke:"none"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"18",x2:"20",y2:"18"}),_jsxruntime.jsx.call(void 0, "circle",{cx:"11",cy:"18",r:"2",fill:"currentColor",stroke:"none"})]})}function di(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "line",{x1:"12",y1:"5",x2:"12",y2:"19"}),_jsxruntime.jsx.call(void 0, "line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}var pi=_jsxruntime.jsx.call(void 0, "div",{className:"rle-empty",children:"Map unavailable"});function ui(){let t=_react.useRef.call(void 0, null),[e,i]=_react.useState.call(void 0, !0),[n,r]=_react.useState.call(void 0, !0);return _react.useEffect.call(void 0, ()=>{let o=t.current;if(!o)return;let s=()=>{let{clientWidth:m,scrollLeft:c,scrollWidth:N}=o;i(c<=0),r(c+m>=N-1)},a=0,p=()=>{a||(a=requestAnimationFrame(()=>{a=0,s()}))};s(),o.addEventListener("scroll",s,{passive:!0});let d,l;return typeof ResizeObserver<"u"&&(d=new ResizeObserver(s),d.observe(o)),typeof MutationObserver<"u"&&(l=new MutationObserver(p),l.observe(o,{characterData:!0,childList:!0,subtree:!0})),()=>{o.removeEventListener("scroll",s),_optionalChain([d, 'optionalAccess', _34 => _34.disconnect, 'call', _35 => _35()]),_optionalChain([l, 'optionalAccess', _36 => _36.disconnect, 'call', _37 => _37()]),a&&cancelAnimationFrame(a)}},[]),{atEnd:n,atStart:e,ref:t}}function ci(t,e){if(t===e)return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;let i=t,n=e,r=new Set([...Object.keys(i),...Object.keys(n)]);for(let o of r)if(i[o]!==n[o])return!1;return!0}function ft({search:t,filterBarStart:e,toolbarEnd:i,mobileAction:n,autoFetch:r=!0,hasMap:o,mapCenter:s,mapZoom:a,mapControls:p,onMapReady:d,mobileSheetFooter:l,className:m}){let c=v(),{BottomNav:N,Search:O}=C(),_=q(),{filters:I,set:u}=oe(),{pagination:L}=S(),T=_nullishCoalesce(o, () => (c.map!=null)),[U,K]=_react.useState.call(void 0, "list"),[E,H]=_react.useState.call(void 0, !1),{atEnd:Y,atStart:P,ref:h}=ui(),g=_react.useRef.call(void 0, null);_react.useEffect.call(void 0, ()=>{L.mode==="paged"&&g.current&&(g.current.scrollTop=0)},[L.mode,L.pageIndex]);let[f,x]=_react.useState.call(void 0, I),[j,R]=_react.useState.call(void 0, E);E!==j&&(R(E),E&&x(I));let Me=ge=>x(ht=>({...ht,...ge})),[De,Be]=_react.useState.call(void 0, !1),me=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{if(De){if(L.loading){me.current=!0;return}me.current&&(me.current=!1,Be(!1),H(!1))}},[De,L.loading]);let G=t?{value:String(_nullishCoalesce(I[t.filterKey], () => (""))),onChange:ge=>{u({[t.filterKey]:ge||void 0})},placeholder:t.placeholder}:void 0;_react.useEffect.call(void 0, ()=>{r!==!1&&c.applyFilters({})},[c,r]);let Oe=()=>{Me(c.filters.clearedParams())},_e=()=>{if(ci(f,I)){H(!1);return}Be(!0),c.applyFilters(f)},vt=c.filters.activeKeys(I).length,He=_nullishCoalesce(_.total, () => (_.items.length));return _jsxruntime.jsxs.call(void 0, "div",{className:m?`rle-app ${m}`:"rle-app",children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-filter-bar",children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-filter-bar__scroll",ref:h,children:[G&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__search",children:_jsxruntime.jsx.call(void 0, O,{value:G.value,onChange:G.onChange,placeholder:G.placeholder})}),e&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__slot",children:e}),_jsxruntime.jsx.call(void 0, ye,{className:"rle-filters-row",groupClassName:"rle-filter-group",hideLabels:!0})]}),!P&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!Y&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),_jsxruntime.jsx.call(void 0, gt,{search:G,onFiltersClick:()=>H(!0),filterCount:vt,action:n}),_jsxruntime.jsxs.call(void 0, "div",{className:`rle-body ${T?"rle-split":"rle-body--list-only"}`,"data-mobile-view":U,children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-list",ref:g,children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-list-header",children:[_jsxruntime.jsx.call(void 0, rt,{}),i&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-list-header__toolbar",children:i})]}),_jsxruntime.jsx.call(void 0, Xe,{className:"rle-list-grid"}),_jsxruntime.jsx.call(void 0, nt,{})]}),T&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-map",children:_jsxruntime.jsx.call(void 0, it,{center:s,zoom:a,fallback:pi,mapControls:p,onMapReady:d})})]}),T&&_jsxruntime.jsx.call(void 0, N,{view:U,onViewChange:K}),_jsxruntime.jsx.call(void 0, mt,{title:"Filters",open:E,onOpenChange:H,footer:l?l({draft:f,apply:_e,clear:Oe,resultCount:He,loading:L.loading}):_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:Oe,children:"Clear all"}),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:L.loading,onClick:_e,children:L.loading?_jsxruntime.jsx.call(void 0, "span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${He} results`})]}),children:_jsxruntime.jsx.call(void 0, ye,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:f,onDraftChange:Me})})]})}function yt(t){return"provider"in t}function vi(t){let e=t!=null&&!yt(t),i=e?t.apiKey:void 0,n=e?t.mapId:void 0,r=e?t.mapOptions:void 0,o=e?t.styles:void 0,s=e?t.overlayMarkers:void 0,[a,p]=_react.useState.call(void 0, ()=>!t||yt(t)?{ready:!0,provider:_optionalChain([t, 'optionalAccess', _38 => _38.provider])}:{ready:!1});return _react.useEffect.call(void 0, ()=>{if(!i)return;let d=!1;return Promise.resolve().then(() => _interopRequireWildcard(require("./maps/google/index.cjs"))).then(({googleProvider:l})=>{d||p({ready:!0,provider:l({apiKey:i,mapId:n,mapOptions:r,styles:o,overlayMarkers:s})})}),()=>{d=!0}},[i,n]),a}function hi({onFiltersChange:t}){let e=_react.useRef.call(void 0, t);return e.current=t,st("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function Ar(t){let{datasets:e,filters:i,map:n,components:r,initialFilters:o,onFiltersChange:s,mobileAction:a,search:p,filterBarStart:d,toolbarEnd:l,mapControls:m,onMapReady:c,mobileSheetFooter:N,config:O,autoFetch:_,className:I}=t,{ready:u,provider:L}=vi(n);if(!u)return null;let T=[];for(let E of e)T.push(Ve(E));i&&T.push(qe(i)),L&&T.push(Ke(L)),o&&T.push($e(o)),O&&T.push(Ue(O));let U=ze(...T),K={...ut,...r};return _jsxruntime.jsxs.call(void 0, at,{...U,children:[s&&_jsxruntime.jsx.call(void 0, hi,{onFiltersChange:s}),_jsxruntime.jsx.call(void 0, je,{...K,children:_jsxruntime.jsx.call(void 0, ft,{className:I,search:p,filterBarStart:d,toolbarEnd:l,mobileAction:a,autoFetch:_,mapCenter:_optionalChain([n, 'optionalAccess', _39 => _39.center]),mapZoom:_optionalChain([n, 'optionalAccess', _40 => _40.zoom]),mapControls:m,onMapReady:c,mobileSheetFooter:N})})]})}exports.a = ee; exports.b = V; exports.c = te; exports.d = ie; exports.e = Ae; exports.f = ne; exports.g = re; exports.h = ze; exports.i = Ue; exports.j = Ke; exports.k = Ve; exports.l = qe; exports.m = Di; exports.n = $e; exports.o = Bi; exports.p = fe; exports.q = je; exports.r = C; exports.s = se; exports.t = v; exports.u = S; exports.v = oe; exports.w = ye; exports.x = q; exports.y = Xe; exports.z = it; exports.A = nt; exports.B = rt; exports.C = st; exports.D = at; exports.E = lt; exports.F = be; exports.G = Le; exports.H = Te; exports.I = Pe; exports.J = Fe; exports.K = Ce; exports.L = Se; exports.M = we; exports.N = Ie; exports.O = Ee; exports.P = ut; exports.Q = mt; exports.R = ft; exports.S = Ar;
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2;"use client";
2
- var _chunkM6EX4P77cjs = require('./chunk-M6EX4P77.cjs');var b=(r=>(r.Paged="paged",r.Infinite="infinite",r))(b||{});var v=(i=>(i.FiltersChanged="FiltersChanged",i.ResultsLoaded="ResultsLoaded",i.PointClicked="PointClicked",i.BoundsChanged="BoundsChanged",i.LayerToggled="LayerToggled",i))(v||{});var h= (_class =class{__init() {this.listeners=new Set}constructor(t={}){;_class.prototype.__init.call(this);this.query={...t}}getQuery(){return{...this.query}}setQuery(t){this.query={...t},this.notify()}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}notify(){for(let t of[...this.listeners])t()}}, _class);function F(e,t){let r=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of r)if(e[s]!==t[s])return!1;return!0}var f= (_class2 =class{__init2() {this.isSyncing=!1}__init3() {this.unsubscribeEngine=null}__init4() {this.unsubscribeHistory=null}constructor(t){;_class2.prototype.__init2.call(this);_class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this);this.history=t.history,this.toQueryFn=t.toQuery,this.toFiltersFn=t.toFilters,this.hydrateOnStart=_nullishCoalesce(t.hydrateOnStart, () => (!0))}start(t){this.stop(),this.unsubscribeEngine=t.subscribe(()=>{this.isSyncing||this.syncEngineToHistory(t)}),this.unsubscribeHistory=this.history.subscribe(()=>{this.isSyncing||this.withSyncGuard(()=>{this.applyFiltersSafely(t,this.toFiltersFn(this.history.getQuery()))})}),this.hydrateOnStart&&this.withSyncGuard(()=>{this.applyFiltersSafely(t,this.toFiltersFn(this.history.getQuery()))})}stop(){_optionalChain([this, 'access', _ => _.unsubscribeEngine, 'optionalCall', _2 => _2()]),this.unsubscribeEngine=null,_optionalChain([this, 'access', _3 => _3.unsubscribeHistory, 'optionalCall', _4 => _4()]),this.unsubscribeHistory=null}syncEngineToHistory(t){let r=this.toQueryFn(t.state.filters);F(r,this.history.getQuery())||this.withSyncGuard(()=>this.history.setQuery(r))}applyFiltersSafely(t,r){Promise.resolve(t.applyFilters(r)).catch(()=>{})}withSyncGuard(t){this.isSyncing=!0;try{t()}finally{this.isSyncing=!1}}}, _class2);var m=class{constructor(t={}){this.mode=_nullishCoalesce(t.mode, () => ("replace"))}getQuery(){if(typeof window>"u")return{};let t=new URLSearchParams(window.location.search),r={};for(let[s,o]of t)o!==""&&(r[s]=o);return r}setQuery(t){if(typeof window>"u")return;let r=new URLSearchParams;for(let[c,l]of Object.entries(t))l===void 0||l===""||r.set(c,l);let s=r.toString(),o=s?`?${s}`:"";if(o===window.location.search)return;let i=`${window.location.pathname}${o}${window.location.hash}`;this.mode==="push"?window.history.pushState(window.history.state,"",i):window.history.replaceState(window.history.state,"",i)}subscribe(t){return typeof window>"u"?()=>{}:(window.addEventListener("popstate",t),()=>{window.removeEventListener("popstate",t)})}};var _jsxruntime = require('react/jsx-runtime');function st({children:e}){let{Toolbar:t}=_chunkM6EX4P77cjs.r.call(void 0, );return _jsxruntime.jsx.call(void 0, t,{children:e})}var _react = require('react');function ut(){let e=_chunkM6EX4P77cjs.t.call(void 0, ),t=_chunkM6EX4P77cjs.u.call(void 0, ),r=_react.useCallback.call(void 0, n=>e.loadPoints(n),[e]),s=_react.useCallback.call(void 0, (n,p)=>e.selectPoint(n,p),[e]),o=_react.useCallback.call(void 0, n=>e.setHovered(e.primaryDatasetId,n),[e]),i=_react.useCallback.call(void 0, ()=>_optionalChain([e, 'access', _5 => _5.map, 'optionalAccess', _6 => _6.zoomIn, 'call', _7 => _7()]),[e]),c=_react.useCallback.call(void 0, ()=>_optionalChain([e, 'access', _8 => _8.map, 'optionalAccess', _9 => _9.zoomOut, 'call', _10 => _10()]),[e]),l=_react.useCallback.call(void 0, ()=>_optionalChain([e, 'access', _11 => _11.map, 'optionalAccess', _12 => _12.toggleFullscreen, 'call', _13 => _13()]),[e]),g=_react.useCallback.call(void 0, (n,p)=>e.fitBounds(n,p),[e]);return{bounds:t.bounds,points:t.points,hovered:t.hovered,loadPoints:r,selectPoint:s,setHovered:o,zoomIn:i,zoomOut:c,toggleFullscreen:l,fitBounds:g}}function ht(e){let t=_chunkM6EX4P77cjs.t.call(void 0, ),r=_chunkM6EX4P77cjs.u.call(void 0, ),s=_react.useCallback.call(void 0, ()=>t.toggleLayer(e),[t,e]);return{visible:_nullishCoalesce(r.layers[e], () => (!0)),points:_nullishCoalesce(r.points[e], () => ([])),toggle:s}}exports.BrowserHistoryPort = m; exports.DatasetRegistry = _chunkM6EX4P77cjs.c; exports.FallbackPopup = _chunkM6EX4P77cjs.p; exports.FilterRegistry = _chunkM6EX4P77cjs.b; exports.ListingApp = _chunkM6EX4P77cjs.S; exports.ListingComponentsProvider = _chunkM6EX4P77cjs.q; exports.ListingConfig = _chunkM6EX4P77cjs.f; exports.ListingEngine = _chunkM6EX4P77cjs.g; exports.ListingEngineContext = _chunkM6EX4P77cjs.s; exports.ListingEventType = v; exports.ListingFilters = _chunkM6EX4P77cjs.w; exports.ListingList = _chunkM6EX4P77cjs.y; exports.ListingMap = _chunkM6EX4P77cjs.z; exports.ListingPagination = _chunkM6EX4P77cjs.A; exports.ListingProvider = _chunkM6EX4P77cjs.D; exports.ListingResultHeader = _chunkM6EX4P77cjs.B; exports.ListingStore = _chunkM6EX4P77cjs.a; exports.ListingToolbar = st; exports.MemoryHistoryPort = h; exports.PaginationMode = b; exports.TypedEmitter = _chunkM6EX4P77cjs.d; exports.UrlSyncController = f; exports.composeListingProviders = _chunkM6EX4P77cjs.h; exports.listingDefaultConfig = _chunkM6EX4P77cjs.e; exports.useListing = _chunkM6EX4P77cjs.t; exports.useListingComponents = _chunkM6EX4P77cjs.r; exports.useListingEvent = _chunkM6EX4P77cjs.C; exports.useListingFilters = _chunkM6EX4P77cjs.v; exports.useListingLayer = ht; exports.useListingMap = ut; exports.useListingResults = _chunkM6EX4P77cjs.x; exports.useListingState = _chunkM6EX4P77cjs.u; exports.withConfig = _chunkM6EX4P77cjs.i; exports.withDataset = _chunkM6EX4P77cjs.k; exports.withFilters = _chunkM6EX4P77cjs.l; exports.withInitialFilters = _chunkM6EX4P77cjs.n; exports.withMap = _chunkM6EX4P77cjs.j; exports.withPrimaryDataset = _chunkM6EX4P77cjs.o; exports.withUrlSync = _chunkM6EX4P77cjs.m;
2
+ var _chunkOXSKWVIDcjs = require('./chunk-OXSKWVID.cjs');var b=(r=>(r.Paged="paged",r.Infinite="infinite",r))(b||{});var v=(i=>(i.FiltersChanged="FiltersChanged",i.ResultsLoaded="ResultsLoaded",i.PointClicked="PointClicked",i.BoundsChanged="BoundsChanged",i.LayerToggled="LayerToggled",i))(v||{});var h= (_class =class{__init() {this.listeners=new Set}constructor(t={}){;_class.prototype.__init.call(this);this.query={...t}}getQuery(){return{...this.query}}setQuery(t){this.query={...t},this.notify()}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}notify(){for(let t of[...this.listeners])t()}}, _class);function F(e,t){let r=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of r)if(e[s]!==t[s])return!1;return!0}var f= (_class2 =class{__init2() {this.isSyncing=!1}__init3() {this.unsubscribeEngine=null}__init4() {this.unsubscribeHistory=null}constructor(t){;_class2.prototype.__init2.call(this);_class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this);this.history=t.history,this.toQueryFn=t.toQuery,this.toFiltersFn=t.toFilters,this.hydrateOnStart=_nullishCoalesce(t.hydrateOnStart, () => (!0))}start(t){this.stop(),this.unsubscribeEngine=t.subscribe(()=>{this.isSyncing||this.syncEngineToHistory(t)}),this.unsubscribeHistory=this.history.subscribe(()=>{this.isSyncing||this.withSyncGuard(()=>{this.applyFiltersSafely(t,this.toFiltersFn(this.history.getQuery()))})}),this.hydrateOnStart&&this.withSyncGuard(()=>{this.applyFiltersSafely(t,this.toFiltersFn(this.history.getQuery()))})}stop(){_optionalChain([this, 'access', _ => _.unsubscribeEngine, 'optionalCall', _2 => _2()]),this.unsubscribeEngine=null,_optionalChain([this, 'access', _3 => _3.unsubscribeHistory, 'optionalCall', _4 => _4()]),this.unsubscribeHistory=null}syncEngineToHistory(t){let r=this.toQueryFn(t.state.filters);F(r,this.history.getQuery())||this.withSyncGuard(()=>this.history.setQuery(r))}applyFiltersSafely(t,r){Promise.resolve(t.applyFilters(r)).catch(()=>{})}withSyncGuard(t){this.isSyncing=!0;try{t()}finally{this.isSyncing=!1}}}, _class2);var m=class{constructor(t={}){this.mode=_nullishCoalesce(t.mode, () => ("replace"))}getQuery(){if(typeof window>"u")return{};let t=new URLSearchParams(window.location.search),r={};for(let[s,o]of t)o!==""&&(r[s]=o);return r}setQuery(t){if(typeof window>"u")return;let r=new URLSearchParams;for(let[c,l]of Object.entries(t))l===void 0||l===""||r.set(c,l);let s=r.toString(),o=s?`?${s}`:"";if(o===window.location.search)return;let i=`${window.location.pathname}${o}${window.location.hash}`;this.mode==="push"?window.history.pushState(window.history.state,"",i):window.history.replaceState(window.history.state,"",i)}subscribe(t){return typeof window>"u"?()=>{}:(window.addEventListener("popstate",t),()=>{window.removeEventListener("popstate",t)})}};var _jsxruntime = require('react/jsx-runtime');function st({children:e}){let{Toolbar:t}=_chunkOXSKWVIDcjs.r.call(void 0, );return _jsxruntime.jsx.call(void 0, t,{children:e})}var _react = require('react');function ut(){let e=_chunkOXSKWVIDcjs.t.call(void 0, ),t=_chunkOXSKWVIDcjs.u.call(void 0, ),r=_react.useCallback.call(void 0, n=>e.loadPoints(n),[e]),s=_react.useCallback.call(void 0, (n,p)=>e.selectPoint(n,p),[e]),o=_react.useCallback.call(void 0, n=>e.setHovered(e.primaryDatasetId,n),[e]),i=_react.useCallback.call(void 0, ()=>_optionalChain([e, 'access', _5 => _5.map, 'optionalAccess', _6 => _6.zoomIn, 'call', _7 => _7()]),[e]),c=_react.useCallback.call(void 0, ()=>_optionalChain([e, 'access', _8 => _8.map, 'optionalAccess', _9 => _9.zoomOut, 'call', _10 => _10()]),[e]),l=_react.useCallback.call(void 0, ()=>_optionalChain([e, 'access', _11 => _11.map, 'optionalAccess', _12 => _12.toggleFullscreen, 'call', _13 => _13()]),[e]),g=_react.useCallback.call(void 0, (n,p)=>e.fitBounds(n,p),[e]);return{bounds:t.bounds,points:t.points,hovered:t.hovered,loadPoints:r,selectPoint:s,setHovered:o,zoomIn:i,zoomOut:c,toggleFullscreen:l,fitBounds:g}}function ht(e){let t=_chunkOXSKWVIDcjs.t.call(void 0, ),r=_chunkOXSKWVIDcjs.u.call(void 0, ),s=_react.useCallback.call(void 0, ()=>t.toggleLayer(e),[t,e]);return{visible:_nullishCoalesce(r.layers[e], () => (!0)),points:_nullishCoalesce(r.points[e], () => ([])),toggle:s}}exports.BrowserHistoryPort = m; exports.DatasetRegistry = _chunkOXSKWVIDcjs.c; exports.FallbackPopup = _chunkOXSKWVIDcjs.p; exports.FilterRegistry = _chunkOXSKWVIDcjs.b; exports.ListingApp = _chunkOXSKWVIDcjs.S; exports.ListingComponentsProvider = _chunkOXSKWVIDcjs.q; exports.ListingConfig = _chunkOXSKWVIDcjs.f; exports.ListingEngine = _chunkOXSKWVIDcjs.g; exports.ListingEngineContext = _chunkOXSKWVIDcjs.s; exports.ListingEventType = v; exports.ListingFilters = _chunkOXSKWVIDcjs.w; exports.ListingList = _chunkOXSKWVIDcjs.y; exports.ListingMap = _chunkOXSKWVIDcjs.z; exports.ListingPagination = _chunkOXSKWVIDcjs.A; exports.ListingProvider = _chunkOXSKWVIDcjs.D; exports.ListingResultHeader = _chunkOXSKWVIDcjs.B; exports.ListingStore = _chunkOXSKWVIDcjs.a; exports.ListingToolbar = st; exports.MemoryHistoryPort = h; exports.PaginationMode = b; exports.TypedEmitter = _chunkOXSKWVIDcjs.d; exports.UrlSyncController = f; exports.composeListingProviders = _chunkOXSKWVIDcjs.h; exports.listingDefaultConfig = _chunkOXSKWVIDcjs.e; exports.useListing = _chunkOXSKWVIDcjs.t; exports.useListingComponents = _chunkOXSKWVIDcjs.r; exports.useListingEvent = _chunkOXSKWVIDcjs.C; exports.useListingFilters = _chunkOXSKWVIDcjs.v; exports.useListingLayer = ht; exports.useListingMap = ut; exports.useListingResults = _chunkOXSKWVIDcjs.x; exports.useListingState = _chunkOXSKWVIDcjs.u; exports.withConfig = _chunkOXSKWVIDcjs.i; exports.withDataset = _chunkOXSKWVIDcjs.k; exports.withFilters = _chunkOXSKWVIDcjs.l; exports.withInitialFilters = _chunkOXSKWVIDcjs.n; exports.withMap = _chunkOXSKWVIDcjs.j; exports.withPrimaryDataset = _chunkOXSKWVIDcjs.o; exports.withUrlSync = _chunkOXSKWVIDcjs.m;
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { P as Page, B as Bounds, E as EntityId, M as MapPoint, U as Unsubscribe, a as MapProvider, b as MapHandle, F as FitBoundsOptions, Q as QueryParams, L as LatLng } from './map-provider.interface-8hvdqqjd.cjs';
2
2
  export { c as EntityAdapter, d as MapInitOptions, e as MapOverlayHandle, f as PageRequest, R as RenderedLayer } from './map-provider.interface-8hvdqqjd.cjs';
3
- import { P as PaginationMode, D as DatasetDefinition, I as IListingConfigOptions, F as FilterRegistry, a as IListingToolbarProps } from './listing-app-DUwoNjPa.cjs';
4
- export { C as ClusterOptions, b as FallbackPopup, c as FilterControlProps, d as FilterDefinition, e as IListingCardProps, f as IListingComponents, g as IListingEmptyProps, h as IListingFilterPanelProps, i as IListingLoadingProps, j as IListingMarkerProps, k as IListingPopupProps, l as IListingResultHeaderProps, m as IListingSearchProps, n as IListingSidebarProps, L as ListingApp, o as ListingAppProps, p as ListingComponentsProvider, M as MarkerRenderer, q as MobileSheetFooterContext, u as useListingComponents } from './listing-app-DUwoNjPa.cjs';
3
+ import { P as PaginationMode, D as DatasetDefinition, I as IListingConfigOptions, F as FilterRegistry, a as IListingToolbarProps } from './listing-app-B53qbvxo.cjs';
4
+ export { C as ClusterOptions, b as FallbackPopup, c as FilterControlProps, d as FilterDefinition, e as IListingBottomNavProps, f as IListingCardProps, g as IListingComponents, h as IListingEmptyProps, i as IListingFilterPanelProps, j as IListingLoadingProps, k as IListingMarkerProps, l as IListingPopupProps, m as IListingResultHeaderProps, n as IListingSearchProps, o as IListingSidebarProps, L as ListingApp, p as ListingAppProps, q as ListingComponentsProvider, M as MarkerRenderer, r as MobileSheetFooterContext, u as useListingComponents } from './listing-app-B53qbvxo.cjs';
5
5
  import * as react from 'react';
6
6
  import { ReactNode } from 'react';
7
7
 
@@ -530,6 +530,17 @@ interface IListingMapProps {
530
530
  * Omit (the default, `undefined`) to render nothing extra -- no behavior change.
531
531
  */
532
532
  mapControls?: ReactNode;
533
+ /**
534
+ * Fires with the underlying map SDK's native map object (`MapHandle.raw` --
535
+ * the `google.maps.Map` for `googleProvider`) the moment the map finishes
536
+ * mounting, and again with `null` when it is torn down (unmount / Strict-Mode
537
+ * double-invoke). Typed `unknown` because this layer is provider-agnostic:
538
+ * the consumer casts to their SDK's map type. This is the escape hatch for
539
+ * provider-specific features the library doesn't wrap (e.g. Google
540
+ * data-driven-styling `FeatureLayer`s). Omit (the default) to fire nothing --
541
+ * a fully backward-compatible addition.
542
+ */
543
+ onMapReady?: (map: unknown) => void;
533
544
  }
534
545
  /**
535
546
  * Structure-only map mount point.
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { P as Page, B as Bounds, E as EntityId, M as MapPoint, U as Unsubscribe, a as MapProvider, b as MapHandle, F as FitBoundsOptions, Q as QueryParams, L as LatLng } from './map-provider.interface-8hvdqqjd.js';
2
2
  export { c as EntityAdapter, d as MapInitOptions, e as MapOverlayHandle, f as PageRequest, R as RenderedLayer } from './map-provider.interface-8hvdqqjd.js';
3
- import { P as PaginationMode, D as DatasetDefinition, I as IListingConfigOptions, F as FilterRegistry, a as IListingToolbarProps } from './listing-app-DrVdHL4h.js';
4
- export { C as ClusterOptions, b as FallbackPopup, c as FilterControlProps, d as FilterDefinition, e as IListingCardProps, f as IListingComponents, g as IListingEmptyProps, h as IListingFilterPanelProps, i as IListingLoadingProps, j as IListingMarkerProps, k as IListingPopupProps, l as IListingResultHeaderProps, m as IListingSearchProps, n as IListingSidebarProps, L as ListingApp, o as ListingAppProps, p as ListingComponentsProvider, M as MarkerRenderer, q as MobileSheetFooterContext, u as useListingComponents } from './listing-app-DrVdHL4h.js';
3
+ import { P as PaginationMode, D as DatasetDefinition, I as IListingConfigOptions, F as FilterRegistry, a as IListingToolbarProps } from './listing-app-DxRpWQgn.js';
4
+ export { C as ClusterOptions, b as FallbackPopup, c as FilterControlProps, d as FilterDefinition, e as IListingBottomNavProps, f as IListingCardProps, g as IListingComponents, h as IListingEmptyProps, i as IListingFilterPanelProps, j as IListingLoadingProps, k as IListingMarkerProps, l as IListingPopupProps, m as IListingResultHeaderProps, n as IListingSearchProps, o as IListingSidebarProps, L as ListingApp, p as ListingAppProps, q as ListingComponentsProvider, M as MarkerRenderer, r as MobileSheetFooterContext, u as useListingComponents } from './listing-app-DxRpWQgn.js';
5
5
  import * as react from 'react';
6
6
  import { ReactNode } from 'react';
7
7
 
@@ -530,6 +530,17 @@ interface IListingMapProps {
530
530
  * Omit (the default, `undefined`) to render nothing extra -- no behavior change.
531
531
  */
532
532
  mapControls?: ReactNode;
533
+ /**
534
+ * Fires with the underlying map SDK's native map object (`MapHandle.raw` --
535
+ * the `google.maps.Map` for `googleProvider`) the moment the map finishes
536
+ * mounting, and again with `null` when it is torn down (unmount / Strict-Mode
537
+ * double-invoke). Typed `unknown` because this layer is provider-agnostic:
538
+ * the consumer casts to their SDK's map type. This is the escape hatch for
539
+ * provider-specific features the library doesn't wrap (e.g. Google
540
+ * data-driven-styling `FeatureLayer`s). Omit (the default) to fire nothing --
541
+ * a fully backward-compatible addition.
542
+ */
543
+ onMapReady?: (map: unknown) => void;
533
544
  }
534
545
  /**
535
546
  * Structure-only map mount point.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{A as V,B as W,C as X,D as Y,S as P,a as Q,b as x,c as T,d as L,e as O,f as H,g as E,h as k,i as q,j as B,k as C,l as I,m as U,n as z,o as G,p as R,q as $,r as d,s as j,t as u,u as y,v as A,w as D,x as J,y as K,z as N}from"./chunk-37GNJZB2.js";var b=(r=>(r.Paged="paged",r.Infinite="infinite",r))(b||{});var v=(i=>(i.FiltersChanged="FiltersChanged",i.ResultsLoaded="ResultsLoaded",i.PointClicked="PointClicked",i.BoundsChanged="BoundsChanged",i.LayerToggled="LayerToggled",i))(v||{});var h=class{query;listeners=new Set;constructor(t={}){this.query={...t}}getQuery(){return{...this.query}}setQuery(t){this.query={...t},this.notify()}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}notify(){for(let t of[...this.listeners])t()}};function F(e,t){let r=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of r)if(e[s]!==t[s])return!1;return!0}var f=class{history;toQueryFn;toFiltersFn;hydrateOnStart;isSyncing=!1;unsubscribeEngine=null;unsubscribeHistory=null;constructor(t){this.history=t.history,this.toQueryFn=t.toQuery,this.toFiltersFn=t.toFilters,this.hydrateOnStart=t.hydrateOnStart??!0}start(t){this.stop(),this.unsubscribeEngine=t.subscribe(()=>{this.isSyncing||this.syncEngineToHistory(t)}),this.unsubscribeHistory=this.history.subscribe(()=>{this.isSyncing||this.withSyncGuard(()=>{this.applyFiltersSafely(t,this.toFiltersFn(this.history.getQuery()))})}),this.hydrateOnStart&&this.withSyncGuard(()=>{this.applyFiltersSafely(t,this.toFiltersFn(this.history.getQuery()))})}stop(){this.unsubscribeEngine?.(),this.unsubscribeEngine=null,this.unsubscribeHistory?.(),this.unsubscribeHistory=null}syncEngineToHistory(t){let r=this.toQueryFn(t.state.filters);F(r,this.history.getQuery())||this.withSyncGuard(()=>this.history.setQuery(r))}applyFiltersSafely(t,r){Promise.resolve(t.applyFilters(r)).catch(()=>{})}withSyncGuard(t){this.isSyncing=!0;try{t()}finally{this.isSyncing=!1}}};var m=class{mode;constructor(t={}){this.mode=t.mode??"replace"}getQuery(){if(typeof window>"u")return{};let t=new URLSearchParams(window.location.search),r={};for(let[s,o]of t)o!==""&&(r[s]=o);return r}setQuery(t){if(typeof window>"u")return;let r=new URLSearchParams;for(let[c,l]of Object.entries(t))l===void 0||l===""||r.set(c,l);let s=r.toString(),o=s?`?${s}`:"";if(o===window.location.search)return;let i=`${window.location.pathname}${o}${window.location.hash}`;this.mode==="push"?window.history.pushState(window.history.state,"",i):window.history.replaceState(window.history.state,"",i)}subscribe(t){return typeof window>"u"?()=>{}:(window.addEventListener("popstate",t),()=>{window.removeEventListener("popstate",t)})}};import{jsx as w}from"react/jsx-runtime";function st({children:e}){let{Toolbar:t}=d();return w(t,{children:e})}import{useCallback as a}from"react";function ut(){let e=u(),t=y(),r=a(n=>e.loadPoints(n),[e]),s=a((n,p)=>e.selectPoint(n,p),[e]),o=a(n=>e.setHovered(e.primaryDatasetId,n),[e]),i=a(()=>e.map?.zoomIn(),[e]),c=a(()=>e.map?.zoomOut(),[e]),l=a(()=>e.map?.toggleFullscreen(),[e]),g=a((n,p)=>e.fitBounds(n,p),[e]);return{bounds:t.bounds,points:t.points,hovered:t.hovered,loadPoints:r,selectPoint:s,setHovered:o,zoomIn:i,zoomOut:c,toggleFullscreen:l,fitBounds:g}}import{useCallback as S}from"react";function ht(e){let t=u(),r=y(),s=S(()=>t.toggleLayer(e),[t,e]);return{visible:r.layers[e]??!0,points:r.points[e]??[],toggle:s}}export{m as BrowserHistoryPort,T as DatasetRegistry,R as FallbackPopup,x as FilterRegistry,P as ListingApp,$ as ListingComponentsProvider,H as ListingConfig,E as ListingEngine,j as ListingEngineContext,v as ListingEventType,D as ListingFilters,K as ListingList,N as ListingMap,V as ListingPagination,Y as ListingProvider,W as ListingResultHeader,Q as ListingStore,st as ListingToolbar,h as MemoryHistoryPort,b as PaginationMode,L as TypedEmitter,f as UrlSyncController,k as composeListingProviders,O as listingDefaultConfig,u as useListing,d as useListingComponents,X as useListingEvent,A as useListingFilters,ht as useListingLayer,ut as useListingMap,J as useListingResults,y as useListingState,q as withConfig,C as withDataset,I as withFilters,z as withInitialFilters,B as withMap,G as withPrimaryDataset,U as withUrlSync};
2
+ import{A as V,B as W,C as X,D as Y,S as P,a as Q,b as x,c as T,d as L,e as O,f as H,g as E,h as k,i as q,j as B,k as C,l as I,m as U,n as z,o as G,p as R,q as $,r as d,s as j,t as u,u as y,v as A,w as D,x as J,y as K,z as N}from"./chunk-AU6BK7UM.js";var b=(r=>(r.Paged="paged",r.Infinite="infinite",r))(b||{});var v=(i=>(i.FiltersChanged="FiltersChanged",i.ResultsLoaded="ResultsLoaded",i.PointClicked="PointClicked",i.BoundsChanged="BoundsChanged",i.LayerToggled="LayerToggled",i))(v||{});var h=class{query;listeners=new Set;constructor(t={}){this.query={...t}}getQuery(){return{...this.query}}setQuery(t){this.query={...t},this.notify()}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}notify(){for(let t of[...this.listeners])t()}};function F(e,t){let r=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of r)if(e[s]!==t[s])return!1;return!0}var f=class{history;toQueryFn;toFiltersFn;hydrateOnStart;isSyncing=!1;unsubscribeEngine=null;unsubscribeHistory=null;constructor(t){this.history=t.history,this.toQueryFn=t.toQuery,this.toFiltersFn=t.toFilters,this.hydrateOnStart=t.hydrateOnStart??!0}start(t){this.stop(),this.unsubscribeEngine=t.subscribe(()=>{this.isSyncing||this.syncEngineToHistory(t)}),this.unsubscribeHistory=this.history.subscribe(()=>{this.isSyncing||this.withSyncGuard(()=>{this.applyFiltersSafely(t,this.toFiltersFn(this.history.getQuery()))})}),this.hydrateOnStart&&this.withSyncGuard(()=>{this.applyFiltersSafely(t,this.toFiltersFn(this.history.getQuery()))})}stop(){this.unsubscribeEngine?.(),this.unsubscribeEngine=null,this.unsubscribeHistory?.(),this.unsubscribeHistory=null}syncEngineToHistory(t){let r=this.toQueryFn(t.state.filters);F(r,this.history.getQuery())||this.withSyncGuard(()=>this.history.setQuery(r))}applyFiltersSafely(t,r){Promise.resolve(t.applyFilters(r)).catch(()=>{})}withSyncGuard(t){this.isSyncing=!0;try{t()}finally{this.isSyncing=!1}}};var m=class{mode;constructor(t={}){this.mode=t.mode??"replace"}getQuery(){if(typeof window>"u")return{};let t=new URLSearchParams(window.location.search),r={};for(let[s,o]of t)o!==""&&(r[s]=o);return r}setQuery(t){if(typeof window>"u")return;let r=new URLSearchParams;for(let[c,l]of Object.entries(t))l===void 0||l===""||r.set(c,l);let s=r.toString(),o=s?`?${s}`:"";if(o===window.location.search)return;let i=`${window.location.pathname}${o}${window.location.hash}`;this.mode==="push"?window.history.pushState(window.history.state,"",i):window.history.replaceState(window.history.state,"",i)}subscribe(t){return typeof window>"u"?()=>{}:(window.addEventListener("popstate",t),()=>{window.removeEventListener("popstate",t)})}};import{jsx as w}from"react/jsx-runtime";function st({children:e}){let{Toolbar:t}=d();return w(t,{children:e})}import{useCallback as a}from"react";function ut(){let e=u(),t=y(),r=a(n=>e.loadPoints(n),[e]),s=a((n,p)=>e.selectPoint(n,p),[e]),o=a(n=>e.setHovered(e.primaryDatasetId,n),[e]),i=a(()=>e.map?.zoomIn(),[e]),c=a(()=>e.map?.zoomOut(),[e]),l=a(()=>e.map?.toggleFullscreen(),[e]),g=a((n,p)=>e.fitBounds(n,p),[e]);return{bounds:t.bounds,points:t.points,hovered:t.hovered,loadPoints:r,selectPoint:s,setHovered:o,zoomIn:i,zoomOut:c,toggleFullscreen:l,fitBounds:g}}import{useCallback as S}from"react";function ht(e){let t=u(),r=y(),s=S(()=>t.toggleLayer(e),[t,e]);return{visible:r.layers[e]??!0,points:r.points[e]??[],toggle:s}}export{m as BrowserHistoryPort,T as DatasetRegistry,R as FallbackPopup,x as FilterRegistry,P as ListingApp,$ as ListingComponentsProvider,H as ListingConfig,E as ListingEngine,j as ListingEngineContext,v as ListingEventType,D as ListingFilters,K as ListingList,N as ListingMap,V as ListingPagination,Y as ListingProvider,W as ListingResultHeader,Q as ListingStore,st as ListingToolbar,h as MemoryHistoryPort,b as PaginationMode,L as TypedEmitter,f as UrlSyncController,k as composeListingProviders,O as listingDefaultConfig,u as useListing,d as useListingComponents,X as useListingEvent,A as useListingFilters,ht as useListingLayer,ut as useListingMap,J as useListingResults,y as useListingState,q as withConfig,C as withDataset,I as withFilters,z as withInitialFilters,B as withMap,G as withPrimaryDataset,U as withUrlSync};
@@ -107,7 +107,13 @@ interface IListingResultHeaderProps {
107
107
  interface IListingToolbarProps {
108
108
  children?: ReactNode;
109
109
  }
110
+ /** Props for the mobile List|Map view switcher slot (`BottomNav`). */
111
+ interface IListingBottomNavProps {
112
+ view: 'list' | 'map';
113
+ onViewChange(view: 'list' | 'map'): void;
114
+ }
110
115
  interface IListingComponents {
116
+ BottomNav: ComponentType<IListingBottomNavProps>;
111
117
  Card: ComponentType<IListingCardProps>;
112
118
  Marker: ComponentType<IListingMarkerProps>;
113
119
  Popup: ComponentType<IListingPopupProps>;
@@ -210,6 +216,8 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
210
216
  mapZoom?: number;
211
217
  /** Forwarded verbatim to `<ListingMap mapControls={mapControls} />` -- see that prop's doc comment. */
212
218
  mapControls?: ReactNode;
219
+ /** Forwarded verbatim to `<ListingMap onMapReady={onMapReady} />` -- the native-map escape hatch; see that prop's doc comment. */
220
+ onMapReady?: (map: unknown) => void;
213
221
  /**
214
222
  * Render-prop override for the mobile filters sheet's footer -- when
215
223
  * given, replaces the default "Clear all" + "Show N results" buttons
@@ -290,7 +298,7 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
290
298
  * default -- pass `autoFetch={false}`
291
299
  * to opt out and drive the first fetch yourself.
292
300
  */
293
- declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, toolbarEnd, mobileAction, autoFetch, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
301
+ declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, toolbarEnd, mobileAction, autoFetch, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, onMapReady, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
294
302
 
295
303
  /**
296
304
  * Two-shape `map` prop: pass a ready `MapProvider`, or the `{ apiKey, mapId? }`
@@ -376,6 +384,16 @@ interface ListingAppProps<TFilters> {
376
384
  * drops the map region entirely in that case).
377
385
  */
378
386
  mapControls?: ReactNode;
387
+ /**
388
+ * Fires with the underlying map SDK's native map object (`google.maps.Map`
389
+ * for the built-in Google provider) once the map mounts, and `null` when it
390
+ * is torn down -- forwarded verbatim through `StyledListingLayout` to
391
+ * `ListingMap`'s own `onMapReady` prop. The escape hatch for
392
+ * provider-specific features the library doesn't wrap (Google data-driven
393
+ * styling `FeatureLayer`s, custom overlays, ...). Typed `unknown`; cast to
394
+ * your SDK's map type. Omit (the default) to fire nothing.
395
+ */
396
+ onMapReady?: (map: unknown) => void;
379
397
  /** Forwarded verbatim to `StyledListingLayout`'s `mobileSheetFooter` -- see that prop's doc comment. */
380
398
  mobileSheetFooter?: (ctx: MobileSheetFooterContext<TFilters>) => ReactNode;
381
399
  config?: Partial<IListingConfigOptions>;
@@ -417,4 +435,4 @@ interface ListingAppProps<TFilters> {
417
435
  */
418
436
  declare function ListingApp<TEntity, TFilters>(props: ListingAppProps<TFilters>): react.JSX.Element | null;
419
437
 
420
- export { BottomNav as B, type ClusterOptions as C, type DatasetDefinition as D, FilterRegistry as F, type IListingConfigOptions as I, ListingApp as L, type MarkerRenderer as M, PaginationMode as P, StyledListingLayout as S, type IListingToolbarProps as a, FallbackPopup as b, type FilterControlProps as c, type FilterDefinition as d, type IListingCardProps as e, type IListingComponents as f, type IListingEmptyProps as g, type IListingFilterPanelProps as h, type IListingLoadingProps as i, type IListingMarkerProps as j, type IListingPopupProps as k, type IListingResultHeaderProps as l, type IListingSearchProps as m, type IListingSidebarProps as n, type ListingAppProps as o, ListingComponentsProvider as p, type MobileSheetFooterContext as q, type BottomNavView as r, type IBottomNavAction as s, type IBottomNavProps as t, useListingComponents as u, type IStyledListingLayoutProps as v, type ListingAppMapProp as w };
438
+ export { BottomNav as B, type ClusterOptions as C, type DatasetDefinition as D, FilterRegistry as F, type IListingConfigOptions as I, ListingApp as L, type MarkerRenderer as M, PaginationMode as P, StyledListingLayout as S, type IListingToolbarProps as a, FallbackPopup as b, type FilterControlProps as c, type FilterDefinition as d, type IListingBottomNavProps as e, type IListingCardProps as f, type IListingComponents as g, type IListingEmptyProps as h, type IListingFilterPanelProps as i, type IListingLoadingProps as j, type IListingMarkerProps as k, type IListingPopupProps as l, type IListingResultHeaderProps as m, type IListingSearchProps as n, type IListingSidebarProps as o, type ListingAppProps as p, ListingComponentsProvider as q, type MobileSheetFooterContext as r, type BottomNavView as s, type IBottomNavAction as t, useListingComponents as u, type IBottomNavProps as v, type IStyledListingLayoutProps as w, type ListingAppMapProp as x };
@@ -107,7 +107,13 @@ interface IListingResultHeaderProps {
107
107
  interface IListingToolbarProps {
108
108
  children?: ReactNode;
109
109
  }
110
+ /** Props for the mobile List|Map view switcher slot (`BottomNav`). */
111
+ interface IListingBottomNavProps {
112
+ view: 'list' | 'map';
113
+ onViewChange(view: 'list' | 'map'): void;
114
+ }
110
115
  interface IListingComponents {
116
+ BottomNav: ComponentType<IListingBottomNavProps>;
111
117
  Card: ComponentType<IListingCardProps>;
112
118
  Marker: ComponentType<IListingMarkerProps>;
113
119
  Popup: ComponentType<IListingPopupProps>;
@@ -210,6 +216,8 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
210
216
  mapZoom?: number;
211
217
  /** Forwarded verbatim to `<ListingMap mapControls={mapControls} />` -- see that prop's doc comment. */
212
218
  mapControls?: ReactNode;
219
+ /** Forwarded verbatim to `<ListingMap onMapReady={onMapReady} />` -- the native-map escape hatch; see that prop's doc comment. */
220
+ onMapReady?: (map: unknown) => void;
213
221
  /**
214
222
  * Render-prop override for the mobile filters sheet's footer -- when
215
223
  * given, replaces the default "Clear all" + "Show N results" buttons
@@ -290,7 +298,7 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
290
298
  * default -- pass `autoFetch={false}`
291
299
  * to opt out and drive the first fetch yourself.
292
300
  */
293
- declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, toolbarEnd, mobileAction, autoFetch, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
301
+ declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, toolbarEnd, mobileAction, autoFetch, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, onMapReady, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
294
302
 
295
303
  /**
296
304
  * Two-shape `map` prop: pass a ready `MapProvider`, or the `{ apiKey, mapId? }`
@@ -376,6 +384,16 @@ interface ListingAppProps<TFilters> {
376
384
  * drops the map region entirely in that case).
377
385
  */
378
386
  mapControls?: ReactNode;
387
+ /**
388
+ * Fires with the underlying map SDK's native map object (`google.maps.Map`
389
+ * for the built-in Google provider) once the map mounts, and `null` when it
390
+ * is torn down -- forwarded verbatim through `StyledListingLayout` to
391
+ * `ListingMap`'s own `onMapReady` prop. The escape hatch for
392
+ * provider-specific features the library doesn't wrap (Google data-driven
393
+ * styling `FeatureLayer`s, custom overlays, ...). Typed `unknown`; cast to
394
+ * your SDK's map type. Omit (the default) to fire nothing.
395
+ */
396
+ onMapReady?: (map: unknown) => void;
379
397
  /** Forwarded verbatim to `StyledListingLayout`'s `mobileSheetFooter` -- see that prop's doc comment. */
380
398
  mobileSheetFooter?: (ctx: MobileSheetFooterContext<TFilters>) => ReactNode;
381
399
  config?: Partial<IListingConfigOptions>;
@@ -417,4 +435,4 @@ interface ListingAppProps<TFilters> {
417
435
  */
418
436
  declare function ListingApp<TEntity, TFilters>(props: ListingAppProps<TFilters>): react.JSX.Element | null;
419
437
 
420
- export { BottomNav as B, type ClusterOptions as C, type DatasetDefinition as D, FilterRegistry as F, type IListingConfigOptions as I, ListingApp as L, type MarkerRenderer as M, PaginationMode as P, StyledListingLayout as S, type IListingToolbarProps as a, FallbackPopup as b, type FilterControlProps as c, type FilterDefinition as d, type IListingCardProps as e, type IListingComponents as f, type IListingEmptyProps as g, type IListingFilterPanelProps as h, type IListingLoadingProps as i, type IListingMarkerProps as j, type IListingPopupProps as k, type IListingResultHeaderProps as l, type IListingSearchProps as m, type IListingSidebarProps as n, type ListingAppProps as o, ListingComponentsProvider as p, type MobileSheetFooterContext as q, type BottomNavView as r, type IBottomNavAction as s, type IBottomNavProps as t, useListingComponents as u, type IStyledListingLayoutProps as v, type ListingAppMapProp as w };
438
+ export { BottomNav as B, type ClusterOptions as C, type DatasetDefinition as D, FilterRegistry as F, type IListingConfigOptions as I, ListingApp as L, type MarkerRenderer as M, PaginationMode as P, StyledListingLayout as S, type IListingToolbarProps as a, FallbackPopup as b, type FilterControlProps as c, type FilterDefinition as d, type IListingBottomNavProps as e, type IListingCardProps as f, type IListingComponents as g, type IListingEmptyProps as h, type IListingFilterPanelProps as i, type IListingLoadingProps as j, type IListingMarkerProps as k, type IListingPopupProps as l, type IListingResultHeaderProps as m, type IListingSearchProps as n, type IListingSidebarProps as o, type ListingAppProps as p, ListingComponentsProvider as q, type MobileSheetFooterContext as r, type BottomNavView as s, type IBottomNavAction as t, useListingComponents as u, type IBottomNavProps as v, type IStyledListingLayoutProps as w, type ListingAppMapProp as x };
@@ -1,2 +1,2 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
- var _chunkM6EX4P77cjs = require('../chunk-M6EX4P77.cjs');var _jsxruntime = require('react/jsx-runtime');function L({children:o}){return _jsxruntime.jsx.call(void 0, _chunkM6EX4P77cjs.q,{..._chunkM6EX4P77cjs.O,children:o})}exports.BottomNav = _chunkM6EX4P77cjs.P; exports.BottomSheet = _chunkM6EX4P77cjs.Q; exports.ListingApp = _chunkM6EX4P77cjs.S; exports.StyledCard = _chunkM6EX4P77cjs.E; exports.StyledComponentsProviderWithDefaults = L; exports.StyledEmpty = _chunkM6EX4P77cjs.F; exports.StyledFilterPanel = _chunkM6EX4P77cjs.G; exports.StyledListingLayout = _chunkM6EX4P77cjs.R; exports.StyledLoading = _chunkM6EX4P77cjs.H; exports.StyledMarker = _chunkM6EX4P77cjs.I; exports.StyledPopup = _chunkM6EX4P77cjs.J; exports.StyledResultHeader = _chunkM6EX4P77cjs.K; exports.StyledSearch = _chunkM6EX4P77cjs.L; exports.StyledSidebar = _chunkM6EX4P77cjs.M; exports.StyledToolbar = _chunkM6EX4P77cjs.N; exports.styledDefaultComponents = _chunkM6EX4P77cjs.O;
2
+ var _chunkOXSKWVIDcjs = require('../chunk-OXSKWVID.cjs');var _jsxruntime = require('react/jsx-runtime');function L({children:o}){return _jsxruntime.jsx.call(void 0, _chunkOXSKWVIDcjs.q,{..._chunkOXSKWVIDcjs.P,children:o})}exports.BottomNav = _chunkOXSKWVIDcjs.E; exports.BottomSheet = _chunkOXSKWVIDcjs.Q; exports.ListingApp = _chunkOXSKWVIDcjs.S; exports.StyledCard = _chunkOXSKWVIDcjs.F; exports.StyledComponentsProviderWithDefaults = L; exports.StyledEmpty = _chunkOXSKWVIDcjs.G; exports.StyledFilterPanel = _chunkOXSKWVIDcjs.H; exports.StyledListingLayout = _chunkOXSKWVIDcjs.R; exports.StyledLoading = _chunkOXSKWVIDcjs.I; exports.StyledMarker = _chunkOXSKWVIDcjs.J; exports.StyledPopup = _chunkOXSKWVIDcjs.K; exports.StyledResultHeader = _chunkOXSKWVIDcjs.L; exports.StyledSearch = _chunkOXSKWVIDcjs.M; exports.StyledSidebar = _chunkOXSKWVIDcjs.N; exports.StyledToolbar = _chunkOXSKWVIDcjs.O; exports.styledDefaultComponents = _chunkOXSKWVIDcjs.P;
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { e as IListingCardProps, g as IListingEmptyProps, h as IListingFilterPanelProps, i as IListingLoadingProps, j as IListingMarkerProps, k as IListingPopupProps, l as IListingResultHeaderProps, m as IListingSearchProps, n as IListingSidebarProps, a as IListingToolbarProps, f as IListingComponents } from '../listing-app-DUwoNjPa.cjs';
4
- export { B as BottomNav, r as BottomNavView, s as IBottomNavAction, t as IBottomNavProps, v as IStyledListingLayoutProps, L as ListingApp, w as ListingAppMapProp, o as ListingAppProps, q as MobileSheetFooterContext, S as StyledListingLayout } from '../listing-app-DUwoNjPa.cjs';
3
+ import { f as IListingCardProps, h as IListingEmptyProps, i as IListingFilterPanelProps, j as IListingLoadingProps, k as IListingMarkerProps, l as IListingPopupProps, m as IListingResultHeaderProps, n as IListingSearchProps, o as IListingSidebarProps, a as IListingToolbarProps, g as IListingComponents } from '../listing-app-B53qbvxo.cjs';
4
+ export { B as BottomNav, s as BottomNavView, t as IBottomNavAction, v as IBottomNavProps, w as IStyledListingLayoutProps, L as ListingApp, x as ListingAppMapProp, p as ListingAppProps, r as MobileSheetFooterContext, S as StyledListingLayout } from '../listing-app-B53qbvxo.cjs';
5
5
  import '../map-provider.interface-8hvdqqjd.cjs';
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { e as IListingCardProps, g as IListingEmptyProps, h as IListingFilterPanelProps, i as IListingLoadingProps, j as IListingMarkerProps, k as IListingPopupProps, l as IListingResultHeaderProps, m as IListingSearchProps, n as IListingSidebarProps, a as IListingToolbarProps, f as IListingComponents } from '../listing-app-DrVdHL4h.js';
4
- export { B as BottomNav, r as BottomNavView, s as IBottomNavAction, t as IBottomNavProps, v as IStyledListingLayoutProps, L as ListingApp, w as ListingAppMapProp, o as ListingAppProps, q as MobileSheetFooterContext, S as StyledListingLayout } from '../listing-app-DrVdHL4h.js';
3
+ import { f as IListingCardProps, h as IListingEmptyProps, i as IListingFilterPanelProps, j as IListingLoadingProps, k as IListingMarkerProps, l as IListingPopupProps, m as IListingResultHeaderProps, n as IListingSearchProps, o as IListingSidebarProps, a as IListingToolbarProps, g as IListingComponents } from '../listing-app-DxRpWQgn.js';
4
+ export { B as BottomNav, s as BottomNavView, t as IBottomNavAction, v as IBottomNavProps, w as IStyledListingLayoutProps, L as ListingApp, x as ListingAppMapProp, p as ListingAppProps, r as MobileSheetFooterContext, S as StyledListingLayout } from '../listing-app-DxRpWQgn.js';
5
5
  import '../map-provider.interface-8hvdqqjd.js';
6
6
 
7
7
  /**
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{E as r,F as p,G as i,H as y,I as d,J as l,K as n,L as m,M as s,N as a,O as t,P as S,Q as f,R as P,S as u,q as e}from"../chunk-37GNJZB2.js";import{jsx as g}from"react/jsx-runtime";function L({children:o}){return g(e,{...t,children:o})}export{S as BottomNav,f as BottomSheet,u as ListingApp,r as StyledCard,L as StyledComponentsProviderWithDefaults,p as StyledEmpty,i as StyledFilterPanel,P as StyledListingLayout,y as StyledLoading,d as StyledMarker,l as StyledPopup,n as StyledResultHeader,m as StyledSearch,s as StyledSidebar,a as StyledToolbar,t as styledDefaultComponents};
2
+ import{E as r,F as p,G as i,H as y,I as d,J as l,K as n,L as m,M as s,N as a,O as S,P as t,Q as f,R as P,S as u,q as e}from"../chunk-AU6BK7UM.js";import{jsx as g}from"react/jsx-runtime";function L({children:o}){return g(e,{...t,children:o})}export{r as BottomNav,f as BottomSheet,u as ListingApp,p as StyledCard,L as StyledComponentsProviderWithDefaults,i as StyledEmpty,y as StyledFilterPanel,P as StyledListingLayout,d as StyledLoading,l as StyledMarker,n as StyledPopup,m as StyledResultHeader,s as StyledSearch,a as StyledSidebar,S as StyledToolbar,t as styledDefaultComponents};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-listing-engine",
3
- "version": "0.7.21",
3
+ "version": "0.8.0",
4
4
  "license": "MIT",
5
5
  "description": "Headless, composable listing engine for React: filterable list + Google-Maps multi-layer map, with pluggable data adapters, a filter/dataset registry, injectable components, and a Tailwind-free styled adapter.",
6
6
  "funding": [
@@ -80,14 +80,6 @@
80
80
  "optional": true
81
81
  }
82
82
  },
83
- "scripts": {
84
- "build": "tsup",
85
- "test": "vitest run",
86
- "test:watch": "vitest",
87
- "typecheck": "tsc -p tsconfig.json --noEmit",
88
- "lint": "eslint .",
89
- "release": "changeset publish"
90
- },
91
83
  "devDependencies": {
92
84
  "@changesets/cli": "^2.31.1",
93
85
  "@googlemaps/js-api-loader": "^2.1.1",
@@ -111,5 +103,13 @@
111
103
  },
112
104
  "publishConfig": {
113
105
  "access": "public"
106
+ },
107
+ "scripts": {
108
+ "build": "tsup",
109
+ "test": "vitest run",
110
+ "test:watch": "vitest",
111
+ "typecheck": "tsc -p tsconfig.json --noEmit",
112
+ "lint": "eslint .",
113
+ "release": "changeset publish"
114
114
  }
115
- }
115
+ }
@@ -1,2 +0,0 @@
1
- "use client";
2
- var J=class{state;listeners=new Set;constructor(e){this.state=this.freezeState({filters:{...e.filters},results:{items:[],nextCursor:null},bounds:null,selection:null,hovered:null,pagination:{mode:e.mode??"paged",loading:!1,pageIndex:0},layers:{},points:{}})}getState(){return this.state}setFilters(e){this.setState({filters:{...this.state.filters,...e}})}setResults(e){this.setState({results:{items:[...e.items],nextCursor:e.nextCursor,total:e.total}})}appendResults(e){this.setState({results:{items:[...this.state.results.items,...e.items],nextCursor:e.nextCursor,total:e.total}})}setBounds(e){this.setState({bounds:e?{...e}:null})}setSelection(e){this.setState({selection:e})}setHovered(e){this.setState({hovered:e})}setLayerVisible(e,i){this.setState({layers:{...this.state.layers,[e]:i}})}setLoading(e){this.setState({pagination:{...this.state.pagination,loading:e}})}setPageIndex(e){this.setState({pagination:{...this.state.pagination,pageIndex:e}})}setPoints(e,i){this.setState({points:{...this.state.points,[e]:[...i]}})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}setState(e){this.state=this.freezeState({...this.state,...e}),this.notify()}notify(){for(let e of this.listeners)e()}freezeState(e){Object.freeze(e.filters),Object.freeze(e.results.items),Object.freeze(e.results),e.bounds&&Object.freeze(e.bounds),Object.freeze(e.pagination),Object.freeze(e.layers);for(let i of Object.values(e.points))Object.freeze(i);return Object.freeze(e.points),Object.freeze(e)}};var U=class{defs=new Map;add(e){if(this.defs.has(e.key))throw new Error(`FilterRegistry: filter "${e.key}" is already registered`);return this.defs.set(e.key,{...e}),this}remove(e){return this.defs.delete(e),this}replace(e,i){if(!this.defs.has(e))throw new Error(`FilterRegistry: cannot replace unregistered filter "${e}"`);return this.defs.set(e,{...i,key:e}),this}reorder(e){let i=this.list(),r=e.filter(s=>this.defs.has(s));r.forEach((s,o)=>{this.defs.get(s).order=o});let n=new Set(r);return i.filter(s=>!n.has(s.key)).forEach((s,o)=>{s.order=r.length+o}),this}list(){return[...this.defs.values()].sort((e,i)=>e.order-i.order)}has(e){return this.defs.has(e)}toFilters(e){return this.list().filter(r=>Object.hasOwn(e,r.key)).map(r=>r.toParams(e[r.key])).reduce((r,n)=>({...r,...n}),{})}activeKeys(e){return this.list().filter(i=>i.isActive?.(e)).map(i=>i.key)}clearedParams(){return this.list().reduce((e,i)=>Object.assign(e,i.toParams(i.fromParams({}))),{})}};var Y=class{defs=new Map;add(e){if(this.defs.has(e.id))throw new Error(`DatasetRegistry: dataset "${e.id}" is already registered`);return this.defs.set(e.id,{...e}),this}get(e){return this.defs.get(e)}has(e){return this.defs.has(e)}list(){return[...this.defs.values()]}visibleIds(){return this.list().filter(e=>e.visible?.()!==!1).map(e=>e.id)}};var ee=class{map=new Map;dispose(){this.map.clear()}emit(e){let i=this.map.get(e.type);if(i)for(let n of[...i])n(e);let r=this.map.get("*");if(r)for(let n of[...r])n(e)}on(e,i){let r=this.map.get(e);return r||(r=new Set,this.map.set(e,r)),r.add(i),()=>{r.delete(i)}}};var Be={pagination:"paged",pageSize:20,debounceMs:250};var te=class{options;constructor(e){this.options=Object.freeze({...Be,...e})}};var ie=class{filters;map;datasets;primaryDatasetId;store;emitter=new ee;config;debounceTimer=null;debounceResolve=null;queryToken=0;pointsToken=0;mapHandle=null;constructor(e){this.datasets=e.datasets,this.filters=e.filters??new U,this.map=e.map,this.config=new te(e.config);let i=e.primaryDatasetId??this.datasets.list()[0]?.id;if(i==null||!this.datasets.has(i))throw new Error(`ListingEngine: primary dataset "${i??""}" is not registered \u2014 pass a valid primaryDatasetId or register at least one dataset`);this.primaryDatasetId=i,this.store=new J({filters:e.initialFilters??{},mode:this.config.options.pagination})}get state(){return this.store.getState()}get options(){return this.config.options}applyFilters(e){this.store.setFilters(e),this.emitter.emit({type:"FiltersChanged",filters:this.currentFilters()}),this.clearDebounce();let i=++this.queryToken,r=this.config.options.debounceMs;return r<=0?this.runQuery(i):new Promise(n=>{this.debounceResolve=n,this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.debounceResolve=null,n(this.runQuery(i))},r)})}async loadPage(){let e=this.state.results.nextCursor;if(e===null)return;let i=++this.queryToken,r=this.primaryDataset();this.store.setLoading(!0);try{let n=await r.adapter.list(this.currentFilters(),{cursor:e,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.config.options.pagination==="infinite"?this.store.appendResults(n):this.store.setResults(n),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:n.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async goToPage(e){if(e<0)return;let i=++this.queryToken,r=this.primaryDataset();this.store.setLoading(!0);try{let n=await r.adapter.list(this.currentFilters(),{offset:e*this.config.options.pageSize,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.store.setResults(n),this.store.setPageIndex(e),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:n.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async loadPoints(e){this.store.setBounds(e),this.emitter.emit({type:"BoundsChanged",bounds:e});let i=this.currentFilters(),r=++this.pointsToken;await Promise.allSettled(this.datasets.visibleIds().map(async n=>{let s=this.datasets.get(n);if(!s)return;let o=await s.adapter.getPoints(i,e);r===this.pointsToken&&this.store.setPoints(n,o)}))}setMapHandle(e){this.mapHandle=e}fitBounds(e,i){!this.map||!this.mapHandle||this.map.fitBounds(this.mapHandle,e,i)}selectPoint(e,i){this.store.setSelection(i);let r=this.state.points[e]?.find(n=>n.id===i);r&&this.emitter.emit({type:"PointClicked",datasetId:e,id:r.id,entity:r.entity})}setHovered(e,i){this.store.setHovered(i)}toggleLayer(e){let r=!(this.state.layers[e]??!0);this.store.setLayerVisible(e,r),this.emitter.emit({type:"LayerToggled",datasetId:e,visible:r})}subscribe(e){return this.store.subscribe(e)}on(e,i){return this.emitter.on(e,i)}dispose(){this.clearDebounce(),this.emitter.dispose(),this.mapHandle=null}async runQuery(e){if(e!==this.queryToken)return;let i=this.primaryDataset();this.store.setLoading(!0);try{let r=await i.adapter.list(this.currentFilters(),{cursor:null,limit:this.config.options.pageSize});if(e!==this.queryToken)return;this.store.setResults(r),this.store.setPageIndex(0),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{e===this.queryToken&&this.store.setLoading(!1)}}primaryDataset(){return this.datasets.get(this.primaryDatasetId)}currentFilters(){return this.store.getState().filters}clearDebounce(){this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.debounceResolve!==null&&(this.debounceResolve(),this.debounceResolve=null)}};function He(...t){let e={config:{},filters:new U,datasets:new Y};for(let i of t)i(e);return e}var Ae=t=>e=>{e.config={...e.config,...t}},ze=t=>e=>{e.map=t},Ue=t=>e=>{e.datasets.add(t)},Ke=t=>e=>{t(e.filters)},Ni=t=>e=>{e.urlSync=t},Ve=t=>e=>{e.initialFilters=t},Ri=t=>e=>{e.primaryDatasetId=t};import{createContext as yt,useContext as ht}from"react";import{jsx as M,jsxs as It}from"react/jsx-runtime";function vt(t){return String(t?.title??"")}var bt=({item:t})=>M("div",{children:vt(t)}),Lt=()=>M("div",{}),me=()=>M("div",{}),Tt=({children:t})=>M("div",{children:t}),Pt=({children:t})=>M("div",{children:t}),Ft=({value:t,onChange:e,placeholder:i})=>M("input",{type:"search",value:t,placeholder:i,onChange:r=>e(r.target.value),"aria-label":i??"Search"}),kt=()=>M("div",{role:"status",children:"No results"}),St=()=>M("div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),Ct=({count:t})=>It("div",{children:[t," results"]}),wt=({children:t})=>M("div",{children:t}),E={Card:bt,Marker:Lt,Popup:me,Sidebar:Tt,FilterPanel:Pt,Search:Ft,Empty:kt,Loading:St,ResultHeader:Ct,Toolbar:wt},qe=yt(E);function $e(t){let{Card:e,Marker:i,Popup:r,Sidebar:n,FilterPanel:s,Search:o,Empty:d,Loading:p,ResultHeader:l,Toolbar:a,children:g}=t,b={Card:e??E.Card,Marker:i??E.Marker,Popup:r??E.Popup,Sidebar:n??E.Sidebar,FilterPanel:s??E.FilterPanel,Search:o??E.Search,Empty:d??E.Empty,Loading:p??E.Loading,ResultHeader:l??E.ResultHeader,Toolbar:a??E.Toolbar};return M(qe.Provider,{value:b,children:g})}function P(){return ht(qe)}import{createContext as Et}from"react";var re=Et(null);import{useContext as xt}from"react";function y(){let t=xt(re);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}import{useCallback as We,useSyncExternalStore as Nt}from"react";function F(){let t=y(),e=We(r=>t.subscribe(r),[t]),i=We(()=>t.state,[t]);return Nt(e,i,i)}import{useCallback as je}from"react";function ne(){let t=y(),e=F(),i=je(n=>t.applyFilters(n),[t]),r=je((n,s)=>t.applyFilters({[n]:s}),[t]);return{filters:e.filters,set:i,setField:r}}import{jsx as j,jsxs as Rt}from"react/jsx-runtime";function ge({className:t,groupClassName:e,hideLabels:i,draft:r,onDraftChange:n}={}){let s=y(),{FilterPanel:o}=P(),{filters:d}=ne(),p=r!==void 0&&n!==void 0,l=p?r:d;return j(o,{children:j("div",{className:t??"space-y-5",children:s.filters.list().map(a=>{if(typeof a.render=="string")return j("div",{"data-filter":a.key,className:e},a.key);let g=a.render;return Rt("div",{className:e,children:[a.label&&!i&&j("div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:a.label}),j(g,{value:a.fromParams(l),onChange:b=>p?n(a.toParams(b)):void s.applyFilters(a.toParams(b))})]},a.key)})})})}function K(){return F().results}import{jsx as se}from"react/jsx-runtime";function Mt(t,e){if(t&&typeof t=="object"&&"id"in t){let i=t.id;if(typeof i=="string"||typeof i=="number")return i}return e}function Ge({className:t}={}){let e=y(),{items:i}=K(),{pagination:r,selection:n}=F(),{Card:s,Empty:o,Loading:d}=P();return r.loading&&i.length===0?se(d,{}):i.length===0?se(o,{}):se("div",{role:"list",className:t,children:i.map((p,l)=>{let a=Mt(p,l);return se(s,{item:p,selected:n===a,onSelect:()=>e.selectPoint(e.primaryDatasetId,a)},a)})})}import{useEffect as G,useRef as B,useState as Qe}from"react";import{createPortal as Dt}from"react-dom";import{jsx as fe,jsxs as Je}from"react/jsx-runtime";var Ot={west:-179.9,south:-85,east:179.9,north:85},Ze=.1,Xe=.02;function _t(t){if(t.length===0)return null;let e=t[0].lng,i=t[0].lng,r=t[0].lat,n=t[0].lat;for(let{lat:d,lng:p}of t)p<e&&(e=p),p>i&&(i=p),d<r&&(r=d),d>n&&(n=d);let s=n>r?(n-r)*Ze:Xe,o=i>e?(i-e)*Ze:Xe;return{west:e-o,east:i+o,south:r-s,north:n+s}}function Ye(t){let{center:e,zoom:i,fallback:r,mapControls:n}=t,s=y(),o=F(),d=B(null),p=B(null),l=B(null),[a,g]=Qe(!1),b=B(!1),x=B(!1),S=B(!1),c=s.map;G(()=>{let T=l.current;if(!c||!T)return;let h=[];for(let u of Object.keys(o.points)){if(o.layers[u]===!1)continue;let f=s.datasets.get(u),I=o.points[u]??[],$={id:u,markers:I.map(R=>({id:R.id,position:R.position,iconUrl:f?.marker.iconUrl?.(R.entity),element:f?.marker.element?.(R.entity)})),clustering:f?.clustering,onMarkerClick:R=>s.selectPoint(u,R)};h.push(c.renderLayer(T,$))}return()=>{h.forEach(u=>u())}},[s,c,a,o.points,o.layers]),G(()=>{if(!d.current||!c)return;let T=d.current,h=!1,u=null;return(async()=>{let f=await c.mount(T,{center:e,zoom:i,fullscreenTarget:p.current??void 0});if(h){c.destroy(f);return}l.current=f,s.setMapHandle(f),u=c.onBoundsChange(f,I=>{S.current?S.current=!1:x.current=!0,s.loadPoints(I)}),g(!0),s.loadPoints(Ot)})(),()=>{h=!0,u?.(),l.current&&(c.destroy(l.current),l.current=null,s.setMapHandle(null)),g(!1)}},[s,c]),G(()=>{let T=l.current;if(!c||!T||e||b.current||x.current)return;let h=[];for(let f of Object.keys(o.points))if(o.layers[f]!==!1)for(let I of o.points[f]??[])h.push(I.position);let u=_t(h);u&&(b.current=!0,S.current=!0,c.fitBounds(T,u))},[c,e,a,o.points,o.layers]),G(()=>{c?.updateMarkerStates(o.selection,o.hovered)},[c,a,o.selection,o.hovered]);let{Popup:L}=P(),N=L!==me,C=o.points[s.primaryDatasetId]??[],z=o.selection!=null?C.find(T=>T.id===o.selection):void 0,[w,D]=Qe(null),X=B(z);return X.current=z,G(()=>{let T=l.current;if(!c||!T||!N)return;let h=X.current;if(!h)return;let u=c.mountOverlay(h.position);D({entity:h.entity,position:h.position,container:u.container});let f=()=>s.selectPoint(s.primaryDatasetId,null),I=R=>{R.key==="Escape"&&f()};document.addEventListener("keydown",I);let $=c.onMapClick(f);return()=>{document.removeEventListener("keydown",I),$(),u.unmount(),D(null)}},[s,c,a,o.selection,N]),Je("div",{ref:p,className:"relative h-full min-h-0 w-full",children:[Je("div",{ref:d,className:!c&&r?"flex h-full min-h-0 w-full items-center justify-center":"h-full min-h-0 w-full",children:[!c&&r,N&&w?Dt(fe(L,{entity:w.entity,onClose:()=>s.selectPoint(s.primaryDatasetId,null)}),w.container):null]}),n!=null&&fe("div",{className:"pointer-events-none absolute inset-0",children:fe("div",{className:"pointer-events-auto",children:n})})]})}import{jsx as Q,jsxs as Ht}from"react/jsx-runtime";var ye="gap";function Bt(t,e){if(t<=7)return Array.from({length:t},(s,o)=>o+1);let i=Math.max(2,e-1),r=Math.min(t-1,e+1),n=[1];i>2&&n.push(ye);for(let s=i;s<=r;s+=1)n.push(s);return r<t-1&&n.push(ye),n.push(t),n}function et(){let t=y(),{results:e,pagination:i}=F();if(i.mode==="infinite")return e.nextCursor==null?null:Q("button",{type:"button",disabled:i.loading,onClick:()=>{t.loadPage()},children:"Load more"});let r=t.options.pageSize,{pageIndex:n}=i,s=n+1,o=e.total!=null?Math.ceil(e.total/r):null,d=o!=null?s<o:e.nextCursor!=null||e.items.length>=r;if(o!=null?o<=1:n===0&&!d)return null;let p=l=>()=>{t.goToPage(l)};return Ht("nav",{className:"rle-pagination","aria-label":"Pagination",children:[Q("button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Previous page",disabled:i.loading||n===0,onClick:p(n-1),children:"\u2039"}),o!=null&&Bt(o,s).map((l,a)=>l===ye?Q("span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${a}`):Q("button",{type:"button",className:l===s?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${l}`,"aria-current":l===s?"page":void 0,disabled:i.loading,onClick:p(l-1),children:l},l)),Q("button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Next page",disabled:i.loading||!d,onClick:p(n+1),children:"\u203A"})]})}import{jsx as At}from"react/jsx-runtime";function tt(){let{items:t,total:e}=K(),{ResultHeader:i}=P();return At(i,{count:t.length,total:e})}import{useEffect as zt,useRef as Ut}from"react";function it(t,e){let i=y(),r=Ut(e);r.current=e,zt(()=>i.on(t,n=>r.current(n)),[i,t])}import{useEffect as Kt,useState as rt}from"react";import{jsx as Vt}from"react/jsx-runtime";function nt(t){let{children:e,...i}=t,[r]=rt(()=>i),[n,s]=rt(null);return Kt(()=>{let o=new ie({datasets:r.datasets,filters:r.filters,config:r.config,map:r.map,initialFilters:r.initialFilters,primaryDatasetId:r.primaryDatasetId});return r.urlSync&&r.urlSync.start(o),s(o),()=>{r.urlSync&&r.urlSync.stop(),o.dispose(),s(d=>d===o?null:d)}},[r]),n?Vt(re.Provider,{value:n,children:e}):null}function V(t){return typeof t!="number"?t:new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0}).format(t)}import{Fragment as $t,jsx as O,jsxs as st}from"react/jsx-runtime";function qt(t){return t?"rle-card rle-card--selected":"rle-card"}function he({item:t,selected:e,onSelect:i}){let r=t??{},n=qt(e),s=st($t,{children:[r.imageUrl?O("img",{src:r.imageUrl,alt:r.title??"",className:"rle-card-media"}):O("div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),st("div",{className:"rle-card-body",children:[r.title&&O("span",{className:"rle-card-title",children:r.title}),r.subtitle&&O("span",{className:"rle-card-address",children:r.subtitle}),r.badge&&O("div",{className:"rle-card-info",children:O("span",{className:"rle-card-info-item",children:r.badge})}),r.price!=null&&O("span",{className:"rle-card-price",children:V(r.price)})]})]});return i?O("button",{type:"button",onClick:i,"aria-pressed":e??!1,className:n,children:s}):O("article",{className:n,children:s})}import{jsx as oe,jsxs as ot}from"react/jsx-runtime";function ve(t){return ot("div",{role:"status",className:"rle-empty",children:[ot("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",className:"rle-empty-icon","aria-hidden":"true",children:[oe("circle",{cx:"11",cy:"11",r:"7"}),oe("path",{d:"m21 21-4.3-4.3"})]}),oe("p",{className:"rle-empty-title",children:"No results"}),oe("p",{className:"rle-empty-hint",children:"Try adjusting your filters or search terms."})]})}import{jsx as Wt}from"react/jsx-runtime";function be({children:t}){return Wt("div",{className:"rle-filter-panel",children:t})}import{jsx as ae,jsxs as jt}from"react/jsx-runtime";function Le(t){return ae("div",{className:"rle-loading",role:"status","aria-busy":"true","aria-label":"Loading results",children:Array.from({length:3}).map((e,i)=>jt("div",{className:"rle-loading-item",children:[ae("div",{className:"rle-skeleton",style:{aspectRatio:"4 / 3",width:"100%"}}),ae("div",{className:"rle-skeleton",style:{height:16,width:"65%"}}),ae("div",{className:"rle-skeleton",style:{height:12,width:"35%"}})]},i))})}import{jsx as Gt}from"react/jsx-runtime";function Te({point:t}){let e=t.entity??{};return Gt("span",{className:"rle-pin",children:e.price!=null?V(e.price):""})}import{jsx as q,jsxs as Pe}from"react/jsx-runtime";function Fe({entity:t,onClose:e}){let i=t??{};return Pe("div",{className:"rle-popup",role:"group","aria-label":"Location details",children:[q("button",{type:"button",onClick:e,"aria-label":"Close",className:"rle-popup-close",children:Pe("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[q("path",{d:"M18 6 6 18"}),q("path",{d:"m6 6 12 12"})]})}),Pe("div",{children:[i.title&&q("div",{className:"rle-card-title",children:i.title}),i.subtitle&&q("div",{className:"rle-card-address",children:i.subtitle}),i.price!=null&&q("div",{className:"rle-card-price",children:V(i.price)})]})]})}import{jsx as Qt}from"react/jsx-runtime";function ke({count:t,total:e}){let i=e!=null&&e!==t?`${t} of ${e} results`:`${t} results`;return Qt("div",{className:"rle-result-header",children:i})}import{jsx as Zt}from"react/jsx-runtime";function Se({value:t,onChange:e,placeholder:i}){return Zt("input",{type:"search",value:t,placeholder:i,onChange:r=>e(r.target.value),"aria-label":i??"Search",className:"rle-input"})}import{jsx as Xt}from"react/jsx-runtime";function Ce({children:t}){return Xt("aside",{className:"rle-sidebar",children:t})}import{jsx as Jt}from"react/jsx-runtime";function we({children:t}){return Jt("div",{className:"rle-toolbar",children:t})}var at={Card:he,Marker:Te,Popup:Fe,Sidebar:Ce,FilterPanel:be,Search:Se,Empty:ve,Loading:Le,ResultHeader:ke,Toolbar:we};import{jsx as k,jsxs as Z}from"react/jsx-runtime";function lt({view:t,onViewChange:e}){return k("nav",{className:"rle-bottom-nav","aria-label":"Listing navigation",children:Z("div",{className:"rle-viewtoggle",role:"group","aria-label":"View",children:[Z("button",{type:"button",className:`rle-viewtoggle__btn${t==="list"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="list",onClick:()=>e("list"),children:[k(Yt,{}),"List"]}),Z("button",{type:"button",className:`rle-viewtoggle__btn${t==="map"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="map",onClick:()=>e("map"),children:[k(ei,{}),"Map"]})]})})}function Yt(){return Z("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[k("line",{x1:"8",y1:"6",x2:"20",y2:"6"}),k("line",{x1:"8",y1:"12",x2:"20",y2:"12"}),k("line",{x1:"8",y1:"18",x2:"20",y2:"18"}),k("line",{x1:"4",y1:"6",x2:"4.01",y2:"6"}),k("line",{x1:"4",y1:"12",x2:"4.01",y2:"12"}),k("line",{x1:"4",y1:"18",x2:"4.01",y2:"18"})]})}function ei(){return Z("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[k("polygon",{points:"1 6 8 3 16 6 23 3 23 18 16 21 8 18 1 21 1 6"}),k("line",{x1:"8",y1:"3",x2:"8",y2:"18"}),k("line",{x1:"16",y1:"6",x2:"16",y2:"21"})]})}import{useEffect as Ie,useRef as ti,useState as dt}from"react";import{createPortal as ii}from"react-dom";import{Fragment as ni,jsx as _,jsxs as le}from"react/jsx-runtime";function pt({open:t,onOpenChange:e,title:i,children:r,footer:n}){let s=ti(null),[o,d]=dt(!1),[p,l]=dt(!1);return Ie(()=>{if(!t){l(!1),d(!1);return}d(!0);let a=requestAnimationFrame(()=>l(!0));return()=>cancelAnimationFrame(a)},[t]),Ie(()=>{if(!o)return;let a=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=a}},[o]),Ie(()=>{if(!o)return;s.current?.focus();function a(g){g.key==="Escape"&&e(!1)}return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[o,e]),!o||typeof document>"u"?null:ii(le(ni,{children:[_("div",{className:`rle-sheet-backdrop${p?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),le("div",{ref:s,className:`rle-sheet${p?" rle-sheet--open":""}`,role:"dialog","aria-modal":"true","aria-label":i,tabIndex:-1,children:[_("div",{className:"rle-sheet__handle","aria-hidden":"true"}),le("div",{className:"rle-sheet__header",children:[i&&_("div",{className:"rle-sheet__title",children:i}),_("button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:_(ri,{})})]}),_("div",{className:"rle-sheet__body",children:r}),n&&_("div",{className:"rle-sheet__footer",children:n})]})]}),document.body)}function ri(){return le("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_("path",{d:"M18 6 6 18"}),_("path",{d:"m6 6 12 12"})]})}import{useEffect as pe,useRef as Ee,useState as A}from"react";import{jsx as v,jsxs as de}from"react/jsx-runtime";function ct({search:t,onFiltersClick:e,filterCount:i=0,action:r}){let{Search:n}=P();return de("header",{className:"rle-mobile-header",children:[t&&v("div",{className:"rle-mobile-header__search",children:v(n,{value:t.value,onChange:t.onChange,placeholder:t.placeholder})}),de("button",{type:"button",className:"rle-btn rle-mobile-header__btn",onClick:e,children:[v(si,{}),v("span",{children:"Filters"}),i>0&&v("span",{className:"rle-mobile-header__count",children:i})]}),r&&v("button",{type:"button",className:"rle-btn rle-mobile-header__btn rle-mobile-header__btn--icon",onClick:r.onClick,"aria-label":r.label,children:r.icon??v(oi,{})})]})}function si(){return de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[v("line",{x1:"4",y1:"6",x2:"20",y2:"6"}),v("circle",{cx:"9",cy:"6",r:"2",fill:"currentColor",stroke:"none"}),v("line",{x1:"4",y1:"12",x2:"20",y2:"12"}),v("circle",{cx:"15",cy:"12",r:"2",fill:"currentColor",stroke:"none"}),v("line",{x1:"4",y1:"18",x2:"20",y2:"18"}),v("circle",{cx:"11",cy:"18",r:"2",fill:"currentColor",stroke:"none"})]})}function oi(){return de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[v("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),v("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}import{Fragment as pi,jsx as m,jsxs as H}from"react/jsx-runtime";var ai=m("div",{className:"rle-empty",children:"Map unavailable"});function li(){let t=Ee(null),[e,i]=A(!0),[r,n]=A(!0);return pe(()=>{let s=t.current;if(!s)return;let o=()=>{let{clientWidth:g,scrollLeft:b,scrollWidth:x}=s;i(b<=0),n(b+g>=x-1)},d=0,p=()=>{d||(d=requestAnimationFrame(()=>{d=0,o()}))};o(),s.addEventListener("scroll",o,{passive:!0});let l,a;return typeof ResizeObserver<"u"&&(l=new ResizeObserver(o),l.observe(s)),typeof MutationObserver<"u"&&(a=new MutationObserver(p),a.observe(s,{characterData:!0,childList:!0,subtree:!0})),()=>{s.removeEventListener("scroll",o),l?.disconnect(),a?.disconnect(),d&&cancelAnimationFrame(d)}},[]),{atEnd:r,atStart:e,ref:t}}function di(t,e){if(t===e)return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;let i=t,r=e,n=new Set([...Object.keys(i),...Object.keys(r)]);for(let s of n)if(i[s]!==r[s])return!1;return!0}function ut({search:t,filterBarStart:e,toolbarEnd:i,mobileAction:r,autoFetch:n=!0,hasMap:s,mapCenter:o,mapZoom:d,mapControls:p,mobileSheetFooter:l,className:a}){let g=y(),{Search:b}=P(),x=K(),{filters:S,set:c}=ne(),{pagination:L}=F(),N=s??g.map!=null,[C,z]=A("list"),[w,D]=A(!1),{atEnd:X,atStart:T,ref:h}=li(),u=Ee(null);pe(()=>{L.mode==="paged"&&u.current&&(u.current.scrollTop=0)},[L.mode,L.pageIndex]);let[f,I]=A(S),[$,R]=A(w);w!==$&&(R(w),w&&I(S));let Ne=ue=>I(ft=>({...ft,...ue})),[Re,Me]=A(!1),ce=Ee(!1);pe(()=>{if(Re){if(L.loading){ce.current=!0;return}ce.current&&(ce.current=!1,Me(!1),D(!1))}},[Re,L.loading]);let W=t?{value:String(S[t.filterKey]??""),onChange:ue=>{c({[t.filterKey]:ue||void 0})},placeholder:t.placeholder}:void 0;pe(()=>{n!==!1&&g.applyFilters({})},[g,n]);let De=()=>{Ne(g.filters.clearedParams())},Oe=()=>{if(di(f,S)){D(!1);return}Me(!0),g.applyFilters(f)},gt=g.filters.activeKeys(S).length,_e=x.total??x.items.length;return H("div",{className:a?`rle-app ${a}`:"rle-app",children:[H("div",{className:"rle-filter-bar",children:[H("div",{className:"rle-filter-bar__scroll",ref:h,children:[W&&m("div",{className:"rle-filter-bar__search",children:m(b,{value:W.value,onChange:W.onChange,placeholder:W.placeholder})}),e&&m("div",{className:"rle-filter-bar__slot",children:e}),m(ge,{className:"rle-filters-row",groupClassName:"rle-filter-group",hideLabels:!0})]}),!T&&m("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!X&&m("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),m(ct,{search:W,onFiltersClick:()=>D(!0),filterCount:gt,action:r}),H("div",{className:`rle-body ${N?"rle-split":"rle-body--list-only"}`,"data-mobile-view":C,children:[H("div",{className:"rle-list",ref:u,children:[H("div",{className:"rle-list-header",children:[m(tt,{}),i&&m("div",{className:"rle-list-header__toolbar",children:i})]}),m(Ge,{className:"rle-list-grid"}),m(et,{})]}),N&&m("div",{className:"rle-map",children:m(Ye,{center:o,zoom:d,fallback:ai,mapControls:p})})]}),N&&m(lt,{view:C,onViewChange:z}),m(pt,{title:"Filters",open:w,onOpenChange:D,footer:l?l({draft:f,apply:Oe,clear:De,resultCount:_e,loading:L.loading}):H(pi,{children:[m("button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:De,children:"Clear all"}),m("button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:L.loading,onClick:Oe,children:L.loading?m("span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${_e} results`})]}),children:m(ge,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:f,onDraftChange:Ne})})]})}import{useEffect as ci,useRef as ui,useState as mi}from"react";import{jsx as xe,jsxs as yi}from"react/jsx-runtime";function mt(t){return"provider"in t}function gi(t){let e=t!=null&&!mt(t),i=e?t.apiKey:void 0,r=e?t.mapId:void 0,n=e?t.mapOptions:void 0,s=e?t.styles:void 0,o=e?t.overlayMarkers:void 0,[d,p]=mi(()=>!t||mt(t)?{ready:!0,provider:t?.provider}:{ready:!1});return ci(()=>{if(!i)return;let l=!1;return import("./maps/google/index.js").then(({googleProvider:a})=>{l||p({ready:!0,provider:a({apiKey:i,mapId:r,mapOptions:n,styles:s,overlayMarkers:o})})}),()=>{l=!0}},[i,r]),d}function fi({onFiltersChange:t}){let e=ui(t);return e.current=t,it("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function _n(t){let{datasets:e,filters:i,map:r,components:n,initialFilters:s,onFiltersChange:o,mobileAction:d,search:p,filterBarStart:l,toolbarEnd:a,mapControls:g,mobileSheetFooter:b,config:x,autoFetch:S,className:c}=t,{ready:L,provider:N}=gi(r);if(!L)return null;let C=[];for(let D of e)C.push(Ue(D));i&&C.push(Ke(i)),N&&C.push(ze(N)),s&&C.push(Ve(s)),x&&C.push(Ae(x));let z=He(...C),w={...at,...n};return yi(nt,{...z,children:[o&&xe(fi,{onFiltersChange:o}),xe($e,{...w,children:xe(ut,{className:c,search:p,filterBarStart:l,toolbarEnd:a,mobileAction:d,autoFetch:S,mapCenter:r?.center,mapZoom:r?.zoom,mapControls:g,mobileSheetFooter:b})})]})}export{J as a,U as b,Y as c,ee as d,Be as e,te as f,ie as g,He as h,Ae as i,ze as j,Ue as k,Ke as l,Ni as m,Ve as n,Ri as o,me as p,$e as q,P as r,re as s,y as t,F as u,ne as v,ge as w,K as x,Ge as y,Ye as z,et as A,tt as B,it as C,nt as D,he as E,ve as F,be as G,Le as H,Te as I,Fe as J,ke as K,Se as L,Ce as M,we as N,at as O,lt as P,pt as Q,ut as R,_n as S};
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5;"use client";
2
- var J= (_class =class{__init() {this.listeners=new Set}constructor(e){;_class.prototype.__init.call(this);this.state=this.freezeState({filters:{...e.filters},results:{items:[],nextCursor:null},bounds:null,selection:null,hovered:null,pagination:{mode:_nullishCoalesce(e.mode, () => ("paged")),loading:!1,pageIndex:0},layers:{},points:{}})}getState(){return this.state}setFilters(e){this.setState({filters:{...this.state.filters,...e}})}setResults(e){this.setState({results:{items:[...e.items],nextCursor:e.nextCursor,total:e.total}})}appendResults(e){this.setState({results:{items:[...this.state.results.items,...e.items],nextCursor:e.nextCursor,total:e.total}})}setBounds(e){this.setState({bounds:e?{...e}:null})}setSelection(e){this.setState({selection:e})}setHovered(e){this.setState({hovered:e})}setLayerVisible(e,i){this.setState({layers:{...this.state.layers,[e]:i}})}setLoading(e){this.setState({pagination:{...this.state.pagination,loading:e}})}setPageIndex(e){this.setState({pagination:{...this.state.pagination,pageIndex:e}})}setPoints(e,i){this.setState({points:{...this.state.points,[e]:[...i]}})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}setState(e){this.state=this.freezeState({...this.state,...e}),this.notify()}notify(){for(let e of this.listeners)e()}freezeState(e){Object.freeze(e.filters),Object.freeze(e.results.items),Object.freeze(e.results),e.bounds&&Object.freeze(e.bounds),Object.freeze(e.pagination),Object.freeze(e.layers);for(let i of Object.values(e.points))Object.freeze(i);return Object.freeze(e.points),Object.freeze(e)}}, _class);var U= (_class2 =class{constructor() { _class2.prototype.__init2.call(this); }__init2() {this.defs=new Map}add(e){if(this.defs.has(e.key))throw new Error(`FilterRegistry: filter "${e.key}" is already registered`);return this.defs.set(e.key,{...e}),this}remove(e){return this.defs.delete(e),this}replace(e,i){if(!this.defs.has(e))throw new Error(`FilterRegistry: cannot replace unregistered filter "${e}"`);return this.defs.set(e,{...i,key:e}),this}reorder(e){let i=this.list(),r=e.filter(s=>this.defs.has(s));r.forEach((s,o)=>{this.defs.get(s).order=o});let n=new Set(r);return i.filter(s=>!n.has(s.key)).forEach((s,o)=>{s.order=r.length+o}),this}list(){return[...this.defs.values()].sort((e,i)=>e.order-i.order)}has(e){return this.defs.has(e)}toFilters(e){return this.list().filter(r=>Object.hasOwn(e,r.key)).map(r=>r.toParams(e[r.key])).reduce((r,n)=>({...r,...n}),{})}activeKeys(e){return this.list().filter(i=>_optionalChain([i, 'access', _2 => _2.isActive, 'optionalCall', _3 => _3(e)])).map(i=>i.key)}clearedParams(){return this.list().reduce((e,i)=>Object.assign(e,i.toParams(i.fromParams({}))),{})}}, _class2);var Y= (_class3 =class{constructor() { _class3.prototype.__init3.call(this); }__init3() {this.defs=new Map}add(e){if(this.defs.has(e.id))throw new Error(`DatasetRegistry: dataset "${e.id}" is already registered`);return this.defs.set(e.id,{...e}),this}get(e){return this.defs.get(e)}has(e){return this.defs.has(e)}list(){return[...this.defs.values()]}visibleIds(){return this.list().filter(e=>_optionalChain([e, 'access', _4 => _4.visible, 'optionalCall', _5 => _5()])!==!1).map(e=>e.id)}}, _class3);var ee= (_class4 =class{constructor() { _class4.prototype.__init4.call(this); }__init4() {this.map=new Map}dispose(){this.map.clear()}emit(e){let i=this.map.get(e.type);if(i)for(let n of[...i])n(e);let r=this.map.get("*");if(r)for(let n of[...r])n(e)}on(e,i){let r=this.map.get(e);return r||(r=new Set,this.map.set(e,r)),r.add(i),()=>{r.delete(i)}}}, _class4);var Be={pagination:"paged",pageSize:20,debounceMs:250};var te=class{constructor(e){this.options=Object.freeze({...Be,...e})}};var ie= (_class5 =class{__init5() {this.emitter=new ee}__init6() {this.debounceTimer=null}__init7() {this.debounceResolve=null}__init8() {this.queryToken=0}__init9() {this.pointsToken=0}__init10() {this.mapHandle=null}constructor(e){;_class5.prototype.__init5.call(this);_class5.prototype.__init6.call(this);_class5.prototype.__init7.call(this);_class5.prototype.__init8.call(this);_class5.prototype.__init9.call(this);_class5.prototype.__init10.call(this);this.datasets=e.datasets,this.filters=_nullishCoalesce(e.filters, () => (new U)),this.map=e.map,this.config=new te(e.config);let i=_nullishCoalesce(e.primaryDatasetId, () => (_optionalChain([this, 'access', _6 => _6.datasets, 'access', _7 => _7.list, 'call', _8 => _8(), 'access', _9 => _9[0], 'optionalAccess', _10 => _10.id])));if(i==null||!this.datasets.has(i))throw new Error(`ListingEngine: primary dataset "${_nullishCoalesce(i, () => (""))}" is not registered \u2014 pass a valid primaryDatasetId or register at least one dataset`);this.primaryDatasetId=i,this.store=new J({filters:_nullishCoalesce(e.initialFilters, () => ({})),mode:this.config.options.pagination})}get state(){return this.store.getState()}get options(){return this.config.options}applyFilters(e){this.store.setFilters(e),this.emitter.emit({type:"FiltersChanged",filters:this.currentFilters()}),this.clearDebounce();let i=++this.queryToken,r=this.config.options.debounceMs;return r<=0?this.runQuery(i):new Promise(n=>{this.debounceResolve=n,this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.debounceResolve=null,n(this.runQuery(i))},r)})}async loadPage(){let e=this.state.results.nextCursor;if(e===null)return;let i=++this.queryToken,r=this.primaryDataset();this.store.setLoading(!0);try{let n=await r.adapter.list(this.currentFilters(),{cursor:e,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.config.options.pagination==="infinite"?this.store.appendResults(n):this.store.setResults(n),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:n.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async goToPage(e){if(e<0)return;let i=++this.queryToken,r=this.primaryDataset();this.store.setLoading(!0);try{let n=await r.adapter.list(this.currentFilters(),{offset:e*this.config.options.pageSize,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.store.setResults(n),this.store.setPageIndex(e),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:n.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async loadPoints(e){this.store.setBounds(e),this.emitter.emit({type:"BoundsChanged",bounds:e});let i=this.currentFilters(),r=++this.pointsToken;await Promise.allSettled(this.datasets.visibleIds().map(async n=>{let s=this.datasets.get(n);if(!s)return;let o=await s.adapter.getPoints(i,e);r===this.pointsToken&&this.store.setPoints(n,o)}))}setMapHandle(e){this.mapHandle=e}fitBounds(e,i){!this.map||!this.mapHandle||this.map.fitBounds(this.mapHandle,e,i)}selectPoint(e,i){this.store.setSelection(i);let r=_optionalChain([this, 'access', _11 => _11.state, 'access', _12 => _12.points, 'access', _13 => _13[e], 'optionalAccess', _14 => _14.find, 'call', _15 => _15(n=>n.id===i)]);r&&this.emitter.emit({type:"PointClicked",datasetId:e,id:r.id,entity:r.entity})}setHovered(e,i){this.store.setHovered(i)}toggleLayer(e){let r=!(_nullishCoalesce(this.state.layers[e], () => (!0)));this.store.setLayerVisible(e,r),this.emitter.emit({type:"LayerToggled",datasetId:e,visible:r})}subscribe(e){return this.store.subscribe(e)}on(e,i){return this.emitter.on(e,i)}dispose(){this.clearDebounce(),this.emitter.dispose(),this.mapHandle=null}async runQuery(e){if(e!==this.queryToken)return;let i=this.primaryDataset();this.store.setLoading(!0);try{let r=await i.adapter.list(this.currentFilters(),{cursor:null,limit:this.config.options.pageSize});if(e!==this.queryToken)return;this.store.setResults(r),this.store.setPageIndex(0),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{e===this.queryToken&&this.store.setLoading(!1)}}primaryDataset(){return this.datasets.get(this.primaryDatasetId)}currentFilters(){return this.store.getState().filters}clearDebounce(){this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.debounceResolve!==null&&(this.debounceResolve(),this.debounceResolve=null)}}, _class5);function He(...t){let e={config:{},filters:new U,datasets:new Y};for(let i of t)i(e);return e}var Ae=t=>e=>{e.config={...e.config,...t}},ze= exports.j =t=>e=>{e.map=t},Ue= exports.k =t=>e=>{e.datasets.add(t)},Ke= exports.l =t=>e=>{t(e.filters)},Ni= exports.m =t=>e=>{e.urlSync=t},Ve= exports.n =t=>e=>{e.initialFilters=t},Ri= exports.o =t=>e=>{e.primaryDatasetId=t};var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function vt(t){return String(_nullishCoalesce(_optionalChain([t, 'optionalAccess', _16 => _16.title]), () => ("")))}var bt=({item:t})=>_jsxruntime.jsx.call(void 0, "div",{children:vt(t)}),Lt=()=>_jsxruntime.jsx.call(void 0, "div",{}),me= exports.p =()=>_jsxruntime.jsx.call(void 0, "div",{}),Tt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Pt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Ft=({value:t,onChange:e,placeholder:i})=>_jsxruntime.jsx.call(void 0, "input",{type:"search",value:t,placeholder:i,onChange:r=>e(r.target.value),"aria-label":_nullishCoalesce(i, () => ("Search"))}),kt=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status",children:"No results"}),St=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),Ct=({count:t})=>_jsxruntime.jsxs.call(void 0, "div",{children:[t," results"]}),wt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),E={Card:bt,Marker:Lt,Popup:me,Sidebar:Tt,FilterPanel:Pt,Search:Ft,Empty:kt,Loading:St,ResultHeader:Ct,Toolbar:wt},qe=_react.createContext.call(void 0, E);function $e(t){let{Card:e,Marker:i,Popup:r,Sidebar:n,FilterPanel:s,Search:o,Empty:d,Loading:p,ResultHeader:l,Toolbar:a,children:g}=t,b={Card:_nullishCoalesce(e, () => (E.Card)),Marker:_nullishCoalesce(i, () => (E.Marker)),Popup:_nullishCoalesce(r, () => (E.Popup)),Sidebar:_nullishCoalesce(n, () => (E.Sidebar)),FilterPanel:_nullishCoalesce(s, () => (E.FilterPanel)),Search:_nullishCoalesce(o, () => (E.Search)),Empty:_nullishCoalesce(d, () => (E.Empty)),Loading:_nullishCoalesce(p, () => (E.Loading)),ResultHeader:_nullishCoalesce(l, () => (E.ResultHeader)),Toolbar:_nullishCoalesce(a, () => (E.Toolbar))};return _jsxruntime.jsx.call(void 0, qe.Provider,{value:b,children:g})}function P(){return _react.useContext.call(void 0, qe)}var re=_react.createContext.call(void 0, null);function y(){let t=_react.useContext.call(void 0, re);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}function F(){let t=y(),e=_react.useCallback.call(void 0, r=>t.subscribe(r),[t]),i=_react.useCallback.call(void 0, ()=>t.state,[t]);return _react.useSyncExternalStore.call(void 0, e,i,i)}function ne(){let t=y(),e=F(),i=_react.useCallback.call(void 0, n=>t.applyFilters(n),[t]),r=_react.useCallback.call(void 0, (n,s)=>t.applyFilters({[n]:s}),[t]);return{filters:e.filters,set:i,setField:r}}function ge({className:t,groupClassName:e,hideLabels:i,draft:r,onDraftChange:n}={}){let s=y(),{FilterPanel:o}=P(),{filters:d}=ne(),p=r!==void 0&&n!==void 0,l=p?r:d;return _jsxruntime.jsx.call(void 0, o,{children:_jsxruntime.jsx.call(void 0, "div",{className:_nullishCoalesce(t, () => ("space-y-5")),children:s.filters.list().map(a=>{if(typeof a.render=="string")return _jsxruntime.jsx.call(void 0, "div",{"data-filter":a.key,className:e},a.key);let g=a.render;return _jsxruntime.jsxs.call(void 0, "div",{className:e,children:[a.label&&!i&&_jsxruntime.jsx.call(void 0, "div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:a.label}),_jsxruntime.jsx.call(void 0, g,{value:a.fromParams(l),onChange:b=>p?n(a.toParams(b)):void s.applyFilters(a.toParams(b))})]},a.key)})})})}function K(){return F().results}function Mt(t,e){if(t&&typeof t=="object"&&"id"in t){let i=t.id;if(typeof i=="string"||typeof i=="number")return i}return e}function Ge({className:t}={}){let e=y(),{items:i}=K(),{pagination:r,selection:n}=F(),{Card:s,Empty:o,Loading:d}=P();return r.loading&&i.length===0?_jsxruntime.jsx.call(void 0, d,{}):i.length===0?_jsxruntime.jsx.call(void 0, o,{}):_jsxruntime.jsx.call(void 0, "div",{role:"list",className:t,children:i.map((p,l)=>{let a=Mt(p,l);return _jsxruntime.jsx.call(void 0, s,{item:p,selected:n===a,onSelect:()=>e.selectPoint(e.primaryDatasetId,a)},a)})})}var _reactdom = require('react-dom');var Ot={west:-179.9,south:-85,east:179.9,north:85},Ze=.1,Xe=.02;function _t(t){if(t.length===0)return null;let e=t[0].lng,i=t[0].lng,r=t[0].lat,n=t[0].lat;for(let{lat:d,lng:p}of t)p<e&&(e=p),p>i&&(i=p),d<r&&(r=d),d>n&&(n=d);let s=n>r?(n-r)*Ze:Xe,o=i>e?(i-e)*Ze:Xe;return{west:e-o,east:i+o,south:r-s,north:n+s}}function Ye(t){let{center:e,zoom:i,fallback:r,mapControls:n}=t,s=y(),o=F(),d=_react.useRef.call(void 0, null),p=_react.useRef.call(void 0, null),l=_react.useRef.call(void 0, null),[a,g]=_react.useState.call(void 0, !1),b=_react.useRef.call(void 0, !1),x=_react.useRef.call(void 0, !1),S=_react.useRef.call(void 0, !1),c=s.map;_react.useEffect.call(void 0, ()=>{let T=l.current;if(!c||!T)return;let h=[];for(let u of Object.keys(o.points)){if(o.layers[u]===!1)continue;let f=s.datasets.get(u),I=_nullishCoalesce(o.points[u], () => ([])),$={id:u,markers:I.map(R=>({id:R.id,position:R.position,iconUrl:_optionalChain([f, 'optionalAccess', _17 => _17.marker, 'access', _18 => _18.iconUrl, 'optionalCall', _19 => _19(R.entity)]),element:_optionalChain([f, 'optionalAccess', _20 => _20.marker, 'access', _21 => _21.element, 'optionalCall', _22 => _22(R.entity)])})),clustering:_optionalChain([f, 'optionalAccess', _23 => _23.clustering]),onMarkerClick:R=>s.selectPoint(u,R)};h.push(c.renderLayer(T,$))}return()=>{h.forEach(u=>u())}},[s,c,a,o.points,o.layers]),_react.useEffect.call(void 0, ()=>{if(!d.current||!c)return;let T=d.current,h=!1,u=null;return(async()=>{let f=await c.mount(T,{center:e,zoom:i,fullscreenTarget:_nullishCoalesce(p.current, () => (void 0))});if(h){c.destroy(f);return}l.current=f,s.setMapHandle(f),u=c.onBoundsChange(f,I=>{S.current?S.current=!1:x.current=!0,s.loadPoints(I)}),g(!0),s.loadPoints(Ot)})(),()=>{h=!0,_optionalChain([u, 'optionalCall', _24 => _24()]),l.current&&(c.destroy(l.current),l.current=null,s.setMapHandle(null)),g(!1)}},[s,c]),_react.useEffect.call(void 0, ()=>{let T=l.current;if(!c||!T||e||b.current||x.current)return;let h=[];for(let f of Object.keys(o.points))if(o.layers[f]!==!1)for(let I of _nullishCoalesce(o.points[f], () => ([])))h.push(I.position);let u=_t(h);u&&(b.current=!0,S.current=!0,c.fitBounds(T,u))},[c,e,a,o.points,o.layers]),_react.useEffect.call(void 0, ()=>{_optionalChain([c, 'optionalAccess', _25 => _25.updateMarkerStates, 'call', _26 => _26(o.selection,o.hovered)])},[c,a,o.selection,o.hovered]);let{Popup:L}=P(),N=L!==me,C=_nullishCoalesce(o.points[s.primaryDatasetId], () => ([])),z=o.selection!=null?C.find(T=>T.id===o.selection):void 0,[w,D]=_react.useState.call(void 0, null),X=_react.useRef.call(void 0, z);return X.current=z,_react.useEffect.call(void 0, ()=>{let T=l.current;if(!c||!T||!N)return;let h=X.current;if(!h)return;let u=c.mountOverlay(h.position);D({entity:h.entity,position:h.position,container:u.container});let f=()=>s.selectPoint(s.primaryDatasetId,null),I=R=>{R.key==="Escape"&&f()};document.addEventListener("keydown",I);let $=c.onMapClick(f);return()=>{document.removeEventListener("keydown",I),$(),u.unmount(),D(null)}},[s,c,a,o.selection,N]),_jsxruntime.jsxs.call(void 0, "div",{ref:p,className:"relative h-full min-h-0 w-full",children:[_jsxruntime.jsxs.call(void 0, "div",{ref:d,className:!c&&r?"flex h-full min-h-0 w-full items-center justify-center":"h-full min-h-0 w-full",children:[!c&&r,N&&w?_reactdom.createPortal.call(void 0, _jsxruntime.jsx.call(void 0, L,{entity:w.entity,onClose:()=>s.selectPoint(s.primaryDatasetId,null)}),w.container):null]}),n!=null&&_jsxruntime.jsx.call(void 0, "div",{className:"pointer-events-none absolute inset-0",children:_jsxruntime.jsx.call(void 0, "div",{className:"pointer-events-auto",children:n})})]})}var ye="gap";function Bt(t,e){if(t<=7)return Array.from({length:t},(s,o)=>o+1);let i=Math.max(2,e-1),r=Math.min(t-1,e+1),n=[1];i>2&&n.push(ye);for(let s=i;s<=r;s+=1)n.push(s);return r<t-1&&n.push(ye),n.push(t),n}function et(){let t=y(),{results:e,pagination:i}=F();if(i.mode==="infinite")return e.nextCursor==null?null:_jsxruntime.jsx.call(void 0, "button",{type:"button",disabled:i.loading,onClick:()=>{t.loadPage()},children:"Load more"});let r=t.options.pageSize,{pageIndex:n}=i,s=n+1,o=e.total!=null?Math.ceil(e.total/r):null,d=o!=null?s<o:e.nextCursor!=null||e.items.length>=r;if(o!=null?o<=1:n===0&&!d)return null;let p=l=>()=>{t.goToPage(l)};return _jsxruntime.jsxs.call(void 0, "nav",{className:"rle-pagination","aria-label":"Pagination",children:[_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Previous page",disabled:i.loading||n===0,onClick:p(n-1),children:"\u2039"}),o!=null&&Bt(o,s).map((l,a)=>l===ye?_jsxruntime.jsx.call(void 0, "span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${a}`):_jsxruntime.jsx.call(void 0, "button",{type:"button",className:l===s?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${l}`,"aria-current":l===s?"page":void 0,disabled:i.loading,onClick:p(l-1),children:l},l)),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Next page",disabled:i.loading||!d,onClick:p(n+1),children:"\u203A"})]})}function tt(){let{items:t,total:e}=K(),{ResultHeader:i}=P();return _jsxruntime.jsx.call(void 0, i,{count:t.length,total:e})}function it(t,e){let i=y(),r=_react.useRef.call(void 0, e);r.current=e,_react.useEffect.call(void 0, ()=>i.on(t,n=>r.current(n)),[i,t])}function nt(t){let{children:e,...i}=t,[r]=_react.useState.call(void 0, ()=>i),[n,s]=_react.useState.call(void 0, null);return _react.useEffect.call(void 0, ()=>{let o=new ie({datasets:r.datasets,filters:r.filters,config:r.config,map:r.map,initialFilters:r.initialFilters,primaryDatasetId:r.primaryDatasetId});return r.urlSync&&r.urlSync.start(o),s(o),()=>{r.urlSync&&r.urlSync.stop(),o.dispose(),s(d=>d===o?null:d)}},[r]),n?_jsxruntime.jsx.call(void 0, re.Provider,{value:n,children:e}):null}function V(t){return typeof t!="number"?t:new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0}).format(t)}function qt(t){return t?"rle-card rle-card--selected":"rle-card"}function he({item:t,selected:e,onSelect:i}){let r=_nullishCoalesce(t, () => ({})),n=qt(e),s=_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[r.imageUrl?_jsxruntime.jsx.call(void 0, "img",{src:r.imageUrl,alt:_nullishCoalesce(r.title, () => ("")),className:"rle-card-media"}):_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{className:"rle-card-body",children:[r.title&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-title",children:r.title}),r.subtitle&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-address",children:r.subtitle}),r.badge&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-info",children:_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-info-item",children:r.badge})}),r.price!=null&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-price",children:V(r.price)})]})]});return i?_jsxruntime.jsx.call(void 0, "button",{type:"button",onClick:i,"aria-pressed":_nullishCoalesce(e, () => (!1)),className:n,children:s}):_jsxruntime.jsx.call(void 0, "article",{className:n,children:s})}function ve(t){return _jsxruntime.jsxs.call(void 0, "div",{role:"status",className:"rle-empty",children:[_jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",className:"rle-empty-icon","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "circle",{cx:"11",cy:"11",r:"7"}),_jsxruntime.jsx.call(void 0, "path",{d:"m21 21-4.3-4.3"})]}),_jsxruntime.jsx.call(void 0, "p",{className:"rle-empty-title",children:"No results"}),_jsxruntime.jsx.call(void 0, "p",{className:"rle-empty-hint",children:"Try adjusting your filters or search terms."})]})}function be({children:t}){return _jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-panel",children:t})}function Le(t){return _jsxruntime.jsx.call(void 0, "div",{className:"rle-loading",role:"status","aria-busy":"true","aria-label":"Loading results",children:Array.from({length:3}).map((e,i)=>_jsxruntime.jsxs.call(void 0, "div",{className:"rle-loading-item",children:[_jsxruntime.jsx.call(void 0, "div",{className:"rle-skeleton",style:{aspectRatio:"4 / 3",width:"100%"}}),_jsxruntime.jsx.call(void 0, "div",{className:"rle-skeleton",style:{height:16,width:"65%"}}),_jsxruntime.jsx.call(void 0, "div",{className:"rle-skeleton",style:{height:12,width:"35%"}})]},i))})}function Te({point:t}){let e=_nullishCoalesce(t.entity, () => ({}));return _jsxruntime.jsx.call(void 0, "span",{className:"rle-pin",children:e.price!=null?V(e.price):""})}function Fe({entity:t,onClose:e}){let i=_nullishCoalesce(t, () => ({}));return _jsxruntime.jsxs.call(void 0, "div",{className:"rle-popup",role:"group","aria-label":"Location details",children:[_jsxruntime.jsx.call(void 0, "button",{type:"button",onClick:e,"aria-label":"Close",className:"rle-popup-close",children:_jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "path",{d:"M18 6 6 18"}),_jsxruntime.jsx.call(void 0, "path",{d:"m6 6 12 12"})]})}),_jsxruntime.jsxs.call(void 0, "div",{children:[i.title&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-title",children:i.title}),i.subtitle&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-address",children:i.subtitle}),i.price!=null&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-price",children:V(i.price)})]})]})}function ke({count:t,total:e}){let i=e!=null&&e!==t?`${t} of ${e} results`:`${t} results`;return _jsxruntime.jsx.call(void 0, "div",{className:"rle-result-header",children:i})}function Se({value:t,onChange:e,placeholder:i}){return _jsxruntime.jsx.call(void 0, "input",{type:"search",value:t,placeholder:i,onChange:r=>e(r.target.value),"aria-label":_nullishCoalesce(i, () => ("Search")),className:"rle-input"})}function Ce({children:t}){return _jsxruntime.jsx.call(void 0, "aside",{className:"rle-sidebar",children:t})}function we({children:t}){return _jsxruntime.jsx.call(void 0, "div",{className:"rle-toolbar",children:t})}var at={Card:he,Marker:Te,Popup:Fe,Sidebar:Ce,FilterPanel:be,Search:Se,Empty:ve,Loading:Le,ResultHeader:ke,Toolbar:we};function lt({view:t,onViewChange:e}){return _jsxruntime.jsx.call(void 0, "nav",{className:"rle-bottom-nav","aria-label":"Listing navigation",children:_jsxruntime.jsxs.call(void 0, "div",{className:"rle-viewtoggle",role:"group","aria-label":"View",children:[_jsxruntime.jsxs.call(void 0, "button",{type:"button",className:`rle-viewtoggle__btn${t==="list"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="list",onClick:()=>e("list"),children:[_jsxruntime.jsx.call(void 0, Yt,{}),"List"]}),_jsxruntime.jsxs.call(void 0, "button",{type:"button",className:`rle-viewtoggle__btn${t==="map"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="map",onClick:()=>e("map"),children:[_jsxruntime.jsx.call(void 0, ei,{}),"Map"]})]})})}function Yt(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "line",{x1:"8",y1:"6",x2:"20",y2:"6"}),_jsxruntime.jsx.call(void 0, "line",{x1:"8",y1:"12",x2:"20",y2:"12"}),_jsxruntime.jsx.call(void 0, "line",{x1:"8",y1:"18",x2:"20",y2:"18"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"6",x2:"4.01",y2:"6"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"12",x2:"4.01",y2:"12"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"18",x2:"4.01",y2:"18"})]})}function ei(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "polygon",{points:"1 6 8 3 16 6 23 3 23 18 16 21 8 18 1 21 1 6"}),_jsxruntime.jsx.call(void 0, "line",{x1:"8",y1:"3",x2:"8",y2:"18"}),_jsxruntime.jsx.call(void 0, "line",{x1:"16",y1:"6",x2:"16",y2:"21"})]})}function pt({open:t,onOpenChange:e,title:i,children:r,footer:n}){let s=_react.useRef.call(void 0, null),[o,d]=_react.useState.call(void 0, !1),[p,l]=_react.useState.call(void 0, !1);return _react.useEffect.call(void 0, ()=>{if(!t){l(!1),d(!1);return}d(!0);let a=requestAnimationFrame(()=>l(!0));return()=>cancelAnimationFrame(a)},[t]),_react.useEffect.call(void 0, ()=>{if(!o)return;let a=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=a}},[o]),_react.useEffect.call(void 0, ()=>{if(!o)return;_optionalChain([s, 'access', _27 => _27.current, 'optionalAccess', _28 => _28.focus, 'call', _29 => _29()]);function a(g){g.key==="Escape"&&e(!1)}return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[o,e]),!o||typeof document>"u"?null:_reactdom.createPortal.call(void 0, _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, "div",{className:`rle-sheet-backdrop${p?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{ref:s,className:`rle-sheet${p?" rle-sheet--open":""}`,role:"dialog","aria-modal":"true","aria-label":i,tabIndex:-1,children:[_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__handle","aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{className:"rle-sheet__header",children:[i&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__title",children:i}),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:_jsxruntime.jsx.call(void 0, ri,{})})]}),_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__body",children:r}),n&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__footer",children:n})]})]}),document.body)}function ri(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "path",{d:"M18 6 6 18"}),_jsxruntime.jsx.call(void 0, "path",{d:"m6 6 12 12"})]})}function ct({search:t,onFiltersClick:e,filterCount:i=0,action:r}){let{Search:n}=P();return _jsxruntime.jsxs.call(void 0, "header",{className:"rle-mobile-header",children:[t&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-mobile-header__search",children:_jsxruntime.jsx.call(void 0, n,{value:t.value,onChange:t.onChange,placeholder:t.placeholder})}),_jsxruntime.jsxs.call(void 0, "button",{type:"button",className:"rle-btn rle-mobile-header__btn",onClick:e,children:[_jsxruntime.jsx.call(void 0, si,{}),_jsxruntime.jsx.call(void 0, "span",{children:"Filters"}),i>0&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-mobile-header__count",children:i})]}),r&&_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-btn rle-mobile-header__btn rle-mobile-header__btn--icon",onClick:r.onClick,"aria-label":r.label,children:_nullishCoalesce(r.icon, () => (_jsxruntime.jsx.call(void 0, oi,{})))})]})}function si(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"6",x2:"20",y2:"6"}),_jsxruntime.jsx.call(void 0, "circle",{cx:"9",cy:"6",r:"2",fill:"currentColor",stroke:"none"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"12",x2:"20",y2:"12"}),_jsxruntime.jsx.call(void 0, "circle",{cx:"15",cy:"12",r:"2",fill:"currentColor",stroke:"none"}),_jsxruntime.jsx.call(void 0, "line",{x1:"4",y1:"18",x2:"20",y2:"18"}),_jsxruntime.jsx.call(void 0, "circle",{cx:"11",cy:"18",r:"2",fill:"currentColor",stroke:"none"})]})}function oi(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "line",{x1:"12",y1:"5",x2:"12",y2:"19"}),_jsxruntime.jsx.call(void 0, "line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}var ai=_jsxruntime.jsx.call(void 0, "div",{className:"rle-empty",children:"Map unavailable"});function li(){let t=_react.useRef.call(void 0, null),[e,i]=_react.useState.call(void 0, !0),[r,n]=_react.useState.call(void 0, !0);return _react.useEffect.call(void 0, ()=>{let s=t.current;if(!s)return;let o=()=>{let{clientWidth:g,scrollLeft:b,scrollWidth:x}=s;i(b<=0),n(b+g>=x-1)},d=0,p=()=>{d||(d=requestAnimationFrame(()=>{d=0,o()}))};o(),s.addEventListener("scroll",o,{passive:!0});let l,a;return typeof ResizeObserver<"u"&&(l=new ResizeObserver(o),l.observe(s)),typeof MutationObserver<"u"&&(a=new MutationObserver(p),a.observe(s,{characterData:!0,childList:!0,subtree:!0})),()=>{s.removeEventListener("scroll",o),_optionalChain([l, 'optionalAccess', _30 => _30.disconnect, 'call', _31 => _31()]),_optionalChain([a, 'optionalAccess', _32 => _32.disconnect, 'call', _33 => _33()]),d&&cancelAnimationFrame(d)}},[]),{atEnd:r,atStart:e,ref:t}}function di(t,e){if(t===e)return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;let i=t,r=e,n=new Set([...Object.keys(i),...Object.keys(r)]);for(let s of n)if(i[s]!==r[s])return!1;return!0}function ut({search:t,filterBarStart:e,toolbarEnd:i,mobileAction:r,autoFetch:n=!0,hasMap:s,mapCenter:o,mapZoom:d,mapControls:p,mobileSheetFooter:l,className:a}){let g=y(),{Search:b}=P(),x=K(),{filters:S,set:c}=ne(),{pagination:L}=F(),N=_nullishCoalesce(s, () => (g.map!=null)),[C,z]=_react.useState.call(void 0, "list"),[w,D]=_react.useState.call(void 0, !1),{atEnd:X,atStart:T,ref:h}=li(),u=_react.useRef.call(void 0, null);_react.useEffect.call(void 0, ()=>{L.mode==="paged"&&u.current&&(u.current.scrollTop=0)},[L.mode,L.pageIndex]);let[f,I]=_react.useState.call(void 0, S),[$,R]=_react.useState.call(void 0, w);w!==$&&(R(w),w&&I(S));let Ne=ue=>I(ft=>({...ft,...ue})),[Re,Me]=_react.useState.call(void 0, !1),ce=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{if(Re){if(L.loading){ce.current=!0;return}ce.current&&(ce.current=!1,Me(!1),D(!1))}},[Re,L.loading]);let W=t?{value:String(_nullishCoalesce(S[t.filterKey], () => (""))),onChange:ue=>{c({[t.filterKey]:ue||void 0})},placeholder:t.placeholder}:void 0;_react.useEffect.call(void 0, ()=>{n!==!1&&g.applyFilters({})},[g,n]);let De=()=>{Ne(g.filters.clearedParams())},Oe=()=>{if(di(f,S)){D(!1);return}Me(!0),g.applyFilters(f)},gt=g.filters.activeKeys(S).length,_e=_nullishCoalesce(x.total, () => (x.items.length));return _jsxruntime.jsxs.call(void 0, "div",{className:a?`rle-app ${a}`:"rle-app",children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-filter-bar",children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-filter-bar__scroll",ref:h,children:[W&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__search",children:_jsxruntime.jsx.call(void 0, b,{value:W.value,onChange:W.onChange,placeholder:W.placeholder})}),e&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__slot",children:e}),_jsxruntime.jsx.call(void 0, ge,{className:"rle-filters-row",groupClassName:"rle-filter-group",hideLabels:!0})]}),!T&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!X&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),_jsxruntime.jsx.call(void 0, ct,{search:W,onFiltersClick:()=>D(!0),filterCount:gt,action:r}),_jsxruntime.jsxs.call(void 0, "div",{className:`rle-body ${N?"rle-split":"rle-body--list-only"}`,"data-mobile-view":C,children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-list",ref:u,children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-list-header",children:[_jsxruntime.jsx.call(void 0, tt,{}),i&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-list-header__toolbar",children:i})]}),_jsxruntime.jsx.call(void 0, Ge,{className:"rle-list-grid"}),_jsxruntime.jsx.call(void 0, et,{})]}),N&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-map",children:_jsxruntime.jsx.call(void 0, Ye,{center:o,zoom:d,fallback:ai,mapControls:p})})]}),N&&_jsxruntime.jsx.call(void 0, lt,{view:C,onViewChange:z}),_jsxruntime.jsx.call(void 0, pt,{title:"Filters",open:w,onOpenChange:D,footer:l?l({draft:f,apply:Oe,clear:De,resultCount:_e,loading:L.loading}):_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:De,children:"Clear all"}),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:L.loading,onClick:Oe,children:L.loading?_jsxruntime.jsx.call(void 0, "span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${_e} results`})]}),children:_jsxruntime.jsx.call(void 0, ge,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:f,onDraftChange:Ne})})]})}function mt(t){return"provider"in t}function gi(t){let e=t!=null&&!mt(t),i=e?t.apiKey:void 0,r=e?t.mapId:void 0,n=e?t.mapOptions:void 0,s=e?t.styles:void 0,o=e?t.overlayMarkers:void 0,[d,p]=_react.useState.call(void 0, ()=>!t||mt(t)?{ready:!0,provider:_optionalChain([t, 'optionalAccess', _34 => _34.provider])}:{ready:!1});return _react.useEffect.call(void 0, ()=>{if(!i)return;let l=!1;return Promise.resolve().then(() => _interopRequireWildcard(require("./maps/google/index.cjs"))).then(({googleProvider:a})=>{l||p({ready:!0,provider:a({apiKey:i,mapId:r,mapOptions:n,styles:s,overlayMarkers:o})})}),()=>{l=!0}},[i,r]),d}function fi({onFiltersChange:t}){let e=_react.useRef.call(void 0, t);return e.current=t,it("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function _n(t){let{datasets:e,filters:i,map:r,components:n,initialFilters:s,onFiltersChange:o,mobileAction:d,search:p,filterBarStart:l,toolbarEnd:a,mapControls:g,mobileSheetFooter:b,config:x,autoFetch:S,className:c}=t,{ready:L,provider:N}=gi(r);if(!L)return null;let C=[];for(let D of e)C.push(Ue(D));i&&C.push(Ke(i)),N&&C.push(ze(N)),s&&C.push(Ve(s)),x&&C.push(Ae(x));let z=He(...C),w={...at,...n};return _jsxruntime.jsxs.call(void 0, nt,{...z,children:[o&&_jsxruntime.jsx.call(void 0, fi,{onFiltersChange:o}),_jsxruntime.jsx.call(void 0, $e,{...w,children:_jsxruntime.jsx.call(void 0, ut,{className:c,search:p,filterBarStart:l,toolbarEnd:a,mobileAction:d,autoFetch:S,mapCenter:_optionalChain([r, 'optionalAccess', _35 => _35.center]),mapZoom:_optionalChain([r, 'optionalAccess', _36 => _36.zoom]),mapControls:g,mobileSheetFooter:b})})]})}exports.a = J; exports.b = U; exports.c = Y; exports.d = ee; exports.e = Be; exports.f = te; exports.g = ie; exports.h = He; exports.i = Ae; exports.j = ze; exports.k = Ue; exports.l = Ke; exports.m = Ni; exports.n = Ve; exports.o = Ri; exports.p = me; exports.q = $e; exports.r = P; exports.s = re; exports.t = y; exports.u = F; exports.v = ne; exports.w = ge; exports.x = K; exports.y = Ge; exports.z = Ye; exports.A = et; exports.B = tt; exports.C = it; exports.D = nt; exports.E = he; exports.F = ve; exports.G = be; exports.H = Le; exports.I = Te; exports.J = Fe; exports.K = ke; exports.L = Se; exports.M = Ce; exports.N = we; exports.O = at; exports.P = lt; exports.Q = pt; exports.R = ut; exports.S = _n;