react-listing-engine 0.7.22 → 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 _chunkRWFXVTAKcjs = require('./chunk-RWFXVTAK.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}=_chunkRWFXVTAKcjs.r.call(void 0, );return _jsxruntime.jsx.call(void 0, t,{children:e})}var _react = require('react');function ut(){let e=_chunkRWFXVTAKcjs.t.call(void 0, ),t=_chunkRWFXVTAKcjs.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=_chunkRWFXVTAKcjs.t.call(void 0, ),r=_chunkRWFXVTAKcjs.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 = _chunkRWFXVTAKcjs.c; exports.FallbackPopup = _chunkRWFXVTAKcjs.p; exports.FilterRegistry = _chunkRWFXVTAKcjs.b; exports.ListingApp = _chunkRWFXVTAKcjs.S; exports.ListingComponentsProvider = _chunkRWFXVTAKcjs.q; exports.ListingConfig = _chunkRWFXVTAKcjs.f; exports.ListingEngine = _chunkRWFXVTAKcjs.g; exports.ListingEngineContext = _chunkRWFXVTAKcjs.s; exports.ListingEventType = v; exports.ListingFilters = _chunkRWFXVTAKcjs.w; exports.ListingList = _chunkRWFXVTAKcjs.y; exports.ListingMap = _chunkRWFXVTAKcjs.z; exports.ListingPagination = _chunkRWFXVTAKcjs.A; exports.ListingProvider = _chunkRWFXVTAKcjs.D; exports.ListingResultHeader = _chunkRWFXVTAKcjs.B; exports.ListingStore = _chunkRWFXVTAKcjs.a; exports.ListingToolbar = st; exports.MemoryHistoryPort = h; exports.PaginationMode = b; exports.TypedEmitter = _chunkRWFXVTAKcjs.d; exports.UrlSyncController = f; exports.composeListingProviders = _chunkRWFXVTAKcjs.h; exports.listingDefaultConfig = _chunkRWFXVTAKcjs.e; exports.useListing = _chunkRWFXVTAKcjs.t; exports.useListingComponents = _chunkRWFXVTAKcjs.r; exports.useListingEvent = _chunkRWFXVTAKcjs.C; exports.useListingFilters = _chunkRWFXVTAKcjs.v; exports.useListingLayer = ht; exports.useListingMap = ut; exports.useListingResults = _chunkRWFXVTAKcjs.x; exports.useListingState = _chunkRWFXVTAKcjs.u; exports.withConfig = _chunkRWFXVTAKcjs.i; exports.withDataset = _chunkRWFXVTAKcjs.k; exports.withFilters = _chunkRWFXVTAKcjs.l; exports.withInitialFilters = _chunkRWFXVTAKcjs.n; exports.withMap = _chunkRWFXVTAKcjs.j; exports.withPrimaryDataset = _chunkRWFXVTAKcjs.o; exports.withUrlSync = _chunkRWFXVTAKcjs.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-BXALReXg.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-BXALReXg.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-Dg0WRi29.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-Dg0WRi29.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-CBCVK54B.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};
@@ -216,6 +216,8 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
216
216
  mapZoom?: number;
217
217
  /** Forwarded verbatim to `<ListingMap mapControls={mapControls} />` -- see that prop's doc comment. */
218
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;
219
221
  /**
220
222
  * Render-prop override for the mobile filters sheet's footer -- when
221
223
  * given, replaces the default "Clear all" + "Show N results" buttons
@@ -296,7 +298,7 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
296
298
  * default -- pass `autoFetch={false}`
297
299
  * to opt out and drive the first fetch yourself.
298
300
  */
299
- 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;
300
302
 
301
303
  /**
302
304
  * Two-shape `map` prop: pass a ready `MapProvider`, or the `{ apiKey, mapId? }`
@@ -382,6 +384,16 @@ interface ListingAppProps<TFilters> {
382
384
  * drops the map region entirely in that case).
383
385
  */
384
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;
385
397
  /** Forwarded verbatim to `StyledListingLayout`'s `mobileSheetFooter` -- see that prop's doc comment. */
386
398
  mobileSheetFooter?: (ctx: MobileSheetFooterContext<TFilters>) => ReactNode;
387
399
  config?: Partial<IListingConfigOptions>;
@@ -216,6 +216,8 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
216
216
  mapZoom?: number;
217
217
  /** Forwarded verbatim to `<ListingMap mapControls={mapControls} />` -- see that prop's doc comment. */
218
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;
219
221
  /**
220
222
  * Render-prop override for the mobile filters sheet's footer -- when
221
223
  * given, replaces the default "Clear all" + "Show N results" buttons
@@ -296,7 +298,7 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
296
298
  * default -- pass `autoFetch={false}`
297
299
  * to opt out and drive the first fetch yourself.
298
300
  */
299
- 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;
300
302
 
301
303
  /**
302
304
  * Two-shape `map` prop: pass a ready `MapProvider`, or the `{ apiKey, mapId? }`
@@ -382,6 +384,16 @@ interface ListingAppProps<TFilters> {
382
384
  * drops the map region entirely in that case).
383
385
  */
384
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;
385
397
  /** Forwarded verbatim to `StyledListingLayout`'s `mobileSheetFooter` -- see that prop's doc comment. */
386
398
  mobileSheetFooter?: (ctx: MobileSheetFooterContext<TFilters>) => ReactNode;
387
399
  config?: Partial<IListingConfigOptions>;
@@ -1,2 +1,2 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
- var _chunkRWFXVTAKcjs = require('../chunk-RWFXVTAK.cjs');var _jsxruntime = require('react/jsx-runtime');function L({children:o}){return _jsxruntime.jsx.call(void 0, _chunkRWFXVTAKcjs.q,{..._chunkRWFXVTAKcjs.P,children:o})}exports.BottomNav = _chunkRWFXVTAKcjs.E; exports.BottomSheet = _chunkRWFXVTAKcjs.Q; exports.ListingApp = _chunkRWFXVTAKcjs.S; exports.StyledCard = _chunkRWFXVTAKcjs.F; exports.StyledComponentsProviderWithDefaults = L; exports.StyledEmpty = _chunkRWFXVTAKcjs.G; exports.StyledFilterPanel = _chunkRWFXVTAKcjs.H; exports.StyledListingLayout = _chunkRWFXVTAKcjs.R; exports.StyledLoading = _chunkRWFXVTAKcjs.I; exports.StyledMarker = _chunkRWFXVTAKcjs.J; exports.StyledPopup = _chunkRWFXVTAKcjs.K; exports.StyledResultHeader = _chunkRWFXVTAKcjs.L; exports.StyledSearch = _chunkRWFXVTAKcjs.M; exports.StyledSidebar = _chunkRWFXVTAKcjs.N; exports.StyledToolbar = _chunkRWFXVTAKcjs.O; exports.styledDefaultComponents = _chunkRWFXVTAKcjs.P;
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 { 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-BXALReXg.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-BXALReXg.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 { 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-Dg0WRi29.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-Dg0WRi29.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 S,P as t,Q as f,R as P,S as u,q as e}from"../chunk-CBCVK54B.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};
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.22",
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 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(),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 _e={pagination:"paged",pageSize:20,debounceMs:250};var te=class{options;constructor(e){this.options=Object.freeze({..._e,...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 V,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 V,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)},Ri=t=>e=>{e.urlSync=t},Ve=t=>e=>{e.initialFilters=t},Di=t=>e=>{e.primaryDatasetId=t};import{createContext as ht,useContext as bt}from"react";import{jsx as C,jsxs as We}from"react/jsx-runtime";function Lt(t){return String(t?.title??"")}var Tt=({item:t})=>C("div",{children:Lt(t)}),Pt=()=>C("div",{}),me=()=>C("div",{}),Ft=({children:t})=>C("div",{children:t}),kt=({children:t})=>C("div",{children:t}),Ct=({value:t,onChange:e,placeholder:i})=>C("input",{type:"search",value:t,placeholder:i,onChange:r=>e(r.target.value),"aria-label":i??"Search"}),St=()=>C("div",{role:"status",children:"No results"}),wt=()=>C("div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),It=({count:t})=>We("div",{children:[t," results"]}),Et=({children:t})=>C("div",{children:t}),xt=({view:t,onViewChange:e})=>We("nav",{"aria-label":"Listing navigation",children:[C("button",{type:"button","aria-pressed":t==="list",onClick:()=>e("list"),children:"List"}),C("button",{type:"button","aria-pressed":t==="map",onClick:()=>e("map"),children:"Map"})]}),k={BottomNav:xt,Card:Tt,Marker:Pt,Popup:me,Sidebar:Ft,FilterPanel:kt,Search:Ct,Empty:St,Loading:wt,ResultHeader:It,Toolbar:Et},qe=ht(k);function $e(t){let{BottomNav:e,Card:i,Marker:r,Popup:n,Sidebar:s,FilterPanel:o,Search:d,Empty:p,Loading:l,ResultHeader:a,Toolbar:m,children:L}=t,E={BottomNav:e??k.BottomNav,Card:i??k.Card,Marker:r??k.Marker,Popup:n??k.Popup,Sidebar:s??k.Sidebar,FilterPanel:o??k.FilterPanel,Search:d??k.Search,Empty:p??k.Empty,Loading:l??k.Loading,ResultHeader:a??k.ResultHeader,Toolbar:m??k.Toolbar};return C(qe.Provider,{value:E,children:L})}function S(){return bt(qe)}import{createContext as Nt}from"react";var re=Nt(null);import{useContext as Mt}from"react";function y(){let t=Mt(re);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}import{useCallback as je,useSyncExternalStore as Rt}from"react";function w(){let t=y(),e=je(r=>t.subscribe(r),[t]),i=je(()=>t.state,[t]);return Rt(e,i,i)}import{useCallback as Ge}from"react";function ne(){let t=y(),e=w(),i=Ge(n=>t.applyFilters(n),[t]),r=Ge((n,s)=>t.applyFilters({[n]:s}),[t]);return{filters:e.filters,set:i,setField:r}}import{jsx as G,jsxs as Dt}from"react/jsx-runtime";function ge({className:t,groupClassName:e,hideLabels:i,draft:r,onDraftChange:n}={}){let s=y(),{FilterPanel:o}=S(),{filters:d}=ne(),p=r!==void 0&&n!==void 0,l=p?r:d;return G(o,{children:G("div",{className:t??"space-y-5",children:s.filters.list().map(a=>{if(typeof a.render=="string")return G("div",{"data-filter":a.key,className:e},a.key);let m=a.render;return Dt("div",{className:e,children:[a.label&&!i&&G("div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:a.label}),G(m,{value:a.fromParams(l),onChange:L=>p?n(a.toParams(L)):void s.applyFilters(a.toParams(L))})]},a.key)})})})}function q(){return w().results}import{jsx as se}from"react/jsx-runtime";function Bt(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 Qe({className:t}={}){let e=y(),{items:i}=q(),{pagination:r,selection:n}=w(),{Card:s,Empty:o,Loading:d}=S();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=Bt(p,l);return se(s,{item:p,selected:n===a,onSelect:()=>e.selectPoint(e.primaryDatasetId,a)},a)})})}import{useEffect as Q,useRef as H,useState as Ze}from"react";import{createPortal as Ot}from"react-dom";import{jsx as fe,jsxs as Ye}from"react/jsx-runtime";var _t={west:-179.9,south:-85,east:179.9,north:85},Xe=.1,Je=.02;function Ht(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)*Xe:Je,o=i>e?(i-e)*Xe:Je;return{west:e-o,east:i+o,south:r-s,north:n+s}}function et(t){let{center:e,zoom:i,fallback:r,mapControls:n}=t,s=y(),o=w(),d=H(null),p=H(null),l=H(null),[a,m]=Ze(!1),L=H(!1),E=H(!1),D=H(!1),c=s.map;Q(()=>{let T=l.current;if(!c||!T)return;let h=[];for(let g of Object.keys(o.points)){if(o.layers[g]===!1)continue;let f=s.datasets.get(g),P=o.points[g]??[],K={id:g,markers:P.map(N=>({id:N.id,position:N.position,iconUrl:f?.marker.iconUrl?.(N.entity),element:f?.marker.element?.(N.entity)})),clustering:f?.clustering,onMarkerClick:N=>s.selectPoint(g,N)};h.push(c.renderLayer(T,K))}return()=>{h.forEach(g=>g())}},[s,c,a,o.points,o.layers]),Q(()=>{if(!d.current||!c)return;let T=d.current,h=!1,g=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),g=c.onBoundsChange(f,P=>{D.current?D.current=!1:E.current=!0,s.loadPoints(P)}),m(!0),s.loadPoints(_t)})(),()=>{h=!0,g?.(),l.current&&(c.destroy(l.current),l.current=null,s.setMapHandle(null)),m(!1)}},[s,c]),Q(()=>{let T=l.current;if(!c||!T||e||L.current||E.current)return;let h=[];for(let f of Object.keys(o.points))if(o.layers[f]!==!1)for(let P of o.points[f]??[])h.push(P.position);let g=Ht(h);g&&(L.current=!0,D.current=!0,c.fitBounds(T,g))},[c,e,a,o.points,o.layers]),Q(()=>{c?.updateMarkerStates(o.selection,o.hovered)},[c,a,o.selection,o.hovered]);let{Popup:U}=S(),v=U!==me,F=o.points[s.primaryDatasetId]??[],B=o.selection!=null?F.find(T=>T.id===o.selection):void 0,[O,x]=Ze(null),_=H(B);return _.current=B,Q(()=>{let T=l.current;if(!c||!T||!v)return;let h=_.current;if(!h)return;let g=c.mountOverlay(h.position);x({entity:h.entity,position:h.position,container:g.container});let f=()=>s.selectPoint(s.primaryDatasetId,null),P=N=>{N.key==="Escape"&&f()};document.addEventListener("keydown",P);let K=c.onMapClick(f);return()=>{document.removeEventListener("keydown",P),K(),g.unmount(),x(null)}},[s,c,a,o.selection,v]),Ye("div",{ref:p,className:"relative h-full min-h-0 w-full",children:[Ye("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,v&&O?Ot(fe(U,{entity:O.entity,onClose:()=>s.selectPoint(s.primaryDatasetId,null)}),O.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 Z,jsxs as zt}from"react/jsx-runtime";var ye="gap";function At(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 tt(){let t=y(),{results:e,pagination:i}=w();if(i.mode==="infinite")return e.nextCursor==null?null:Z("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 zt("nav",{className:"rle-pagination","aria-label":"Pagination",children:[Z("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&&At(o,s).map((l,a)=>l===ye?Z("span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${a}`):Z("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)),Z("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 Ut}from"react/jsx-runtime";function it(){let{items:t,total:e}=q(),{ResultHeader:i}=S();return Ut(i,{count:t.length,total:e})}import{useEffect as Kt,useRef as Vt}from"react";function rt(t,e){let i=y(),r=Vt(e);r.current=e,Kt(()=>i.on(t,n=>r.current(n)),[i,t])}import{useEffect as qt,useState as nt}from"react";import{jsx as $t}from"react/jsx-runtime";function st(t){let{children:e,...i}=t,[r]=nt(()=>i),[n,s]=nt(null);return qt(()=>{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?$t(re.Provider,{value:n,children:e}):null}import{jsx as I,jsxs as X}from"react/jsx-runtime";function ot({view:t,onViewChange:e}){return I("nav",{className:"rle-bottom-nav","aria-label":"Listing navigation",children:X("div",{className:"rle-viewtoggle",role:"group","aria-label":"View",children:[X("button",{type:"button",className:`rle-viewtoggle__btn${t==="list"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="list",onClick:()=>e("list"),children:[I(Wt,{}),"List"]}),X("button",{type:"button",className:`rle-viewtoggle__btn${t==="map"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="map",onClick:()=>e("map"),children:[I(jt,{}),"Map"]})]})})}function Wt(){return X("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:[I("line",{x1:"8",y1:"6",x2:"20",y2:"6"}),I("line",{x1:"8",y1:"12",x2:"20",y2:"12"}),I("line",{x1:"8",y1:"18",x2:"20",y2:"18"}),I("line",{x1:"4",y1:"6",x2:"4.01",y2:"6"}),I("line",{x1:"4",y1:"12",x2:"4.01",y2:"12"}),I("line",{x1:"4",y1:"18",x2:"4.01",y2:"18"})]})}function jt(){return X("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:[I("polygon",{points:"1 6 8 3 16 6 23 3 23 18 16 21 8 18 1 21 1 6"}),I("line",{x1:"8",y1:"3",x2:"8",y2:"18"}),I("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 Qt,jsx as M,jsxs as at}from"react/jsx-runtime";function Gt(t){return t?"rle-card rle-card--selected":"rle-card"}function ve({item:t,selected:e,onSelect:i}){let r=t??{},n=Gt(e),s=at(Qt,{children:[r.imageUrl?M("img",{src:r.imageUrl,alt:r.title??"",className:"rle-card-media"}):M("div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),at("div",{className:"rle-card-body",children:[r.title&&M("span",{className:"rle-card-title",children:r.title}),r.subtitle&&M("span",{className:"rle-card-address",children:r.subtitle}),r.badge&&M("div",{className:"rle-card-info",children:M("span",{className:"rle-card-info-item",children:r.badge})}),r.price!=null&&M("span",{className:"rle-card-price",children:$(r.price)})]})]});return i?M("button",{type:"button",onClick:i,"aria-pressed":e??!1,className:n,children:s}):M("article",{className:n,children:s})}import{jsx as oe,jsxs as lt}from"react/jsx-runtime";function he(t){return lt("div",{role:"status",className:"rle-empty",children:[lt("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 Zt}from"react/jsx-runtime";function be({children:t}){return Zt("div",{className:"rle-filter-panel",children:t})}import{jsx as ae,jsxs as Xt}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)=>Xt("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 Jt}from"react/jsx-runtime";function Te({point:t}){let e=t.entity??{};return Jt("span",{className:"rle-pin",children:e.price!=null?$(e.price):""})}import{jsx as W,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:[W("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:[W("path",{d:"M18 6 6 18"}),W("path",{d:"m6 6 12 12"})]})}),Pe("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 Yt}from"react/jsx-runtime";function ke({count:t,total:e}){let i=e!=null&&e!==t?`${t} of ${e} results`:`${t} results`;return Yt("div",{className:"rle-result-header",children:i})}import{jsx as ei}from"react/jsx-runtime";function Ce({value:t,onChange:e,placeholder:i}){return ei("input",{type:"search",value:t,placeholder:i,onChange:r=>e(r.target.value),"aria-label":i??"Search",className:"rle-input"})}import{jsx as ti}from"react/jsx-runtime";function Se({children:t}){return ti("aside",{className:"rle-sidebar",children:t})}import{jsx as ii}from"react/jsx-runtime";function we({children:t}){return ii("div",{className:"rle-toolbar",children:t})}var dt={BottomNav:ot,Card:ve,Marker:Te,Popup:Fe,Sidebar:Se,FilterPanel:be,Search:Ce,Empty:he,Loading:Le,ResultHeader:ke,Toolbar:we};import{useEffect as Ie,useRef as ri,useState as pt}from"react";import{createPortal as ni}from"react-dom";import{Fragment as oi,jsx as R,jsxs as le}from"react/jsx-runtime";function ct({open:t,onOpenChange:e,title:i,children:r,footer:n}){let s=ri(null),[o,d]=pt(!1),[p,l]=pt(!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(m){m.key==="Escape"&&e(!1)}return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[o,e]),!o||typeof document>"u"?null:ni(le(oi,{children:[R("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:[R("div",{className:"rle-sheet__handle","aria-hidden":"true"}),le("div",{className:"rle-sheet__header",children:[i&&R("div",{className:"rle-sheet__title",children:i}),R("button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:R(si,{})})]}),R("div",{className:"rle-sheet__body",children:r}),n&&R("div",{className:"rle-sheet__footer",children:n})]})]}),document.body)}function si(){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:[R("path",{d:"M18 6 6 18"}),R("path",{d:"m6 6 12 12"})]})}import{useEffect as pe,useRef as Ee,useState as z}from"react";import{jsx as b,jsxs as de}from"react/jsx-runtime";function ut({search:t,onFiltersClick:e,filterCount:i=0,action:r}){let{Search:n}=S();return de("header",{className:"rle-mobile-header",children:[t&&b("div",{className:"rle-mobile-header__search",children:b(n,{value:t.value,onChange:t.onChange,placeholder:t.placeholder})}),de("button",{type:"button",className:"rle-btn rle-mobile-header__btn",onClick:e,children:[b(ai,{}),b("span",{children:"Filters"}),i>0&&b("span",{className:"rle-mobile-header__count",children:i})]}),r&&b("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??b(li,{})})]})}function ai(){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:[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 li(){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:[b("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),b("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}import{Fragment as ui,jsx as u,jsxs as A}from"react/jsx-runtime";var di=u("div",{className:"rle-empty",children:"Map unavailable"});function pi(){let t=Ee(null),[e,i]=z(!0),[r,n]=z(!0);return pe(()=>{let s=t.current;if(!s)return;let o=()=>{let{clientWidth:m,scrollLeft:L,scrollWidth:E}=s;i(L<=0),n(L+m>=E-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 ci(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 mt({search:t,filterBarStart:e,toolbarEnd:i,mobileAction:r,autoFetch:n=!0,hasMap:s,mapCenter:o,mapZoom:d,mapControls:p,mobileSheetFooter:l,className:a}){let m=y(),{BottomNav:L,Search:E}=S(),D=q(),{filters:c,set:U}=ne(),{pagination:v}=w(),F=s??m.map!=null,[B,O]=z("list"),[x,_]=z(!1),{atEnd:T,atStart:h,ref:g}=pi(),f=Ee(null);pe(()=>{v.mode==="paged"&&f.current&&(f.current.scrollTop=0)},[v.mode,v.pageIndex]);let[P,K]=z(c),[N,ft]=z(x);x!==N&&(ft(x),x&&K(c));let Ne=ue=>K(vt=>({...vt,...ue})),[Me,Re]=z(!1),ce=Ee(!1);pe(()=>{if(Me){if(v.loading){ce.current=!0;return}ce.current&&(ce.current=!1,Re(!1),_(!1))}},[Me,v.loading]);let j=t?{value:String(c[t.filterKey]??""),onChange:ue=>{U({[t.filterKey]:ue||void 0})},placeholder:t.placeholder}:void 0;pe(()=>{n!==!1&&m.applyFilters({})},[m,n]);let De=()=>{Ne(m.filters.clearedParams())},Be=()=>{if(ci(P,c)){_(!1);return}Re(!0),m.applyFilters(P)},yt=m.filters.activeKeys(c).length,Oe=D.total??D.items.length;return A("div",{className:a?`rle-app ${a}`:"rle-app",children:[A("div",{className:"rle-filter-bar",children:[A("div",{className:"rle-filter-bar__scroll",ref:g,children:[j&&u("div",{className:"rle-filter-bar__search",children:u(E,{value:j.value,onChange:j.onChange,placeholder:j.placeholder})}),e&&u("div",{className:"rle-filter-bar__slot",children:e}),u(ge,{className:"rle-filters-row",groupClassName:"rle-filter-group",hideLabels:!0})]}),!h&&u("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!T&&u("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),u(ut,{search:j,onFiltersClick:()=>_(!0),filterCount:yt,action:r}),A("div",{className:`rle-body ${F?"rle-split":"rle-body--list-only"}`,"data-mobile-view":B,children:[A("div",{className:"rle-list",ref:f,children:[A("div",{className:"rle-list-header",children:[u(it,{}),i&&u("div",{className:"rle-list-header__toolbar",children:i})]}),u(Qe,{className:"rle-list-grid"}),u(tt,{})]}),F&&u("div",{className:"rle-map",children:u(et,{center:o,zoom:d,fallback:di,mapControls:p})})]}),F&&u(L,{view:B,onViewChange:O}),u(ct,{title:"Filters",open:x,onOpenChange:_,footer:l?l({draft:P,apply:Be,clear:De,resultCount:Oe,loading:v.loading}):A(ui,{children:[u("button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:De,children:"Clear all"}),u("button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:v.loading,onClick:Be,children:v.loading?u("span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${Oe} results`})]}),children:u(ge,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:P,onDraftChange:Ne})})]})}import{useEffect as mi,useRef as gi,useState as fi}from"react";import{jsx as xe,jsxs as hi}from"react/jsx-runtime";function gt(t){return"provider"in t}function yi(t){let e=t!=null&&!gt(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]=fi(()=>!t||gt(t)?{ready:!0,provider:t?.provider}:{ready:!1});return mi(()=>{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 vi({onFiltersChange:t}){let e=gi(t);return e.current=t,rt("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function Hn(t){let{datasets:e,filters:i,map:r,components:n,initialFilters:s,onFiltersChange:o,mobileAction:d,search:p,filterBarStart:l,toolbarEnd:a,mapControls:m,mobileSheetFooter:L,config:E,autoFetch:D,className:c}=t,{ready:U,provider:v}=yi(r);if(!U)return null;let F=[];for(let x of e)F.push(Ue(x));i&&F.push(Ke(i)),v&&F.push(ze(v)),s&&F.push(Ve(s)),E&&F.push(Ae(E));let B=He(...F),O={...dt,...n};return hi(st,{...B,children:[o&&xe(vi,{onFiltersChange:o}),xe($e,{...O,children:xe(mt,{className:c,search:p,filterBarStart:l,toolbarEnd:a,mobileAction:d,autoFetch:D,mapCenter:r?.center,mapZoom:r?.zoom,mapControls:m,mobileSheetFooter:L})})]})}export{J as a,V as b,Y as c,ee as d,_e as e,te as f,ie as g,He as h,Ae as i,ze as j,Ue as k,Ke as l,Ri as m,Ve as n,Di as o,me as p,$e as q,S as r,re as s,y as t,w as u,ne as v,ge as w,q as x,Qe as y,et as z,tt as A,it as B,rt as C,st as D,ot as E,ve as F,he as G,be as H,Le as I,Te as J,Fe as K,ke as L,Ce as M,Se as N,we as O,dt as P,ct as Q,mt as R,Hn 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 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(),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 _e={pagination:"paged",pageSize:20,debounceMs:250};var te=class{constructor(e){this.options=Object.freeze({..._e,...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 V)),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 V,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)},Ri= exports.m =t=>e=>{e.urlSync=t},Ve= exports.n =t=>e=>{e.initialFilters=t},Di= exports.o =t=>e=>{e.primaryDatasetId=t};var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function Lt(t){return String(_nullishCoalesce(_optionalChain([t, 'optionalAccess', _16 => _16.title]), () => ("")))}var Tt=({item:t})=>_jsxruntime.jsx.call(void 0, "div",{children:Lt(t)}),Pt=()=>_jsxruntime.jsx.call(void 0, "div",{}),me= exports.p =()=>_jsxruntime.jsx.call(void 0, "div",{}),Ft=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),kt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Ct=({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"))}),St=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status",children:"No results"}),wt=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),It=({count:t})=>_jsxruntime.jsxs.call(void 0, "div",{children:[t," results"]}),Et=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),xt=({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"})]}),k={BottomNav:xt,Card:Tt,Marker:Pt,Popup:me,Sidebar:Ft,FilterPanel:kt,Search:Ct,Empty:St,Loading:wt,ResultHeader:It,Toolbar:Et},qe=_react.createContext.call(void 0, k);function $e(t){let{BottomNav:e,Card:i,Marker:r,Popup:n,Sidebar:s,FilterPanel:o,Search:d,Empty:p,Loading:l,ResultHeader:a,Toolbar:m,children:L}=t,E={BottomNav:_nullishCoalesce(e, () => (k.BottomNav)),Card:_nullishCoalesce(i, () => (k.Card)),Marker:_nullishCoalesce(r, () => (k.Marker)),Popup:_nullishCoalesce(n, () => (k.Popup)),Sidebar:_nullishCoalesce(s, () => (k.Sidebar)),FilterPanel:_nullishCoalesce(o, () => (k.FilterPanel)),Search:_nullishCoalesce(d, () => (k.Search)),Empty:_nullishCoalesce(p, () => (k.Empty)),Loading:_nullishCoalesce(l, () => (k.Loading)),ResultHeader:_nullishCoalesce(a, () => (k.ResultHeader)),Toolbar:_nullishCoalesce(m, () => (k.Toolbar))};return _jsxruntime.jsx.call(void 0, qe.Provider,{value:E,children:L})}function S(){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 w(){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=w(),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}=S(),{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 m=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, m,{value:a.fromParams(l),onChange:L=>p?n(a.toParams(L)):void s.applyFilters(a.toParams(L))})]},a.key)})})})}function q(){return w().results}function Bt(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 Qe({className:t}={}){let e=y(),{items:i}=q(),{pagination:r,selection:n}=w(),{Card:s,Empty:o,Loading:d}=S();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=Bt(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 _t={west:-179.9,south:-85,east:179.9,north:85},Xe=.1,Je=.02;function Ht(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)*Xe:Je,o=i>e?(i-e)*Xe:Je;return{west:e-o,east:i+o,south:r-s,north:n+s}}function et(t){let{center:e,zoom:i,fallback:r,mapControls:n}=t,s=y(),o=w(),d=_react.useRef.call(void 0, null),p=_react.useRef.call(void 0, null),l=_react.useRef.call(void 0, null),[a,m]=_react.useState.call(void 0, !1),L=_react.useRef.call(void 0, !1),E=_react.useRef.call(void 0, !1),D=_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 g of Object.keys(o.points)){if(o.layers[g]===!1)continue;let f=s.datasets.get(g),P=_nullishCoalesce(o.points[g], () => ([])),K={id:g,markers:P.map(N=>({id:N.id,position:N.position,iconUrl:_optionalChain([f, 'optionalAccess', _17 => _17.marker, 'access', _18 => _18.iconUrl, 'optionalCall', _19 => _19(N.entity)]),element:_optionalChain([f, 'optionalAccess', _20 => _20.marker, 'access', _21 => _21.element, 'optionalCall', _22 => _22(N.entity)])})),clustering:_optionalChain([f, 'optionalAccess', _23 => _23.clustering]),onMarkerClick:N=>s.selectPoint(g,N)};h.push(c.renderLayer(T,K))}return()=>{h.forEach(g=>g())}},[s,c,a,o.points,o.layers]),_react.useEffect.call(void 0, ()=>{if(!d.current||!c)return;let T=d.current,h=!1,g=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),g=c.onBoundsChange(f,P=>{D.current?D.current=!1:E.current=!0,s.loadPoints(P)}),m(!0),s.loadPoints(_t)})(),()=>{h=!0,_optionalChain([g, 'optionalCall', _24 => _24()]),l.current&&(c.destroy(l.current),l.current=null,s.setMapHandle(null)),m(!1)}},[s,c]),_react.useEffect.call(void 0, ()=>{let T=l.current;if(!c||!T||e||L.current||E.current)return;let h=[];for(let f of Object.keys(o.points))if(o.layers[f]!==!1)for(let P of _nullishCoalesce(o.points[f], () => ([])))h.push(P.position);let g=Ht(h);g&&(L.current=!0,D.current=!0,c.fitBounds(T,g))},[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:U}=S(),v=U!==me,F=_nullishCoalesce(o.points[s.primaryDatasetId], () => ([])),B=o.selection!=null?F.find(T=>T.id===o.selection):void 0,[O,x]=_react.useState.call(void 0, null),_=_react.useRef.call(void 0, B);return _.current=B,_react.useEffect.call(void 0, ()=>{let T=l.current;if(!c||!T||!v)return;let h=_.current;if(!h)return;let g=c.mountOverlay(h.position);x({entity:h.entity,position:h.position,container:g.container});let f=()=>s.selectPoint(s.primaryDatasetId,null),P=N=>{N.key==="Escape"&&f()};document.addEventListener("keydown",P);let K=c.onMapClick(f);return()=>{document.removeEventListener("keydown",P),K(),g.unmount(),x(null)}},[s,c,a,o.selection,v]),_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,v&&O?_reactdom.createPortal.call(void 0, _jsxruntime.jsx.call(void 0, U,{entity:O.entity,onClose:()=>s.selectPoint(s.primaryDatasetId,null)}),O.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 At(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 tt(){let t=y(),{results:e,pagination:i}=w();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&&At(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 it(){let{items:t,total:e}=q(),{ResultHeader:i}=S();return _jsxruntime.jsx.call(void 0, i,{count:t.length,total:e})}function rt(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 st(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 ot({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, Wt,{}),"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, jt,{}),"Map"]})]})})}function Wt(){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 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, "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 Gt(t){return t?"rle-card rle-card--selected":"rle-card"}function ve({item:t,selected:e,onSelect:i}){let r=_nullishCoalesce(t, () => ({})),n=Gt(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:$(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 he(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?$(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:$(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 Ce({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 Se({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 dt={BottomNav:ot,Card:ve,Marker:Te,Popup:Fe,Sidebar:Se,FilterPanel:be,Search:Ce,Empty:he,Loading:Le,ResultHeader:ke,Toolbar:we};function ct({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(m){m.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, si,{})})]}),_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 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",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 ut({search:t,onFiltersClick:e,filterCount:i=0,action:r}){let{Search:n}=S();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, ai,{}),_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, li,{})))})]})}function ai(){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 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:"12",y1:"5",x2:"12",y2:"19"}),_jsxruntime.jsx.call(void 0, "line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}var di=_jsxruntime.jsx.call(void 0, "div",{className:"rle-empty",children:"Map unavailable"});function pi(){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:m,scrollLeft:L,scrollWidth:E}=s;i(L<=0),n(L+m>=E-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 ci(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 mt({search:t,filterBarStart:e,toolbarEnd:i,mobileAction:r,autoFetch:n=!0,hasMap:s,mapCenter:o,mapZoom:d,mapControls:p,mobileSheetFooter:l,className:a}){let m=y(),{BottomNav:L,Search:E}=S(),D=q(),{filters:c,set:U}=ne(),{pagination:v}=w(),F=_nullishCoalesce(s, () => (m.map!=null)),[B,O]=_react.useState.call(void 0, "list"),[x,_]=_react.useState.call(void 0, !1),{atEnd:T,atStart:h,ref:g}=pi(),f=_react.useRef.call(void 0, null);_react.useEffect.call(void 0, ()=>{v.mode==="paged"&&f.current&&(f.current.scrollTop=0)},[v.mode,v.pageIndex]);let[P,K]=_react.useState.call(void 0, c),[N,ft]=_react.useState.call(void 0, x);x!==N&&(ft(x),x&&K(c));let Ne=ue=>K(vt=>({...vt,...ue})),[Me,Re]=_react.useState.call(void 0, !1),ce=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{if(Me){if(v.loading){ce.current=!0;return}ce.current&&(ce.current=!1,Re(!1),_(!1))}},[Me,v.loading]);let j=t?{value:String(_nullishCoalesce(c[t.filterKey], () => (""))),onChange:ue=>{U({[t.filterKey]:ue||void 0})},placeholder:t.placeholder}:void 0;_react.useEffect.call(void 0, ()=>{n!==!1&&m.applyFilters({})},[m,n]);let De=()=>{Ne(m.filters.clearedParams())},Be=()=>{if(ci(P,c)){_(!1);return}Re(!0),m.applyFilters(P)},yt=m.filters.activeKeys(c).length,Oe=_nullishCoalesce(D.total, () => (D.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:g,children:[j&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__search",children:_jsxruntime.jsx.call(void 0, E,{value:j.value,onChange:j.onChange,placeholder:j.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})]}),!h&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!T&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),_jsxruntime.jsx.call(void 0, ut,{search:j,onFiltersClick:()=>_(!0),filterCount:yt,action:r}),_jsxruntime.jsxs.call(void 0, "div",{className:`rle-body ${F?"rle-split":"rle-body--list-only"}`,"data-mobile-view":B,children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-list",ref:f,children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-list-header",children:[_jsxruntime.jsx.call(void 0, it,{}),i&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-list-header__toolbar",children:i})]}),_jsxruntime.jsx.call(void 0, Qe,{className:"rle-list-grid"}),_jsxruntime.jsx.call(void 0, tt,{})]}),F&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-map",children:_jsxruntime.jsx.call(void 0, et,{center:o,zoom:d,fallback:di,mapControls:p})})]}),F&&_jsxruntime.jsx.call(void 0, L,{view:B,onViewChange:O}),_jsxruntime.jsx.call(void 0, ct,{title:"Filters",open:x,onOpenChange:_,footer:l?l({draft:P,apply:Be,clear:De,resultCount:Oe,loading:v.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:v.loading,onClick:Be,children:v.loading?_jsxruntime.jsx.call(void 0, "span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${Oe} results`})]}),children:_jsxruntime.jsx.call(void 0, ge,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:P,onDraftChange:Ne})})]})}function gt(t){return"provider"in t}function yi(t){let e=t!=null&&!gt(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||gt(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 vi({onFiltersChange:t}){let e=_react.useRef.call(void 0, t);return e.current=t,rt("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function Hn(t){let{datasets:e,filters:i,map:r,components:n,initialFilters:s,onFiltersChange:o,mobileAction:d,search:p,filterBarStart:l,toolbarEnd:a,mapControls:m,mobileSheetFooter:L,config:E,autoFetch:D,className:c}=t,{ready:U,provider:v}=yi(r);if(!U)return null;let F=[];for(let x of e)F.push(Ue(x));i&&F.push(Ke(i)),v&&F.push(ze(v)),s&&F.push(Ve(s)),E&&F.push(Ae(E));let B=He(...F),O={...dt,...n};return _jsxruntime.jsxs.call(void 0, st,{...B,children:[o&&_jsxruntime.jsx.call(void 0, vi,{onFiltersChange:o}),_jsxruntime.jsx.call(void 0, $e,{...O,children:_jsxruntime.jsx.call(void 0, mt,{className:c,search:p,filterBarStart:l,toolbarEnd:a,mobileAction:d,autoFetch:D,mapCenter:_optionalChain([r, 'optionalAccess', _35 => _35.center]),mapZoom:_optionalChain([r, 'optionalAccess', _36 => _36.zoom]),mapControls:m,mobileSheetFooter:L})})]})}exports.a = J; exports.b = V; exports.c = Y; exports.d = ee; exports.e = _e; exports.f = te; exports.g = ie; exports.h = He; exports.i = Ae; exports.j = ze; exports.k = Ue; exports.l = Ke; exports.m = Ri; exports.n = Ve; exports.o = Di; exports.p = me; exports.q = $e; exports.r = S; exports.s = re; exports.t = y; exports.u = w; exports.v = ne; exports.w = ge; exports.x = q; exports.y = Qe; exports.z = et; exports.A = tt; exports.B = it; exports.C = rt; exports.D = st; exports.E = ot; exports.F = ve; exports.G = he; exports.H = be; exports.I = Le; exports.J = Te; exports.K = Fe; exports.L = ke; exports.M = Ce; exports.N = Se; exports.O = we; exports.P = dt; exports.Q = ct; exports.R = mt; exports.S = Hn;