react-listing-engine 0.7.22 → 0.9.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,17 @@
1
1
  # react-listing-engine
2
2
 
3
+ ## 0.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add an `initialPage` prop to `ListingApp` (0-based): when set, the mount autoFetch loads that page directly via `engine.goToPage(initialPage)` (an offset request) instead of page 1, so a deep-linked/refreshed `?page=N` restores in a single fetch rather than page-1-then-jump. Only honored with `autoFetch` on; unset/`0` loads page 1 as before. Needs an offset-capable adapter.
8
+
9
+ ## 0.8.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 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.
14
+
3
15
  ## 0.7.10
4
16
 
5
17
  ### 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 $=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(s=>this.defs.has(s));n.forEach((s,o)=>{this.defs.get(s).order=o});let r=new Set(n);return i.filter(s=>!r.has(s.key)).forEach((s,o)=>{s.order=n.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(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 $,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 s=this.datasets.get(r);if(!s)return;let o=await s.adapter.getPoints(i,e);n===this.pointsToken&&this.store.setPoints(r,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 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 $,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)},Bi=t=>e=>{e.urlSync=t},$e=t=>e=>{e.initialFilters=t},Oi=t=>e=>{e.primaryDatasetId=t};import{createContext as Lt,useContext as Pt}from"react";import{jsx as S,jsxs as Ge}from"react/jsx-runtime";function Tt(t){return String(t?.title??"")}var Ft=({item:t})=>S("div",{children:Tt(t)}),kt=()=>S("div",{}),fe=()=>S("div",{}),Ct=({children:t})=>S("div",{children:t}),St=({children:t})=>S("div",{children:t}),wt=({value:t,onChange:e,placeholder:i})=>S("input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":i??"Search"}),It=()=>S("div",{role:"status",children:"No results"}),Et=()=>S("div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),xt=({count:t})=>Ge("div",{children:[t," results"]}),Nt=({children:t})=>S("div",{children:t}),Rt=({view:t,onViewChange:e})=>Ge("nav",{"aria-label":"Listing navigation",children:[S("button",{type:"button","aria-pressed":t==="list",onClick:()=>e("list"),children:"List"}),S("button",{type:"button","aria-pressed":t==="map",onClick:()=>e("map"),children:"Map"})]}),C={BottomNav:Rt,Card:Ft,Marker:kt,Popup:fe,Sidebar:Ct,FilterPanel:St,Search:wt,Empty:It,Loading:Et,ResultHeader:xt,Toolbar:Nt},We=Lt(C);function je(t){let{BottomNav:e,Card:i,Marker:n,Popup:r,Sidebar:s,FilterPanel:o,Search:a,Empty:p,Loading:d,ResultHeader:l,Toolbar:c,children:y}=t,v={BottomNav:e??C.BottomNav,Card:i??C.Card,Marker:n??C.Marker,Popup:r??C.Popup,Sidebar:s??C.Sidebar,FilterPanel:o??C.FilterPanel,Search:a??C.Search,Empty:p??C.Empty,Loading:d??C.Loading,ResultHeader:l??C.ResultHeader,Toolbar:c??C.Toolbar};return S(We.Provider,{value:v,children:y})}function w(){return Pt(We)}import{createContext as Mt}from"react";var se=Mt(null);import{useContext as Dt}from"react";function h(){let t=Dt(se);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}import{useCallback as Qe,useSyncExternalStore as Bt}from"react";function I(){let t=h(),e=Qe(n=>t.subscribe(n),[t]),i=Qe(()=>t.state,[t]);return Bt(e,i,i)}import{useCallback as Ze}from"react";function oe(){let t=h(),e=I(),i=Ze(r=>t.applyFilters(r),[t]),n=Ze((r,s)=>t.applyFilters({[r]:s}),[t]);return{filters:e.filters,set:i,setField:n}}import{jsx as Z,jsxs as Ot}from"react/jsx-runtime";function ye({className:t,groupClassName:e,hideLabels:i,draft:n,onDraftChange:r}={}){let s=h(),{FilterPanel:o}=w(),{filters:a}=oe(),p=n!==void 0&&r!==void 0,d=p?n:a;return Z(o,{children:Z("div",{className:t??"space-y-5",children:s.filters.list().map(l=>{if(typeof l.render=="string")return Z("div",{"data-filter":l.key,className:e},l.key);let c=l.render;return Ot("div",{className:e,children:[l.label&&!i&&Z("div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:l.label}),Z(c,{value:l.fromParams(d),onChange:y=>p?r(l.toParams(y)):void s.applyFilters(l.toParams(y))})]},l.key)})})})}function W(){return I().results}import{jsx as ae}from"react/jsx-runtime";function _t(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=h(),{items:i}=W(),{pagination:n,selection:r}=I(),{Card:s,Empty:o,Loading:a}=w();return n.loading&&i.length===0?ae(a,{}):i.length===0?ae(o,{}):ae("div",{role:"list",className:t,children:i.map((p,d)=>{let l=_t(p,d);return ae(s,{item:p,selected:r===l,onSelect:()=>e.selectPoint(e.primaryDatasetId,l)},l)})})}import{useEffect as X,useRef as B,useState as Je}from"react";import{createPortal as Ht}from"react-dom";import{jsx as ve,jsxs as tt}from"react/jsx-runtime";var At={west:-179.9,south:-85,east:179.9,north:85},Ye=.1,et=.02;function zt(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 s=r>n?(r-n)*Ye:et,o=i>e?(i-e)*Ye:et;return{west:e-o,east:i+o,south:n-s,north:r+s}}function it(t){let{center:e,zoom:i,fallback:n,mapControls:r,onMapReady:s}=t,o=h(),a=I(),p=B(s);p.current=s;let d=B(null),l=B(null),c=B(null),[y,v]=Je(!1),O=B(!1),K=B(!1),D=B(!1),u=o.map;X(()=>{let T=c.current;if(!u||!T)return;let L=[];for(let f of Object.keys(a.points)){if(a.layers[f]===!1)continue;let g=o.datasets.get(f),F=a.points[f]??[],q={id:f,markers:F.map(N=>({id:N.id,position:N.position,iconUrl:g?.marker.iconUrl?.(N.entity),element:g?.marker.element?.(N.entity)})),clustering:g?.clustering,onMarkerClick:N=>o.selectPoint(f,N)};L.push(u.renderLayer(T,q))}return()=>{L.forEach(f=>f())}},[o,u,y,a.points,a.layers]),X(()=>{if(!d.current||!u)return;let T=d.current,L=!1,f=null;return(async()=>{let g=await u.mount(T,{center:e,zoom:i,fullscreenTarget:l.current??void 0});if(L){u.destroy(g);return}c.current=g,o.setMapHandle(g),f=u.onBoundsChange(g,F=>{D.current?D.current=!1:K.current=!0,o.loadPoints(F)}),v(!0),p.current?.(g.raw),o.loadPoints(At)})(),()=>{L=!0,f?.(),c.current&&(u.destroy(c.current),c.current=null,o.setMapHandle(null),p.current?.(null)),v(!1)}},[o,u]),X(()=>{let T=c.current;if(!u||!T||e||O.current||K.current)return;let L=[];for(let g of Object.keys(a.points))if(a.layers[g]!==!1)for(let F of a.points[g]??[])L.push(F.position);let f=zt(L);f&&(O.current=!0,D.current=!0,u.fitBounds(T,f))},[u,e,y,a.points,a.layers]),X(()=>{u?.updateMarkerStates(a.selection,a.hovered)},[u,y,a.selection,a.hovered]);let{Popup:V}=w(),b=V!==fe,k=a.points[o.primaryDatasetId]??[],_=a.selection!=null?k.find(T=>T.id===a.selection):void 0,[H,x]=Je(null),A=B(_);return A.current=_,X(()=>{let T=c.current;if(!u||!T||!b)return;let L=A.current;if(!L)return;let f=u.mountOverlay(L.position);x({entity:L.entity,position:L.position,container:f.container});let g=()=>o.selectPoint(o.primaryDatasetId,null),F=N=>{N.key==="Escape"&&g()};document.addEventListener("keydown",F);let q=u.onMapClick(g);return()=>{document.removeEventListener("keydown",F),q(),f.unmount(),x(null)}},[o,u,y,a.selection,b]),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,b&&H?Ht(ve(V,{entity:H.entity,onClose:()=>o.selectPoint(o.primaryDatasetId,null)}),H.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 J,jsxs as Kt}from"react/jsx-runtime";var he="gap";function Ut(t,e){if(t<=7)return Array.from({length:t},(s,o)=>o+1);let i=Math.max(2,e-1),n=Math.min(t-1,e+1),r=[1];i>2&&r.push(he);for(let s=i;s<=n;s+=1)r.push(s);return n<t-1&&r.push(he),r.push(t),r}function nt(){let t=h(),{results:e,pagination:i}=I();if(i.mode==="infinite")return e.nextCursor==null?null:J("button",{type:"button",disabled:i.loading,onClick:()=>{t.loadPage()},children:"Load more"});let n=t.options.pageSize,{pageIndex:r}=i,s=r+1,o=e.total!=null?Math.ceil(e.total/n):null,a=o!=null?s<o:e.nextCursor!=null||e.items.length>=n;if(o!=null?o<=1:r===0&&!a)return null;let p=d=>()=>{t.goToPage(d)};return Kt("nav",{className:"rle-pagination","aria-label":"Pagination",children:[J("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"}),o!=null&&Ut(o,s).map((d,l)=>d===he?J("span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${l}`):J("button",{type:"button",className:d===s?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${d}`,"aria-current":d===s?"page":void 0,disabled:i.loading,onClick:p(d-1),children:d},d)),J("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 Vt}from"react/jsx-runtime";function rt(){let{items:t,total:e}=W(),{ResultHeader:i}=w();return Vt(i,{count:t.length,total:e})}import{useEffect as qt,useRef as $t}from"react";function st(t,e){let i=h(),n=$t(e);n.current=e,qt(()=>i.on(t,r=>n.current(r)),[i,t])}import{useEffect as Wt,useState as ot}from"react";import{jsx as jt}from"react/jsx-runtime";function at(t){let{children:e,...i}=t,[n]=ot(()=>i),[r,s]=ot(null);return Wt(()=>{let o=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(o),s(o),()=>{n.urlSync&&n.urlSync.stop(),o.dispose(),s(a=>a===o?null:a)}},[n]),r?jt(se.Provider,{value:r,children:e}):null}import{jsx as E,jsxs as Y}from"react/jsx-runtime";function lt({view:t,onViewChange:e}){return E("nav",{className:"rle-bottom-nav","aria-label":"Listing navigation",children:Y("div",{className:"rle-viewtoggle",role:"group","aria-label":"View",children:[Y("button",{type:"button",className:`rle-viewtoggle__btn${t==="list"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="list",onClick:()=>e("list"),children:[E(Gt,{}),"List"]}),Y("button",{type:"button",className:`rle-viewtoggle__btn${t==="map"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="map",onClick:()=>e("map"),children:[E(Qt,{}),"Map"]})]})})}function Gt(){return Y("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:[E("line",{x1:"8",y1:"6",x2:"20",y2:"6"}),E("line",{x1:"8",y1:"12",x2:"20",y2:"12"}),E("line",{x1:"8",y1:"18",x2:"20",y2:"18"}),E("line",{x1:"4",y1:"6",x2:"4.01",y2:"6"}),E("line",{x1:"4",y1:"12",x2:"4.01",y2:"12"}),E("line",{x1:"4",y1:"18",x2:"4.01",y2:"18"})]})}function Qt(){return Y("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:[E("polygon",{points:"1 6 8 3 16 6 23 3 23 18 16 21 8 18 1 21 1 6"}),E("line",{x1:"8",y1:"3",x2:"8",y2:"18"}),E("line",{x1:"16",y1:"6",x2:"16",y2:"21"})]})}function j(t){return typeof t!="number"?t:new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0}).format(t)}import{Fragment as Xt,jsx as R,jsxs as dt}from"react/jsx-runtime";function Zt(t){return t?"rle-card rle-card--selected":"rle-card"}function be({item:t,selected:e,onSelect:i}){let n=t??{},r=Zt(e),s=dt(Xt,{children:[n.imageUrl?R("img",{src:n.imageUrl,alt:n.title??"",className:"rle-card-media"}):R("div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),dt("div",{className:"rle-card-body",children:[n.title&&R("span",{className:"rle-card-title",children:n.title}),n.subtitle&&R("span",{className:"rle-card-address",children:n.subtitle}),n.badge&&R("div",{className:"rle-card-info",children:R("span",{className:"rle-card-info-item",children:n.badge})}),n.price!=null&&R("span",{className:"rle-card-price",children:j(n.price)})]})]});return i?R("button",{type:"button",onClick:i,"aria-pressed":e??!1,className:r,children:s}):R("article",{className:r,children:s})}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 Jt}from"react/jsx-runtime";function Pe({children:t}){return Jt("div",{className:"rle-filter-panel",children:t})}import{jsx as de,jsxs as Yt}from"react/jsx-runtime";function Te(t){return de("div",{className:"rle-loading",role:"status","aria-busy":"true","aria-label":"Loading results",children:Array.from({length:3}).map((e,i)=>Yt("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 ei}from"react/jsx-runtime";function Fe({point:t}){let e=t.entity??{};return ei("span",{className:"rle-pin",children:e.price!=null?j(e.price):""})}import{jsx as G,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:[G("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:[G("path",{d:"M18 6 6 18"}),G("path",{d:"m6 6 12 12"})]})}),ke("div",{children:[i.title&&G("div",{className:"rle-card-title",children:i.title}),i.subtitle&&G("div",{className:"rle-card-address",children:i.subtitle}),i.price!=null&&G("div",{className:"rle-card-price",children:j(i.price)})]})]})}import{jsx as ti}from"react/jsx-runtime";function Se({count:t,total:e}){let i=e!=null&&e!==t?`${t} of ${e} results`:`${t} results`;return ti("div",{className:"rle-result-header",children:i})}import{jsx as ii}from"react/jsx-runtime";function we({value:t,onChange:e,placeholder:i}){return ii("input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":i??"Search",className:"rle-input"})}import{jsx as ni}from"react/jsx-runtime";function Ie({children:t}){return ni("aside",{className:"rle-sidebar",children:t})}import{jsx as ri}from"react/jsx-runtime";function Ee({children:t}){return ri("div",{className:"rle-toolbar",children:t})}var ut={BottomNav:lt,Card:be,Marker:Fe,Popup:Ce,Sidebar:Ie,FilterPanel:Pe,Search:we,Empty:Le,Loading:Te,ResultHeader:Se,Toolbar:Ee};import{useEffect as xe,useRef as si,useState as ct}from"react";import{createPortal as oi}from"react-dom";import{Fragment as li,jsx as M,jsxs as pe}from"react/jsx-runtime";function mt({open:t,onOpenChange:e,title:i,children:n,footer:r}){let s=si(null),[o,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(!o)return;let l=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=l}},[o]),xe(()=>{if(!o)return;s.current?.focus();function l(c){c.key==="Escape"&&e(!1)}return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[o,e]),!o||typeof document>"u"?null:oi(pe(li,{children:[M("div",{className:`rle-sheet-backdrop${p?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),pe("div",{ref:s,className:`rle-sheet${p?" rle-sheet--open":""}`,role:"dialog","aria-modal":"true","aria-label":i,tabIndex:-1,children:[M("div",{className:"rle-sheet__handle","aria-hidden":"true"}),pe("div",{className:"rle-sheet__header",children:[i&&M("div",{className:"rle-sheet__title",children:i}),M("button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:M(ai,{})})]}),M("div",{className:"rle-sheet__body",children:n}),r&&M("div",{className:"rle-sheet__footer",children:r})]})]}),document.body)}function ai(){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:[M("path",{d:"M18 6 6 18"}),M("path",{d:"m6 6 12 12"})]})}import{useEffect as ce,useRef as Ne,useState as U}from"react";import{jsx as P,jsxs as ue}from"react/jsx-runtime";function gt({search:t,onFiltersClick:e,filterCount:i=0,action:n}){let{Search:r}=w();return ue("header",{className:"rle-mobile-header",children:[t&&P("div",{className:"rle-mobile-header__search",children:P(r,{value:t.value,onChange:t.onChange,placeholder:t.placeholder})}),ue("button",{type:"button",className:"rle-btn rle-mobile-header__btn",onClick:e,children:[P(di,{}),P("span",{children:"Filters"}),i>0&&P("span",{className:"rle-mobile-header__count",children:i})]}),n&&P("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??P(pi,{})})]})}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:[P("line",{x1:"4",y1:"6",x2:"20",y2:"6"}),P("circle",{cx:"9",cy:"6",r:"2",fill:"currentColor",stroke:"none"}),P("line",{x1:"4",y1:"12",x2:"20",y2:"12"}),P("circle",{cx:"15",cy:"12",r:"2",fill:"currentColor",stroke:"none"}),P("line",{x1:"4",y1:"18",x2:"20",y2:"18"}),P("circle",{cx:"11",cy:"18",r:"2",fill:"currentColor",stroke:"none"})]})}function pi(){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:[P("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),P("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}import{Fragment as gi,jsx as m,jsxs as z}from"react/jsx-runtime";var ui=m("div",{className:"rle-empty",children:"Map unavailable"});function ci(){let t=Ne(null),[e,i]=U(!0),[n,r]=U(!0);return ce(()=>{let s=t.current;if(!s)return;let o=()=>{let{clientWidth:c,scrollLeft:y,scrollWidth:v}=s;i(y<=0),r(y+c>=v-1)},a=0,p=()=>{a||(a=requestAnimationFrame(()=>{a=0,o()}))};o(),s.addEventListener("scroll",o,{passive:!0});let d,l;return typeof ResizeObserver<"u"&&(d=new ResizeObserver(o),d.observe(s)),typeof MutationObserver<"u"&&(l=new MutationObserver(p),l.observe(s,{characterData:!0,childList:!0,subtree:!0})),()=>{s.removeEventListener("scroll",o),d?.disconnect(),l?.disconnect(),a&&cancelAnimationFrame(a)}},[]),{atEnd:n,atStart:e,ref:t}}function mi(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 s of r)if(i[s]!==n[s])return!1;return!0}function ft({search:t,filterBarStart:e,toolbarEnd:i,mobileAction:n,autoFetch:r=!0,initialPage:s,hasMap:o,mapCenter:a,mapZoom:p,mapControls:d,onMapReady:l,mobileSheetFooter:c,className:y}){let v=h(),{BottomNav:O,Search:K}=w(),D=W(),{filters:u,set:V}=oe(),{pagination:b}=I(),k=o??v.map!=null,[_,H]=U("list"),[x,A]=U(!1),{atEnd:T,atStart:L,ref:f}=ci(),g=Ne(null);ce(()=>{b.mode==="paged"&&g.current&&(g.current.scrollTop=0)},[b.mode,b.pageIndex]);let[F,q]=U(u),[N,vt]=U(x);x!==N&&(vt(x),x&&q(u));let Me=ge=>q(bt=>({...bt,...ge})),[De,Be]=U(!1),me=Ne(!1);ce(()=>{if(De){if(b.loading){me.current=!0;return}me.current&&(me.current=!1,Be(!1),A(!1))}},[De,b.loading]);let Q=t?{value:String(u[t.filterKey]??""),onChange:ge=>{V({[t.filterKey]:ge||void 0})},placeholder:t.placeholder}:void 0;ce(()=>{r!==!1&&(s&&s>0?v.goToPage(s):v.applyFilters({}))},[v,r]);let Oe=()=>{Me(v.filters.clearedParams())},_e=()=>{if(mi(F,u)){A(!1);return}Be(!0),v.applyFilters(F)},ht=v.filters.activeKeys(u).length,He=D.total??D.items.length;return z("div",{className:y?`rle-app ${y}`:"rle-app",children:[z("div",{className:"rle-filter-bar",children:[z("div",{className:"rle-filter-bar__scroll",ref:f,children:[Q&&m("div",{className:"rle-filter-bar__search",children:m(K,{value:Q.value,onChange:Q.onChange,placeholder:Q.placeholder})}),e&&m("div",{className:"rle-filter-bar__slot",children:e}),m(ye,{className:"rle-filters-row",groupClassName:"rle-filter-group",hideLabels:!0})]}),!L&&m("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!T&&m("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),m(gt,{search:Q,onFiltersClick:()=>A(!0),filterCount:ht,action:n}),z("div",{className:`rle-body ${k?"rle-split":"rle-body--list-only"}`,"data-mobile-view":_,children:[z("div",{className:"rle-list",ref:g,children:[z("div",{className:"rle-list-header",children:[m(rt,{}),i&&m("div",{className:"rle-list-header__toolbar",children:i})]}),m(Xe,{className:"rle-list-grid"}),m(nt,{})]}),k&&m("div",{className:"rle-map",children:m(it,{center:a,zoom:p,fallback:ui,mapControls:d,onMapReady:l})})]}),k&&m(O,{view:_,onViewChange:H}),m(mt,{title:"Filters",open:x,onOpenChange:A,footer:c?c({draft:F,apply:_e,clear:Oe,resultCount:He,loading:b.loading}):z(gi,{children:[m("button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:Oe,children:"Clear all"}),m("button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:b.loading,onClick:_e,children:b.loading?m("span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${He} results`})]}),children:m(ye,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:F,onDraftChange:Me})})]})}import{useEffect as fi,useRef as yi,useState as vi}from"react";import{jsx as Re,jsxs as Li}from"react/jsx-runtime";function yt(t){return"provider"in t}function hi(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,s=e?t.styles:void 0,o=e?t.overlayMarkers:void 0,[a,p]=vi(()=>!t||yt(t)?{ready:!0,provider:t?.provider}:{ready:!1});return fi(()=>{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:s,overlayMarkers:o})})}),()=>{d=!0}},[i,n]),a}function bi({onFiltersChange:t}){let e=yi(t);return e.current=t,st("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function zr(t){let{datasets:e,filters:i,map:n,components:r,initialFilters:s,onFiltersChange:o,mobileAction:a,search:p,filterBarStart:d,toolbarEnd:l,mapControls:c,onMapReady:y,mobileSheetFooter:v,config:O,autoFetch:K,initialPage:D,className:u}=t,{ready:V,provider:b}=hi(n);if(!V)return null;let k=[];for(let x of e)k.push(Ve(x));i&&k.push(qe(i)),b&&k.push(Ke(b)),s&&k.push($e(s)),O&&k.push(Ue(O));let _=ze(...k),H={...ut,...r};return Li(at,{..._,children:[o&&Re(bi,{onFiltersChange:o}),Re(je,{...H,children:Re(ft,{className:u,search:p,filterBarStart:d,toolbarEnd:l,mobileAction:a,autoFetch:K,mapCenter:n?.center,mapZoom:n?.zoom,mapControls:c,onMapReady:y,initialPage:D,mobileSheetFooter:v})})]})}export{ee as a,$ 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,Bi as m,$e as n,Oi as o,fe as p,je as q,w as r,se as s,h as t,I as u,oe as v,ye as w,W 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,Pe as H,Te 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,zr 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 $= (_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(s=>this.defs.has(s));n.forEach((s,o)=>{this.defs.get(s).order=o});let r=new Set(n);return i.filter(s=>!r.has(s.key)).forEach((s,o)=>{s.order=n.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(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 $)),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 s=this.datasets.get(r);if(!s)return;let o=await s.adapter.getPoints(i,e);n===this.pointsToken&&this.store.setPoints(r,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 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 $,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)},Bi= exports.m =t=>e=>{e.urlSync=t},$e= exports.n =t=>e=>{e.initialFilters=t},Oi= 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 Ft=({item:t})=>_jsxruntime.jsx.call(void 0, "div",{children:Tt(t)}),kt=()=>_jsxruntime.jsx.call(void 0, "div",{}),fe= exports.p =()=>_jsxruntime.jsx.call(void 0, "div",{}),Ct=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),St=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),wt=({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"))}),It=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status",children:"No results"}),Et=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),xt=({count:t})=>_jsxruntime.jsxs.call(void 0, "div",{children:[t," results"]}),Nt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Rt=({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"})]}),C={BottomNav:Rt,Card:Ft,Marker:kt,Popup:fe,Sidebar:Ct,FilterPanel:St,Search:wt,Empty:It,Loading:Et,ResultHeader:xt,Toolbar:Nt},We=_react.createContext.call(void 0, C);function je(t){let{BottomNav:e,Card:i,Marker:n,Popup:r,Sidebar:s,FilterPanel:o,Search:a,Empty:p,Loading:d,ResultHeader:l,Toolbar:c,children:y}=t,v={BottomNav:_nullishCoalesce(e, () => (C.BottomNav)),Card:_nullishCoalesce(i, () => (C.Card)),Marker:_nullishCoalesce(n, () => (C.Marker)),Popup:_nullishCoalesce(r, () => (C.Popup)),Sidebar:_nullishCoalesce(s, () => (C.Sidebar)),FilterPanel:_nullishCoalesce(o, () => (C.FilterPanel)),Search:_nullishCoalesce(a, () => (C.Search)),Empty:_nullishCoalesce(p, () => (C.Empty)),Loading:_nullishCoalesce(d, () => (C.Loading)),ResultHeader:_nullishCoalesce(l, () => (C.ResultHeader)),Toolbar:_nullishCoalesce(c, () => (C.Toolbar))};return _jsxruntime.jsx.call(void 0, We.Provider,{value:v,children:y})}function w(){return _react.useContext.call(void 0, We)}var se=_react.createContext.call(void 0, null);function h(){let t=_react.useContext.call(void 0, se);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}function I(){let t=h(),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=h(),e=I(),i=_react.useCallback.call(void 0, r=>t.applyFilters(r),[t]),n=_react.useCallback.call(void 0, (r,s)=>t.applyFilters({[r]:s}),[t]);return{filters:e.filters,set:i,setField:n}}function ye({className:t,groupClassName:e,hideLabels:i,draft:n,onDraftChange:r}={}){let s=h(),{FilterPanel:o}=w(),{filters:a}=oe(),p=n!==void 0&&r!==void 0,d=p?n:a;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(l=>{if(typeof l.render=="string")return _jsxruntime.jsx.call(void 0, "div",{"data-filter":l.key,className:e},l.key);let c=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, c,{value:l.fromParams(d),onChange:y=>p?r(l.toParams(y)):void s.applyFilters(l.toParams(y))})]},l.key)})})})}function W(){return I().results}function _t(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=h(),{items:i}=W(),{pagination:n,selection:r}=I(),{Card:s,Empty:o,Loading:a}=w();return n.loading&&i.length===0?_jsxruntime.jsx.call(void 0, a,{}):i.length===0?_jsxruntime.jsx.call(void 0, o,{}):_jsxruntime.jsx.call(void 0, "div",{role:"list",className:t,children:i.map((p,d)=>{let l=_t(p,d);return _jsxruntime.jsx.call(void 0, s,{item:p,selected:r===l,onSelect:()=>e.selectPoint(e.primaryDatasetId,l)},l)})})}var _reactdom = require('react-dom');var At={west:-179.9,south:-85,east:179.9,north:85},Ye=.1,et=.02;function zt(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 s=r>n?(r-n)*Ye:et,o=i>e?(i-e)*Ye:et;return{west:e-o,east:i+o,south:n-s,north:r+s}}function it(t){let{center:e,zoom:i,fallback:n,mapControls:r,onMapReady:s}=t,o=h(),a=I(),p=_react.useRef.call(void 0, s);p.current=s;let d=_react.useRef.call(void 0, null),l=_react.useRef.call(void 0, null),c=_react.useRef.call(void 0, null),[y,v]=_react.useState.call(void 0, !1),O=_react.useRef.call(void 0, !1),K=_react.useRef.call(void 0, !1),D=_react.useRef.call(void 0, !1),u=o.map;_react.useEffect.call(void 0, ()=>{let T=c.current;if(!u||!T)return;let L=[];for(let f of Object.keys(a.points)){if(a.layers[f]===!1)continue;let g=o.datasets.get(f),F=_nullishCoalesce(a.points[f], () => ([])),q={id:f,markers:F.map(N=>({id:N.id,position:N.position,iconUrl:_optionalChain([g, 'optionalAccess', _17 => _17.marker, 'access', _18 => _18.iconUrl, 'optionalCall', _19 => _19(N.entity)]),element:_optionalChain([g, 'optionalAccess', _20 => _20.marker, 'access', _21 => _21.element, 'optionalCall', _22 => _22(N.entity)])})),clustering:_optionalChain([g, 'optionalAccess', _23 => _23.clustering]),onMarkerClick:N=>o.selectPoint(f,N)};L.push(u.renderLayer(T,q))}return()=>{L.forEach(f=>f())}},[o,u,y,a.points,a.layers]),_react.useEffect.call(void 0, ()=>{if(!d.current||!u)return;let T=d.current,L=!1,f=null;return(async()=>{let g=await u.mount(T,{center:e,zoom:i,fullscreenTarget:_nullishCoalesce(l.current, () => (void 0))});if(L){u.destroy(g);return}c.current=g,o.setMapHandle(g),f=u.onBoundsChange(g,F=>{D.current?D.current=!1:K.current=!0,o.loadPoints(F)}),v(!0),_optionalChain([p, 'access', _24 => _24.current, 'optionalCall', _25 => _25(g.raw)]),o.loadPoints(At)})(),()=>{L=!0,_optionalChain([f, 'optionalCall', _26 => _26()]),c.current&&(u.destroy(c.current),c.current=null,o.setMapHandle(null),_optionalChain([p, 'access', _27 => _27.current, 'optionalCall', _28 => _28(null)])),v(!1)}},[o,u]),_react.useEffect.call(void 0, ()=>{let T=c.current;if(!u||!T||e||O.current||K.current)return;let L=[];for(let g of Object.keys(a.points))if(a.layers[g]!==!1)for(let F of _nullishCoalesce(a.points[g], () => ([])))L.push(F.position);let f=zt(L);f&&(O.current=!0,D.current=!0,u.fitBounds(T,f))},[u,e,y,a.points,a.layers]),_react.useEffect.call(void 0, ()=>{_optionalChain([u, 'optionalAccess', _29 => _29.updateMarkerStates, 'call', _30 => _30(a.selection,a.hovered)])},[u,y,a.selection,a.hovered]);let{Popup:V}=w(),b=V!==fe,k=_nullishCoalesce(a.points[o.primaryDatasetId], () => ([])),_=a.selection!=null?k.find(T=>T.id===a.selection):void 0,[H,x]=_react.useState.call(void 0, null),A=_react.useRef.call(void 0, _);return A.current=_,_react.useEffect.call(void 0, ()=>{let T=c.current;if(!u||!T||!b)return;let L=A.current;if(!L)return;let f=u.mountOverlay(L.position);x({entity:L.entity,position:L.position,container:f.container});let g=()=>o.selectPoint(o.primaryDatasetId,null),F=N=>{N.key==="Escape"&&g()};document.addEventListener("keydown",F);let q=u.onMapClick(g);return()=>{document.removeEventListener("keydown",F),q(),f.unmount(),x(null)}},[o,u,y,a.selection,b]),_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,b&&H?_reactdom.createPortal.call(void 0, _jsxruntime.jsx.call(void 0, V,{entity:H.entity,onClose:()=>o.selectPoint(o.primaryDatasetId,null)}),H.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 Ut(t,e){if(t<=7)return Array.from({length:t},(s,o)=>o+1);let i=Math.max(2,e-1),n=Math.min(t-1,e+1),r=[1];i>2&&r.push(he);for(let s=i;s<=n;s+=1)r.push(s);return n<t-1&&r.push(he),r.push(t),r}function nt(){let t=h(),{results:e,pagination:i}=I();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,s=r+1,o=e.total!=null?Math.ceil(e.total/n):null,a=o!=null?s<o:e.nextCursor!=null||e.items.length>=n;if(o!=null?o<=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"}),o!=null&&Ut(o,s).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===s?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${d}`,"aria-current":d===s?"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}=W(),{ResultHeader:i}=w();return _jsxruntime.jsx.call(void 0, i,{count:t.length,total:e})}function st(t,e){let i=h(),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,s]=_react.useState.call(void 0, null);return _react.useEffect.call(void 0, ()=>{let o=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(o),s(o),()=>{n.urlSync&&n.urlSync.stop(),o.dispose(),s(a=>a===o?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, Gt,{}),"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, Qt,{}),"Map"]})]})})}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, "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 Qt(){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 j(t){return typeof t!="number"?t:new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0}).format(t)}function Zt(t){return t?"rle-card rle-card--selected":"rle-card"}function be({item:t,selected:e,onSelect:i}){let n=_nullishCoalesce(t, () => ({})),r=Zt(e),s=_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:j(n.price)})]})]});return i?_jsxruntime.jsx.call(void 0, "button",{type:"button",onClick:i,"aria-pressed":_nullishCoalesce(e, () => (!1)),className:r,children:s}):_jsxruntime.jsx.call(void 0, "article",{className:r,children:s})}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 Pe({children:t}){return _jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-panel",children:t})}function Te(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?j(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:j(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:Pe,Search:we,Empty:Le,Loading:Te,ResultHeader:Se,Toolbar:Ee};function mt({open:t,onOpenChange:e,title:i,children:n,footer:r}){let s=_react.useRef.call(void 0, null),[o,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(!o)return;let l=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=l}},[o]),_react.useEffect.call(void 0, ()=>{if(!o)return;_optionalChain([s, 'access', _31 => _31.current, 'optionalAccess', _32 => _32.focus, 'call', _33 => _33()]);function l(c){c.key==="Escape"&&e(!1)}return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[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, ai,{})})]}),_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 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",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}=w();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, di,{}),_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, pi,{})))})]})}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:"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 pi(){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 ui=_jsxruntime.jsx.call(void 0, "div",{className:"rle-empty",children:"Map unavailable"});function ci(){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 s=t.current;if(!s)return;let o=()=>{let{clientWidth:c,scrollLeft:y,scrollWidth:v}=s;i(y<=0),r(y+c>=v-1)},a=0,p=()=>{a||(a=requestAnimationFrame(()=>{a=0,o()}))};o(),s.addEventListener("scroll",o,{passive:!0});let d,l;return typeof ResizeObserver<"u"&&(d=new ResizeObserver(o),d.observe(s)),typeof MutationObserver<"u"&&(l=new MutationObserver(p),l.observe(s,{characterData:!0,childList:!0,subtree:!0})),()=>{s.removeEventListener("scroll",o),_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 mi(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 s of r)if(i[s]!==n[s])return!1;return!0}function ft({search:t,filterBarStart:e,toolbarEnd:i,mobileAction:n,autoFetch:r=!0,initialPage:s,hasMap:o,mapCenter:a,mapZoom:p,mapControls:d,onMapReady:l,mobileSheetFooter:c,className:y}){let v=h(),{BottomNav:O,Search:K}=w(),D=W(),{filters:u,set:V}=oe(),{pagination:b}=I(),k=_nullishCoalesce(o, () => (v.map!=null)),[_,H]=_react.useState.call(void 0, "list"),[x,A]=_react.useState.call(void 0, !1),{atEnd:T,atStart:L,ref:f}=ci(),g=_react.useRef.call(void 0, null);_react.useEffect.call(void 0, ()=>{b.mode==="paged"&&g.current&&(g.current.scrollTop=0)},[b.mode,b.pageIndex]);let[F,q]=_react.useState.call(void 0, u),[N,vt]=_react.useState.call(void 0, x);x!==N&&(vt(x),x&&q(u));let Me=ge=>q(bt=>({...bt,...ge})),[De,Be]=_react.useState.call(void 0, !1),me=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{if(De){if(b.loading){me.current=!0;return}me.current&&(me.current=!1,Be(!1),A(!1))}},[De,b.loading]);let Q=t?{value:String(_nullishCoalesce(u[t.filterKey], () => (""))),onChange:ge=>{V({[t.filterKey]:ge||void 0})},placeholder:t.placeholder}:void 0;_react.useEffect.call(void 0, ()=>{r!==!1&&(s&&s>0?v.goToPage(s):v.applyFilters({}))},[v,r]);let Oe=()=>{Me(v.filters.clearedParams())},_e=()=>{if(mi(F,u)){A(!1);return}Be(!0),v.applyFilters(F)},ht=v.filters.activeKeys(u).length,He=_nullishCoalesce(D.total, () => (D.items.length));return _jsxruntime.jsxs.call(void 0, "div",{className:y?`rle-app ${y}`:"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:f,children:[Q&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__search",children:_jsxruntime.jsx.call(void 0, K,{value:Q.value,onChange:Q.onChange,placeholder:Q.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})]}),!L&&_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, gt,{search:Q,onFiltersClick:()=>A(!0),filterCount:ht,action:n}),_jsxruntime.jsxs.call(void 0, "div",{className:`rle-body ${k?"rle-split":"rle-body--list-only"}`,"data-mobile-view":_,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,{})]}),k&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-map",children:_jsxruntime.jsx.call(void 0, it,{center:a,zoom:p,fallback:ui,mapControls:d,onMapReady:l})})]}),k&&_jsxruntime.jsx.call(void 0, O,{view:_,onViewChange:H}),_jsxruntime.jsx.call(void 0, mt,{title:"Filters",open:x,onOpenChange:A,footer:c?c({draft:F,apply:_e,clear:Oe,resultCount:He,loading:b.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:b.loading,onClick:_e,children:b.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 hi(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,s=e?t.styles:void 0,o=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:s,overlayMarkers:o})})}),()=>{d=!0}},[i,n]),a}function bi({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 zr(t){let{datasets:e,filters:i,map:n,components:r,initialFilters:s,onFiltersChange:o,mobileAction:a,search:p,filterBarStart:d,toolbarEnd:l,mapControls:c,onMapReady:y,mobileSheetFooter:v,config:O,autoFetch:K,initialPage:D,className:u}=t,{ready:V,provider:b}=hi(n);if(!V)return null;let k=[];for(let x of e)k.push(Ve(x));i&&k.push(qe(i)),b&&k.push(Ke(b)),s&&k.push($e(s)),O&&k.push(Ue(O));let _=ze(...k),H={...ut,...r};return _jsxruntime.jsxs.call(void 0, at,{..._,children:[o&&_jsxruntime.jsx.call(void 0, bi,{onFiltersChange:o}),_jsxruntime.jsx.call(void 0, je,{...H,children:_jsxruntime.jsx.call(void 0, ft,{className:u,search:p,filterBarStart:d,toolbarEnd:l,mobileAction:a,autoFetch:K,mapCenter:_optionalChain([n, 'optionalAccess', _39 => _39.center]),mapZoom:_optionalChain([n, 'optionalAccess', _40 => _40.zoom]),mapControls:c,onMapReady:y,initialPage:D,mobileSheetFooter:v})})]})}exports.a = ee; exports.b = $; 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 = Bi; exports.n = $e; exports.o = Oi; exports.p = fe; exports.q = je; exports.r = w; exports.s = se; exports.t = h; exports.u = I; exports.v = oe; exports.w = ye; exports.x = W; 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 = Pe; exports.I = Te; 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 = zr;
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 _chunkVOLIJL6Qcjs = require('./chunk-VOLIJL6Q.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}=_chunkVOLIJL6Qcjs.r.call(void 0, );return _jsxruntime.jsx.call(void 0, t,{children:e})}var _react = require('react');function ut(){let e=_chunkVOLIJL6Qcjs.t.call(void 0, ),t=_chunkVOLIJL6Qcjs.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=_chunkVOLIJL6Qcjs.t.call(void 0, ),r=_chunkVOLIJL6Qcjs.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 = _chunkVOLIJL6Qcjs.c; exports.FallbackPopup = _chunkVOLIJL6Qcjs.p; exports.FilterRegistry = _chunkVOLIJL6Qcjs.b; exports.ListingApp = _chunkVOLIJL6Qcjs.S; exports.ListingComponentsProvider = _chunkVOLIJL6Qcjs.q; exports.ListingConfig = _chunkVOLIJL6Qcjs.f; exports.ListingEngine = _chunkVOLIJL6Qcjs.g; exports.ListingEngineContext = _chunkVOLIJL6Qcjs.s; exports.ListingEventType = v; exports.ListingFilters = _chunkVOLIJL6Qcjs.w; exports.ListingList = _chunkVOLIJL6Qcjs.y; exports.ListingMap = _chunkVOLIJL6Qcjs.z; exports.ListingPagination = _chunkVOLIJL6Qcjs.A; exports.ListingProvider = _chunkVOLIJL6Qcjs.D; exports.ListingResultHeader = _chunkVOLIJL6Qcjs.B; exports.ListingStore = _chunkVOLIJL6Qcjs.a; exports.ListingToolbar = st; exports.MemoryHistoryPort = h; exports.PaginationMode = b; exports.TypedEmitter = _chunkVOLIJL6Qcjs.d; exports.UrlSyncController = f; exports.composeListingProviders = _chunkVOLIJL6Qcjs.h; exports.listingDefaultConfig = _chunkVOLIJL6Qcjs.e; exports.useListing = _chunkVOLIJL6Qcjs.t; exports.useListingComponents = _chunkVOLIJL6Qcjs.r; exports.useListingEvent = _chunkVOLIJL6Qcjs.C; exports.useListingFilters = _chunkVOLIJL6Qcjs.v; exports.useListingLayer = ht; exports.useListingMap = ut; exports.useListingResults = _chunkVOLIJL6Qcjs.x; exports.useListingState = _chunkVOLIJL6Qcjs.u; exports.withConfig = _chunkVOLIJL6Qcjs.i; exports.withDataset = _chunkVOLIJL6Qcjs.k; exports.withFilters = _chunkVOLIJL6Qcjs.l; exports.withInitialFilters = _chunkVOLIJL6Qcjs.n; exports.withMap = _chunkVOLIJL6Qcjs.j; exports.withPrimaryDataset = _chunkVOLIJL6Qcjs.o; exports.withUrlSync = _chunkVOLIJL6Qcjs.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-CdEACHeA.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-CdEACHeA.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-DvY5Ai2_.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-DvY5Ai2_.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-GUUAYKYK.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};
@@ -210,12 +210,21 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
210
210
  hasMap?: boolean;
211
211
  /** Whether the layout fetches the first page itself on mount (`engine.applyFilters({})`). Defaults to `true`. */
212
212
  autoFetch?: boolean;
213
+ /**
214
+ * 0-based page to load on mount instead of page 1 -- for restoring a
215
+ * deep-linked page (`?page=N`) in one fetch (`engine.goToPage(initialPage)`)
216
+ * rather than page-1-then-jump. Only honored when `autoFetch` is on; `0`/unset
217
+ * loads page 1 as before. Needs an offset-capable adapter (`PageRequest.offset`).
218
+ */
219
+ initialPage?: number;
213
220
  /** Forwarded verbatim to `<ListingMap center={mapCenter} />` -- see that component's "Auto-fit" doc comment. */
214
221
  mapCenter?: LatLng;
215
222
  /** Forwarded verbatim to `<ListingMap zoom={mapZoom} />`. */
216
223
  mapZoom?: number;
217
224
  /** Forwarded verbatim to `<ListingMap mapControls={mapControls} />` -- see that prop's doc comment. */
218
225
  mapControls?: ReactNode;
226
+ /** Forwarded verbatim to `<ListingMap onMapReady={onMapReady} />` -- the native-map escape hatch; see that prop's doc comment. */
227
+ onMapReady?: (map: unknown) => void;
219
228
  /**
220
229
  * Render-prop override for the mobile filters sheet's footer -- when
221
230
  * given, replaces the default "Clear all" + "Show N results" buttons
@@ -296,7 +305,7 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
296
305
  * default -- pass `autoFetch={false}`
297
306
  * to opt out and drive the first fetch yourself.
298
307
  */
299
- declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, toolbarEnd, mobileAction, autoFetch, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
308
+ declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, toolbarEnd, mobileAction, autoFetch, initialPage, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, onMapReady, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
300
309
 
301
310
  /**
302
311
  * Two-shape `map` prop: pass a ready `MapProvider`, or the `{ apiKey, mapId? }`
@@ -382,10 +391,27 @@ interface ListingAppProps<TFilters> {
382
391
  * drops the map region entirely in that case).
383
392
  */
384
393
  mapControls?: ReactNode;
394
+ /**
395
+ * Fires with the underlying map SDK's native map object (`google.maps.Map`
396
+ * for the built-in Google provider) once the map mounts, and `null` when it
397
+ * is torn down -- forwarded verbatim through `StyledListingLayout` to
398
+ * `ListingMap`'s own `onMapReady` prop. The escape hatch for
399
+ * provider-specific features the library doesn't wrap (Google data-driven
400
+ * styling `FeatureLayer`s, custom overlays, ...). Typed `unknown`; cast to
401
+ * your SDK's map type. Omit (the default) to fire nothing.
402
+ */
403
+ onMapReady?: (map: unknown) => void;
385
404
  /** Forwarded verbatim to `StyledListingLayout`'s `mobileSheetFooter` -- see that prop's doc comment. */
386
405
  mobileSheetFooter?: (ctx: MobileSheetFooterContext<TFilters>) => ReactNode;
387
406
  config?: Partial<IListingConfigOptions>;
388
407
  autoFetch?: boolean;
408
+ /**
409
+ * 0-based page to load on mount instead of page 1 -- forwarded to
410
+ * `StyledListingLayout` to restore a deep-linked `?page=N` in a single fetch
411
+ * (`engine.goToPage`) rather than page-1-then-jump. Only honored with
412
+ * `autoFetch` on; needs an offset-capable adapter.
413
+ */
414
+ initialPage?: number;
389
415
  className?: string;
390
416
  }
391
417
  /**
@@ -210,12 +210,21 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
210
210
  hasMap?: boolean;
211
211
  /** Whether the layout fetches the first page itself on mount (`engine.applyFilters({})`). Defaults to `true`. */
212
212
  autoFetch?: boolean;
213
+ /**
214
+ * 0-based page to load on mount instead of page 1 -- for restoring a
215
+ * deep-linked page (`?page=N`) in one fetch (`engine.goToPage(initialPage)`)
216
+ * rather than page-1-then-jump. Only honored when `autoFetch` is on; `0`/unset
217
+ * loads page 1 as before. Needs an offset-capable adapter (`PageRequest.offset`).
218
+ */
219
+ initialPage?: number;
213
220
  /** Forwarded verbatim to `<ListingMap center={mapCenter} />` -- see that component's "Auto-fit" doc comment. */
214
221
  mapCenter?: LatLng;
215
222
  /** Forwarded verbatim to `<ListingMap zoom={mapZoom} />`. */
216
223
  mapZoom?: number;
217
224
  /** Forwarded verbatim to `<ListingMap mapControls={mapControls} />` -- see that prop's doc comment. */
218
225
  mapControls?: ReactNode;
226
+ /** Forwarded verbatim to `<ListingMap onMapReady={onMapReady} />` -- the native-map escape hatch; see that prop's doc comment. */
227
+ onMapReady?: (map: unknown) => void;
219
228
  /**
220
229
  * Render-prop override for the mobile filters sheet's footer -- when
221
230
  * given, replaces the default "Clear all" + "Show N results" buttons
@@ -296,7 +305,7 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
296
305
  * default -- pass `autoFetch={false}`
297
306
  * to opt out and drive the first fetch yourself.
298
307
  */
299
- declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, toolbarEnd, mobileAction, autoFetch, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
308
+ declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, toolbarEnd, mobileAction, autoFetch, initialPage, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, onMapReady, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
300
309
 
301
310
  /**
302
311
  * Two-shape `map` prop: pass a ready `MapProvider`, or the `{ apiKey, mapId? }`
@@ -382,10 +391,27 @@ interface ListingAppProps<TFilters> {
382
391
  * drops the map region entirely in that case).
383
392
  */
384
393
  mapControls?: ReactNode;
394
+ /**
395
+ * Fires with the underlying map SDK's native map object (`google.maps.Map`
396
+ * for the built-in Google provider) once the map mounts, and `null` when it
397
+ * is torn down -- forwarded verbatim through `StyledListingLayout` to
398
+ * `ListingMap`'s own `onMapReady` prop. The escape hatch for
399
+ * provider-specific features the library doesn't wrap (Google data-driven
400
+ * styling `FeatureLayer`s, custom overlays, ...). Typed `unknown`; cast to
401
+ * your SDK's map type. Omit (the default) to fire nothing.
402
+ */
403
+ onMapReady?: (map: unknown) => void;
385
404
  /** Forwarded verbatim to `StyledListingLayout`'s `mobileSheetFooter` -- see that prop's doc comment. */
386
405
  mobileSheetFooter?: (ctx: MobileSheetFooterContext<TFilters>) => ReactNode;
387
406
  config?: Partial<IListingConfigOptions>;
388
407
  autoFetch?: boolean;
408
+ /**
409
+ * 0-based page to load on mount instead of page 1 -- forwarded to
410
+ * `StyledListingLayout` to restore a deep-linked `?page=N` in a single fetch
411
+ * (`engine.goToPage`) rather than page-1-then-jump. Only honored with
412
+ * `autoFetch` on; needs an offset-capable adapter.
413
+ */
414
+ initialPage?: number;
389
415
  className?: string;
390
416
  }
391
417
  /**
@@ -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 _chunkVOLIJL6Qcjs = require('../chunk-VOLIJL6Q.cjs');var _jsxruntime = require('react/jsx-runtime');function L({children:o}){return _jsxruntime.jsx.call(void 0, _chunkVOLIJL6Qcjs.q,{..._chunkVOLIJL6Qcjs.P,children:o})}exports.BottomNav = _chunkVOLIJL6Qcjs.E; exports.BottomSheet = _chunkVOLIJL6Qcjs.Q; exports.ListingApp = _chunkVOLIJL6Qcjs.S; exports.StyledCard = _chunkVOLIJL6Qcjs.F; exports.StyledComponentsProviderWithDefaults = L; exports.StyledEmpty = _chunkVOLIJL6Qcjs.G; exports.StyledFilterPanel = _chunkVOLIJL6Qcjs.H; exports.StyledListingLayout = _chunkVOLIJL6Qcjs.R; exports.StyledLoading = _chunkVOLIJL6Qcjs.I; exports.StyledMarker = _chunkVOLIJL6Qcjs.J; exports.StyledPopup = _chunkVOLIJL6Qcjs.K; exports.StyledResultHeader = _chunkVOLIJL6Qcjs.L; exports.StyledSearch = _chunkVOLIJL6Qcjs.M; exports.StyledSidebar = _chunkVOLIJL6Qcjs.N; exports.StyledToolbar = _chunkVOLIJL6Qcjs.O; exports.styledDefaultComponents = _chunkVOLIJL6Qcjs.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-CdEACHeA.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-CdEACHeA.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-DvY5Ai2_.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-DvY5Ai2_.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-GUUAYKYK.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.9.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;