react-listing-engine 0.11.0 → 0.12.1

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,35 @@
1
1
  # react-listing-engine
2
2
 
3
+ ## 0.12.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Stop the map pane announcing "Map unavailable" while its provider is still loading.
8
+
9
+ Since 0.12.0 the app renders before an API-key `map` prop resolves to a provider -- that is what lets it server-render. But `ListingMap`'s fallback means "this app has no map", and with no way to tell that from "the map has not arrived yet" it was shown on every load of a perfectly working map, for as long as the dynamic import took.
10
+
11
+ `StyledListingLayout` gains `mapPending`, which `ListingApp` sets while a requested provider is unresolved. The pane then holds its space quietly instead of making a claim that is wrong by the time it is read.
12
+
13
+ ## 0.12.0
14
+
15
+ ### Minor Changes
16
+
17
+ - Server rendering: the app can now render real results to HTML, and hydrate them in place.
18
+
19
+ Three things stood in the way, and all three are fixed.
20
+
21
+ `ListingProvider` built its engine in a `useEffect` and returned `null` until that ran, which made every consumer client-only by construction -- on a server there are no effects, so the whole tree rendered to nothing. The engine is now constructed during render; the constructor is pure (store, registries, config, no browser API), and everything with a side effect still happens in the effect.
22
+
23
+ `ListingApp` returned `null` until an API-key `map` prop resolved to a provider through a dynamic import. It now renders without waiting: `ListingMap` already tolerates a missing provider, and because the resolution state starts `false` on both the server and the client's first render, the markup matches and hydration has nothing to reconcile. `hasMap` is derived from the PROP rather than from whether the provider resolved -- otherwise the layout renders list-only and switches to split mid-load, which is both a reflow and a hydration mismatch.
24
+
25
+ New `initialResults` on `ListingApp` (and `withInitialResults` for hand-composed providers) seeds the first page, so the first render already has rows instead of blanking while an adapter call goes out -- an adapter call being something a server render cannot do. `autoFetch` now defaults to off when results are seeded, so the identical page is not refetched a moment later.
26
+
27
+ Two changes worth checking before upgrading:
28
+
29
+ `ListingEngine` gains `isDisposed`, and `ListingProvider` uses it to replace an engine that React Strict Mode has already torn down. Because the engine now outlives the effect, Strict Mode's mount/cleanup/mount would otherwise leave a disposed engine -- emitter dead -- in context.
30
+
31
+ `ListingStoreInit` is now generic over `<TEntity, TFilters>` rather than `<TFilters>`, so it can describe the seeded page. This is a type-only break, and only for code that names that type directly.
32
+
3
33
  ## 0.11.0
4
34
 
5
35
  ### Minor Changes
@@ -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:e.results?{items:[...e.results.items],nextCursor:e.results.nextCursor,total:e.results.total}:{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 ze={pagination:"paged",pageSize:20,debounceMs:250};var ne=class{constructor(e){this.options=Object.freeze({...ze,...e})}};var re= (_class5 =class{__init5() {this.disposed=!1}__init6() {this.emitter=new ie}__init7() {this.debounceTimer=null}__init8() {this.debounceResolve=null}__init9() {this.queryToken=0}__init10() {this.pointsToken=0}__init11() {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);_class5.prototype.__init11.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,results:e.initialResults})}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)}get isDisposed(){return this.disposed}dispose(){this.clearDebounce(),this.emitter.dispose(),this.mapHandle=null,this.disposed=!0}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 Ue(...t){let e={config:{},filters:new $,datasets:new te};for(let i of t)i(e);return e}var Ke=t=>e=>{e.config={...e.config,...t}},Ve= exports.j =t=>e=>{e.map=t},qe= exports.k =t=>e=>{e.datasets.add(t)},$e= exports.l =t=>e=>{t(e.filters)},Ui= exports.m =t=>e=>{e.urlSync=t},We= exports.n =t=>e=>{e.initialFilters=t},je= exports.o =t=>e=>{e.initialResults=t},Ki= exports.p =t=>e=>{e.primaryDatasetId=t};var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function St(t){return String(_nullishCoalesce(_optionalChain([t, 'optionalAccess', _16 => _16.title]), () => ("")))}var Ct=({item:t})=>_jsxruntime.jsx.call(void 0, "div",{children:St(t)}),It=()=>_jsxruntime.jsx.call(void 0, "div",{}),fe= exports.q =()=>_jsxruntime.jsx.call(void 0, "div",{}),Et=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),xt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Rt=({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"))}),Nt=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status",children:"No results"}),Mt=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),Dt=({count:t})=>_jsxruntime.jsxs.call(void 0, "div",{children:[t," results"]}),Bt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Ot=({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:Ot,Card:Ct,Marker:It,Popup:fe,Sidebar:Et,FilterPanel:xt,Search:Rt,Empty:Nt,Loading:Mt,ResultHeader:Dt,Toolbar:Bt},Ge=_react.createContext.call(void 0, k);function Qe(t){let{BottomNav:e,Card:i,Marker:n,Popup:r,Sidebar:s,FilterPanel:o,Search:a,Empty:l,Loading:p,ResultHeader:d,Toolbar:m,children:b}=t,E={BottomNav:_nullishCoalesce(e, () => (k.BottomNav)),Card:_nullishCoalesce(i, () => (k.Card)),Marker:_nullishCoalesce(n, () => (k.Marker)),Popup:_nullishCoalesce(r, () => (k.Popup)),Sidebar:_nullishCoalesce(s, () => (k.Sidebar)),FilterPanel:_nullishCoalesce(o, () => (k.FilterPanel)),Search:_nullishCoalesce(a, () => (k.Search)),Empty:_nullishCoalesce(l, () => (k.Empty)),Loading:_nullishCoalesce(p, () => (k.Loading)),ResultHeader:_nullishCoalesce(d, () => (k.ResultHeader)),Toolbar:_nullishCoalesce(m, () => (k.Toolbar))};return _jsxruntime.jsx.call(void 0, Ge.Provider,{value:E,children:b})}function S(){return _react.useContext.call(void 0, Ge)}var se=_react.createContext.call(void 0, null);function L(){let t=_react.useContext.call(void 0, se);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}function C(){let t=L(),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=L(),e=C(),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=L(),{FilterPanel:o}=S(),{filters:a}=oe(),l=n!==void 0&&r!==void 0,p=l?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(d=>{if(typeof d.render=="string")return _jsxruntime.jsx.call(void 0, "div",{"data-filter":d.key,className:e},d.key);let m=d.render;return _jsxruntime.jsxs.call(void 0, "div",{className:e,children:[d.label&&!i&&_jsxruntime.jsx.call(void 0, "div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:d.label}),_jsxruntime.jsx.call(void 0, m,{value:d.fromParams(p),onChange:b=>l?r(d.toParams(b)):void s.applyFilters(d.toParams(b))})]},d.key)})})})}function W(){return C().results}function Ut(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 Ye({className:t}={}){let e=L(),{items:i}=W(),{pagination:n,selection:r}=C(),{Card:s,Empty:o,Loading:a}=S();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((l,p)=>{let d=Ut(l,p);return _jsxruntime.jsx.call(void 0, s,{item:l,selected:r===d,onSelect:()=>e.selectPoint(e.primaryDatasetId,d)},d)})})}var _reactdom = require('react-dom');var Vt={west:-179.9,south:-85,east:179.9,north:85},tt=.1,it=.02;function qt(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:l}of t)l<e&&(e=l),l>i&&(i=l),a<n&&(n=a),a>r&&(r=a);let s=r>n?(r-n)*tt:it,o=i>e?(i-e)*tt:it;return{west:e-o,east:i+o,south:n-s,north:r+s}}function rt(t){let{center:e,zoom:i,fallback:n,mapControls:r,onMapReady:s}=t,o=L(),a=C(),l=_react.useRef.call(void 0, s);l.current=s;let p=_react.useRef.call(void 0, null),d=_react.useRef.call(void 0, null),m=_react.useRef.call(void 0, null),[b,E]=_react.useState.call(void 0, !1),_=_react.useRef.call(void 0, !1),F=_react.useRef.call(void 0, !1),B=_react.useRef.call(void 0, !1),u=o.map;_react.useEffect.call(void 0, ()=>{let v=m.current;if(!u||!v)return;let f=[];for(let y of Object.keys(a.points)){if(a.layers[y]===!1)continue;let h=o.datasets.get(y),R=_nullishCoalesce(a.points[y], () => ([])),U={id:y,markers:R.map(T=>({id:T.id,position:T.position,iconUrl:_optionalChain([h, 'optionalAccess', _17 => _17.marker, 'access', _18 => _18.iconUrl, 'optionalCall', _19 => _19(T.entity)]),element:_optionalChain([h, 'optionalAccess', _20 => _20.marker, 'access', _21 => _21.element, 'optionalCall', _22 => _22(T.entity)])})),clustering:_optionalChain([h, 'optionalAccess', _23 => _23.clustering]),onMarkerClick:T=>o.selectPoint(y,T)};f.push(u.renderLayer(v,U))}return()=>{f.forEach(y=>y())}},[o,u,b,a.points,a.layers]),_react.useEffect.call(void 0, ()=>{if(!p.current||!u)return;let v=p.current,f=!1,y=null;return(async()=>{let h=await u.mount(v,{center:e,zoom:i,fullscreenTarget:_nullishCoalesce(d.current, () => (void 0))});if(f){u.destroy(h);return}m.current=h,o.setMapHandle(h),y=u.onBoundsChange(h,R=>{B.current?B.current=!1:F.current=!0,o.loadPoints(R)}),E(!0),_optionalChain([l, 'access', _24 => _24.current, 'optionalCall', _25 => _25(_nullishCoalesce(h.nativeMap, () => (h.raw)))]),o.loadPoints(Vt)})(),()=>{f=!0,_optionalChain([y, 'optionalCall', _26 => _26()]),m.current&&(u.destroy(m.current),m.current=null,o.setMapHandle(null),_optionalChain([l, 'access', _27 => _27.current, 'optionalCall', _28 => _28(null)])),E(!1)}},[o,u]),_react.useEffect.call(void 0, ()=>{let v=m.current;if(!u||!v||e||_.current||F.current)return;let f=[];for(let h of Object.keys(a.points))if(a.layers[h]!==!1)for(let R of _nullishCoalesce(a.points[h], () => ([])))f.push(R.position);let y=qt(f);y&&(_.current=!0,B.current=!0,u.fitBounds(v,y))},[u,e,b,a.points,a.layers]),_react.useEffect.call(void 0, ()=>{_optionalChain([u, 'optionalAccess', _29 => _29.updateMarkerStates, 'call', _30 => _30(a.selection,a.hovered)])},[u,b,a.selection,a.hovered]);let{Popup:A}=S(),x=A!==fe,H=_nullishCoalesce(a.points[o.primaryDatasetId], () => ([])),g=a.selection!=null?H.find(v=>v.id===a.selection):void 0,[N,z]=_react.useState.call(void 0, null),q=_react.useRef.call(void 0, g);return q.current=g,_react.useEffect.call(void 0, ()=>{let v=m.current;if(!u||!v||!x)return;let f=q.current;if(!f)return;let y=u.mountOverlay(f.position);z({entity:f.entity,position:f.position,container:y.container});let h=()=>o.selectPoint(o.primaryDatasetId,null),R=T=>{T.key==="Escape"&&h()};document.addEventListener("keydown",R);let U=u.onMapClick(h);return()=>{document.removeEventListener("keydown",R),U(),y.unmount(),z(null)}},[o,u,b,a.selection,x]),_jsxruntime.jsxs.call(void 0, "div",{ref:d,className:"relative h-full min-h-0 w-full",children:[_jsxruntime.jsxs.call(void 0, "div",{ref:p,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,x&&N?_reactdom.createPortal.call(void 0, _jsxruntime.jsx.call(void 0, A,{entity:N.entity,onClose:()=>o.selectPoint(o.primaryDatasetId,null)}),N.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 ve="gap";function $t(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(ve);for(let s=i;s<=n;s+=1)r.push(s);return n<t-1&&r.push(ve),r.push(t),r}function st(){let t=L(),{results:e,pagination:i}=C();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 l=p=>()=>{t.goToPage(p)};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:l(r-1),children:"\u2039"}),o!=null&&$t(o,s).map((p,d)=>p===ve?_jsxruntime.jsx.call(void 0, "span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${d}`):_jsxruntime.jsx.call(void 0, "button",{type:"button",className:p===s?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${p}`,"aria-current":p===s?"page":void 0,disabled:i.loading,onClick:l(p-1),children:p},p)),_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:l(r+1),children:"\u203A"})]})}function ot(){let{items:t,total:e}=W(),{ResultHeader:i}=S();return _jsxruntime.jsx.call(void 0, i,{count:t.length,total:e})}function at(t,e){let i=L(),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 dt(t){let{children:e,...i}=t,[n]=_react.useState.call(void 0, ()=>i),r=_react.useCallback.call(void 0, ()=>new re({datasets:n.datasets,filters:n.filters,config:n.config,map:n.map,initialFilters:n.initialFilters,initialResults:n.initialResults,primaryDatasetId:n.primaryDatasetId}),[n]),[s,o]=_react.useState.call(void 0, r),a=_react.useRef.call(void 0, s);return a.current=s,_react.useEffect.call(void 0, ()=>{let l=a.current;return l.isDisposed&&(l=r(),a.current=l,o(l)),n.urlSync&&n.urlSync.start(l),()=>{n.urlSync&&n.urlSync.stop(),l.dispose()}},[n,r]),_jsxruntime.jsx.call(void 0, se.Provider,{value:s,children:e})}function pt({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, ei,{}),"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, ti,{}),"Map"]})]})})}function ei(){return _jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "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 ti(){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 ii(t){return t?"rle-card rle-card--selected":"rle-card"}function be({item:t,selected:e,onSelect:i}){let n=_nullishCoalesce(t, () => ({})),r=ii(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 we({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 Ce({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 mt={BottomNav:pt,Card:be,Marker:Fe,Popup:we,Sidebar:Ie,FilterPanel:Pe,Search:Ce,Empty:Le,Loading:Te,ResultHeader:Se,Toolbar:Ee};function ft({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),[l,p]=_react.useState.call(void 0, !1);return _react.useEffect.call(void 0, ()=>{if(!t){p(!1),a(!1);return}a(!0);let d=requestAnimationFrame(()=>p(!0));return()=>cancelAnimationFrame(d)},[t]),_react.useEffect.call(void 0, ()=>{if(!o)return;let d=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=d}},[o]),_react.useEffect.call(void 0, ()=>{if(!o)return;_optionalChain([s, 'access', _31 => _31.current, 'optionalAccess', _32 => _32.focus, 'call', _33 => _33()]);function d(m){m.key==="Escape"&&e(!1)}return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[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${l?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{ref:s,className:`rle-sheet${l?" 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, mi,{})})]}),_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 mi(){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 yt({search:t,onFiltersClick:e,filterCount:i=0,action:n}){let{Search:r}=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, 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, fi,{}),_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, yi,{})))})]})}function fi(){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 yi(){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 hi=_jsxruntime.jsx.call(void 0, "div",{className:"rle-empty",children:"Map unavailable"}),vi=_jsxruntime.jsx.call(void 0, "div",{className:"rle-map-pending"});function bi(){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:m,scrollLeft:b,scrollWidth:E}=s;i(b<=0),r(b+m>=E-1)},a=0,l=()=>{a||(a=requestAnimationFrame(()=>{a=0,o()}))};o(),s.addEventListener("scroll",o,{passive:!0});let p,d;return typeof ResizeObserver<"u"&&(p=new ResizeObserver(o),p.observe(s)),typeof MutationObserver<"u"&&(d=new MutationObserver(l),d.observe(s,{characterData:!0,childList:!0,subtree:!0})),()=>{s.removeEventListener("scroll",o),_optionalChain([p, 'optionalAccess', _34 => _34.disconnect, 'call', _35 => _35()]),_optionalChain([d, 'optionalAccess', _36 => _36.disconnect, 'call', _37 => _37()]),a&&cancelAnimationFrame(a)}},[]),{atEnd:n,atStart:e,ref:t}}function Li(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 vt({search:t,filterBarStart:e,resultsSlot:i,toolbarEnd:n,mobileAction:r,autoFetch:s=!0,initialPage:o,hasMap:a,mapCenter:l,mapZoom:p,mapControls:d,mapPending:m,onMapReady:b,mobileSheetFooter:E,className:_}){let F=L(),{BottomNav:B,Search:u}=S(),A=W(),{filters:x,set:H}=oe(),{pagination:g}=C(),N=_nullishCoalesce(a, () => (F.map!=null)),[z,q]=_react.useState.call(void 0, "list"),[v,f]=_react.useState.call(void 0, !1),{atEnd:y,atStart:h,ref:R}=bi(),U=_react.useRef.call(void 0, null);_react.useEffect.call(void 0, ()=>{g.mode==="paged"&&U.current&&(U.current.scrollTop=0)},[g.mode,g.pageIndex]);let[T,Me]=_react.useState.call(void 0, x),[Lt,Pt]=_react.useState.call(void 0, v);v!==Lt&&(Pt(v),v&&Me(x));let De=ge=>Me(Ft=>({...Ft,...ge})),[Be,Oe]=_react.useState.call(void 0, !1),me=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{if(Be){if(g.loading){me.current=!0;return}me.current&&(me.current=!1,Oe(!1),f(!1))}},[Be,g.loading]);let Q=t?{value:String(_nullishCoalesce(x[t.filterKey], () => (""))),onChange:ge=>{H({[t.filterKey]:ge||void 0})},placeholder:t.placeholder}:void 0;_react.useEffect.call(void 0, ()=>{s!==!1&&(o&&o>0?F.goToPage(o):F.applyFilters({}))},[F,s]);let _e=()=>{De(F.filters.clearedParams())},Ae=()=>{if(Li(T,x)){f(!1);return}Oe(!0),F.applyFilters(T)},Tt=F.filters.activeKeys(x).length,He=_nullishCoalesce(A.total, () => (A.items.length));return _jsxruntime.jsxs.call(void 0, "div",{className:_?`rle-app ${_}`:"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:R,children:[Q&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__search",children:_jsxruntime.jsx.call(void 0, u,{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})]}),!h&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!y&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),_jsxruntime.jsx.call(void 0, yt,{search:Q,onFiltersClick:()=>f(!0),filterCount:Tt,action:r}),_jsxruntime.jsxs.call(void 0, "div",{className:`rle-body ${N?"rle-split":"rle-body--list-only"}`,"data-mobile-view":z,children:[_jsxruntime.jsx.call(void 0, "div",{className:"rle-list",ref:U,children:_nullishCoalesce(i, () => (_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-list-header",children:[_jsxruntime.jsx.call(void 0, ot,{}),n&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-list-header__toolbar",children:n})]}),_jsxruntime.jsx.call(void 0, Ye,{className:"rle-list-grid"}),_jsxruntime.jsx.call(void 0, st,{})]})))}),N&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-map",children:_jsxruntime.jsx.call(void 0, rt,{center:l,zoom:p,fallback:m?vi:hi,mapControls:d,onMapReady:b})})]}),N&&_jsxruntime.jsx.call(void 0, B,{view:z,onViewChange:q}),_jsxruntime.jsx.call(void 0, ft,{title:"Filters",open:v,onOpenChange:f,footer:E?E({draft:T,apply:Ae,clear:_e,resultCount:He,loading:g.loading}):_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:_e,children:"Clear all"}),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:g.loading,onClick:Ae,children:g.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:T,onDraftChange:De})})]})}function bt(t){return"provider"in t}function ki(t){let e=t!=null&&!bt(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,l]=_react.useState.call(void 0, ()=>!t||bt(t)?{ready:!0,provider:_optionalChain([t, 'optionalAccess', _38 => _38.provider])}:{ready:!1});return _react.useEffect.call(void 0, ()=>{if(!i)return;let p=!1;return Promise.resolve().then(() => _interopRequireWildcard(require("./maps/google/index.cjs"))).then(({googleProvider:d})=>{p||l({ready:!0,provider:d({apiKey:i,mapId:n,mapOptions:r,styles:s,overlayMarkers:o})})}),()=>{p=!0}},[i,n]),a}function wi({onFiltersChange:t}){let e=_react.useRef.call(void 0, t);return e.current=t,at("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function Wr(t){let{datasets:e,filters:i,map:n,components:r,initialFilters:s,initialResults:o,onFiltersChange:a,mobileAction:l,search:p,filterBarStart:d,resultsSlot:m,toolbarEnd:b,mapControls:E,onMapReady:_,mobileSheetFooter:F,config:B,autoFetch:u,initialPage:A,className:x}=t,{provider:H}=ki(n),g=[];for(let q of e)g.push(qe(q));i&&g.push($e(i)),H&&g.push(Ve(H)),s&&g.push(We(s)),o&&g.push(je(o)),B&&g.push(Ke(B));let N=Ue(...g),z={...mt,...r};return _jsxruntime.jsxs.call(void 0, dt,{...N,children:[a&&_jsxruntime.jsx.call(void 0, wi,{onFiltersChange:a}),_jsxruntime.jsx.call(void 0, Qe,{...z,children:_jsxruntime.jsx.call(void 0, vt,{className:x,search:p,filterBarStart:d,resultsSlot:m,toolbarEnd:b,mobileAction:l,autoFetch:_nullishCoalesce(u, () => (o==null)),hasMap:n!=null,mapCenter:_optionalChain([n, 'optionalAccess', _39 => _39.center]),mapZoom:_optionalChain([n, 'optionalAccess', _40 => _40.zoom]),mapControls:E,mapPending:n!=null&&H==null,onMapReady:_,initialPage:A,mobileSheetFooter:F})})]})}exports.a = ee; exports.b = $; exports.c = te; exports.d = ie; exports.e = ze; exports.f = ne; exports.g = re; exports.h = Ue; exports.i = Ke; exports.j = Ve; exports.k = qe; exports.l = $e; exports.m = Ui; exports.n = We; exports.o = je; exports.p = Ki; exports.q = fe; exports.r = Qe; exports.s = S; exports.t = se; exports.u = L; exports.v = C; exports.w = oe; exports.x = ye; exports.y = W; exports.z = Ye; exports.A = rt; exports.B = st; exports.C = ot; exports.D = at; exports.E = dt; exports.F = pt; exports.G = be; exports.H = Le; exports.I = Pe; exports.J = Te; exports.K = Fe; exports.L = we; exports.M = Se; exports.N = Ce; exports.O = Ie; exports.P = Ee; exports.Q = mt; exports.R = ft; exports.S = vt; exports.T = Wr;
@@ -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:e.results?{items:[...e.results.items],nextCursor:e.results.nextCursor,total:e.results.total}:{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 ze={pagination:"paged",pageSize:20,debounceMs:250};var ne=class{options;constructor(e){this.options=Object.freeze({...ze,...e})}};var re=class{filters;map;datasets;primaryDatasetId;store;disposed=!1;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,results:e.initialResults})}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)}get isDisposed(){return this.disposed}dispose(){this.clearDebounce(),this.emitter.dispose(),this.mapHandle=null,this.disposed=!0}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 Ue(...t){let e={config:{},filters:new $,datasets:new te};for(let i of t)i(e);return e}var Ke=t=>e=>{e.config={...e.config,...t}},Ve=t=>e=>{e.map=t},qe=t=>e=>{e.datasets.add(t)},$e=t=>e=>{t(e.filters)},Ui=t=>e=>{e.urlSync=t},We=t=>e=>{e.initialFilters=t},je=t=>e=>{e.initialResults=t},Ki=t=>e=>{e.primaryDatasetId=t};import{createContext as kt,useContext as wt}from"react";import{jsx as w,jsxs as Ze}from"react/jsx-runtime";function St(t){return String(t?.title??"")}var Ct=({item:t})=>w("div",{children:St(t)}),It=()=>w("div",{}),fe=()=>w("div",{}),Et=({children:t})=>w("div",{children:t}),xt=({children:t})=>w("div",{children:t}),Rt=({value:t,onChange:e,placeholder:i})=>w("input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":i??"Search"}),Nt=()=>w("div",{role:"status",children:"No results"}),Mt=()=>w("div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),Dt=({count:t})=>Ze("div",{children:[t," results"]}),Bt=({children:t})=>w("div",{children:t}),Ot=({view:t,onViewChange:e})=>Ze("nav",{"aria-label":"Listing navigation",children:[w("button",{type:"button","aria-pressed":t==="list",onClick:()=>e("list"),children:"List"}),w("button",{type:"button","aria-pressed":t==="map",onClick:()=>e("map"),children:"Map"})]}),k={BottomNav:Ot,Card:Ct,Marker:It,Popup:fe,Sidebar:Et,FilterPanel:xt,Search:Rt,Empty:Nt,Loading:Mt,ResultHeader:Dt,Toolbar:Bt},Ge=kt(k);function Qe(t){let{BottomNav:e,Card:i,Marker:n,Popup:r,Sidebar:s,FilterPanel:o,Search:a,Empty:l,Loading:p,ResultHeader:d,Toolbar:m,children:b}=t,E={BottomNav:e??k.BottomNav,Card:i??k.Card,Marker:n??k.Marker,Popup:r??k.Popup,Sidebar:s??k.Sidebar,FilterPanel:o??k.FilterPanel,Search:a??k.Search,Empty:l??k.Empty,Loading:p??k.Loading,ResultHeader:d??k.ResultHeader,Toolbar:m??k.Toolbar};return w(Ge.Provider,{value:E,children:b})}function S(){return wt(Ge)}import{createContext as _t}from"react";var se=_t(null);import{useContext as At}from"react";function L(){let t=At(se);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}import{useCallback as Xe,useSyncExternalStore as Ht}from"react";function C(){let t=L(),e=Xe(n=>t.subscribe(n),[t]),i=Xe(()=>t.state,[t]);return Ht(e,i,i)}import{useCallback as Je}from"react";function oe(){let t=L(),e=C(),i=Je(r=>t.applyFilters(r),[t]),n=Je((r,s)=>t.applyFilters({[r]:s}),[t]);return{filters:e.filters,set:i,setField:n}}import{jsx as Z,jsxs as zt}from"react/jsx-runtime";function ye({className:t,groupClassName:e,hideLabels:i,draft:n,onDraftChange:r}={}){let s=L(),{FilterPanel:o}=S(),{filters:a}=oe(),l=n!==void 0&&r!==void 0,p=l?n:a;return Z(o,{children:Z("div",{className:t??"space-y-5",children:s.filters.list().map(d=>{if(typeof d.render=="string")return Z("div",{"data-filter":d.key,className:e},d.key);let m=d.render;return zt("div",{className:e,children:[d.label&&!i&&Z("div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:d.label}),Z(m,{value:d.fromParams(p),onChange:b=>l?r(d.toParams(b)):void s.applyFilters(d.toParams(b))})]},d.key)})})})}function W(){return C().results}import{jsx as ae}from"react/jsx-runtime";function Ut(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 Ye({className:t}={}){let e=L(),{items:i}=W(),{pagination:n,selection:r}=C(),{Card:s,Empty:o,Loading:a}=S();return n.loading&&i.length===0?ae(a,{}):i.length===0?ae(o,{}):ae("div",{role:"list",className:t,children:i.map((l,p)=>{let d=Ut(l,p);return ae(s,{item:l,selected:r===d,onSelect:()=>e.selectPoint(e.primaryDatasetId,d)},d)})})}import{useEffect as X,useRef as O,useState as et}from"react";import{createPortal as Kt}from"react-dom";import{jsx as he,jsxs as nt}from"react/jsx-runtime";var Vt={west:-179.9,south:-85,east:179.9,north:85},tt=.1,it=.02;function qt(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:l}of t)l<e&&(e=l),l>i&&(i=l),a<n&&(n=a),a>r&&(r=a);let s=r>n?(r-n)*tt:it,o=i>e?(i-e)*tt:it;return{west:e-o,east:i+o,south:n-s,north:r+s}}function rt(t){let{center:e,zoom:i,fallback:n,mapControls:r,onMapReady:s}=t,o=L(),a=C(),l=O(s);l.current=s;let p=O(null),d=O(null),m=O(null),[b,E]=et(!1),_=O(!1),F=O(!1),B=O(!1),u=o.map;X(()=>{let v=m.current;if(!u||!v)return;let f=[];for(let y of Object.keys(a.points)){if(a.layers[y]===!1)continue;let h=o.datasets.get(y),R=a.points[y]??[],U={id:y,markers:R.map(T=>({id:T.id,position:T.position,iconUrl:h?.marker.iconUrl?.(T.entity),element:h?.marker.element?.(T.entity)})),clustering:h?.clustering,onMarkerClick:T=>o.selectPoint(y,T)};f.push(u.renderLayer(v,U))}return()=>{f.forEach(y=>y())}},[o,u,b,a.points,a.layers]),X(()=>{if(!p.current||!u)return;let v=p.current,f=!1,y=null;return(async()=>{let h=await u.mount(v,{center:e,zoom:i,fullscreenTarget:d.current??void 0});if(f){u.destroy(h);return}m.current=h,o.setMapHandle(h),y=u.onBoundsChange(h,R=>{B.current?B.current=!1:F.current=!0,o.loadPoints(R)}),E(!0),l.current?.(h.nativeMap??h.raw),o.loadPoints(Vt)})(),()=>{f=!0,y?.(),m.current&&(u.destroy(m.current),m.current=null,o.setMapHandle(null),l.current?.(null)),E(!1)}},[o,u]),X(()=>{let v=m.current;if(!u||!v||e||_.current||F.current)return;let f=[];for(let h of Object.keys(a.points))if(a.layers[h]!==!1)for(let R of a.points[h]??[])f.push(R.position);let y=qt(f);y&&(_.current=!0,B.current=!0,u.fitBounds(v,y))},[u,e,b,a.points,a.layers]),X(()=>{u?.updateMarkerStates(a.selection,a.hovered)},[u,b,a.selection,a.hovered]);let{Popup:A}=S(),x=A!==fe,H=a.points[o.primaryDatasetId]??[],g=a.selection!=null?H.find(v=>v.id===a.selection):void 0,[N,z]=et(null),q=O(g);return q.current=g,X(()=>{let v=m.current;if(!u||!v||!x)return;let f=q.current;if(!f)return;let y=u.mountOverlay(f.position);z({entity:f.entity,position:f.position,container:y.container});let h=()=>o.selectPoint(o.primaryDatasetId,null),R=T=>{T.key==="Escape"&&h()};document.addEventListener("keydown",R);let U=u.onMapClick(h);return()=>{document.removeEventListener("keydown",R),U(),y.unmount(),z(null)}},[o,u,b,a.selection,x]),nt("div",{ref:d,className:"relative h-full min-h-0 w-full",children:[nt("div",{ref:p,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,x&&N?Kt(he(A,{entity:N.entity,onClose:()=>o.selectPoint(o.primaryDatasetId,null)}),N.container):null]}),r!=null&&he("div",{className:"pointer-events-none absolute inset-0",children:he("div",{className:"pointer-events-auto",children:r})})]})}import{jsx as J,jsxs as Wt}from"react/jsx-runtime";var ve="gap";function $t(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(ve);for(let s=i;s<=n;s+=1)r.push(s);return n<t-1&&r.push(ve),r.push(t),r}function st(){let t=L(),{results:e,pagination:i}=C();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 l=p=>()=>{t.goToPage(p)};return Wt("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:l(r-1),children:"\u2039"}),o!=null&&$t(o,s).map((p,d)=>p===ve?J("span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${d}`):J("button",{type:"button",className:p===s?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${p}`,"aria-current":p===s?"page":void 0,disabled:i.loading,onClick:l(p-1),children:p},p)),J("button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Next page",disabled:i.loading||!a,onClick:l(r+1),children:"\u203A"})]})}import{jsx as jt}from"react/jsx-runtime";function ot(){let{items:t,total:e}=W(),{ResultHeader:i}=S();return jt(i,{count:t.length,total:e})}import{useEffect as Gt,useRef as Qt}from"react";function at(t,e){let i=L(),n=Qt(e);n.current=e,Gt(()=>i.on(t,r=>n.current(r)),[i,t])}import{useCallback as Zt,useEffect as Xt,useRef as Jt,useState as lt}from"react";import{jsx as Yt}from"react/jsx-runtime";function dt(t){let{children:e,...i}=t,[n]=lt(()=>i),r=Zt(()=>new re({datasets:n.datasets,filters:n.filters,config:n.config,map:n.map,initialFilters:n.initialFilters,initialResults:n.initialResults,primaryDatasetId:n.primaryDatasetId}),[n]),[s,o]=lt(r),a=Jt(s);return a.current=s,Xt(()=>{let l=a.current;return l.isDisposed&&(l=r(),a.current=l,o(l)),n.urlSync&&n.urlSync.start(l),()=>{n.urlSync&&n.urlSync.stop(),l.dispose()}},[n,r]),Yt(se.Provider,{value:s,children:e})}import{jsx as I,jsxs as Y}from"react/jsx-runtime";function pt({view:t,onViewChange:e}){return I("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:[I(ei,{}),"List"]}),Y("button",{type:"button",className:`rle-viewtoggle__btn${t==="map"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="map",onClick:()=>e("map"),children:[I(ti,{}),"Map"]})]})})}function ei(){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:[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 ti(){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:[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 j(t){return typeof t!="number"?t:new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0}).format(t)}import{Fragment as ni,jsx as M,jsxs as ut}from"react/jsx-runtime";function ii(t){return t?"rle-card rle-card--selected":"rle-card"}function be({item:t,selected:e,onSelect:i}){let n=t??{},r=ii(e),s=ut(ni,{children:[n.imageUrl?M("img",{src:n.imageUrl,alt:n.title??"",className:"rle-card-media"}):M("div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),ut("div",{className:"rle-card-body",children:[n.title&&M("span",{className:"rle-card-title",children:n.title}),n.subtitle&&M("span",{className:"rle-card-address",children:n.subtitle}),n.badge&&M("div",{className:"rle-card-info",children:M("span",{className:"rle-card-info-item",children:n.badge})}),n.price!=null&&M("span",{className:"rle-card-price",children:j(n.price)})]})]});return i?M("button",{type:"button",onClick:i,"aria-pressed":e??!1,className:r,children:s}):M("article",{className:r,children:s})}import{jsx as le,jsxs as ct}from"react/jsx-runtime";function Le(t){return ct("div",{role:"status",className:"rle-empty",children:[ct("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 ri}from"react/jsx-runtime";function Pe({children:t}){return ri("div",{className:"rle-filter-panel",children:t})}import{jsx as de,jsxs as si}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)=>si("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 oi}from"react/jsx-runtime";function Fe({point:t}){let e=t.entity??{};return oi("span",{className:"rle-pin",children:e.price!=null?j(e.price):""})}import{jsx as G,jsxs as ke}from"react/jsx-runtime";function we({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 ai}from"react/jsx-runtime";function Se({count:t,total:e}){let i=e!=null&&e!==t?`${t} of ${e} results`:`${t} results`;return ai("div",{className:"rle-result-header",children:i})}import{jsx as li}from"react/jsx-runtime";function Ce({value:t,onChange:e,placeholder:i}){return li("input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":i??"Search",className:"rle-input"})}import{jsx as di}from"react/jsx-runtime";function Ie({children:t}){return di("aside",{className:"rle-sidebar",children:t})}import{jsx as pi}from"react/jsx-runtime";function Ee({children:t}){return pi("div",{className:"rle-toolbar",children:t})}var mt={BottomNav:pt,Card:be,Marker:Fe,Popup:we,Sidebar:Ie,FilterPanel:Pe,Search:Ce,Empty:Le,Loading:Te,ResultHeader:Se,Toolbar:Ee};import{useEffect as xe,useRef as ui,useState as gt}from"react";import{createPortal as ci}from"react-dom";import{Fragment as gi,jsx as D,jsxs as pe}from"react/jsx-runtime";function ft({open:t,onOpenChange:e,title:i,children:n,footer:r}){let s=ui(null),[o,a]=gt(!1),[l,p]=gt(!1);return xe(()=>{if(!t){p(!1),a(!1);return}a(!0);let d=requestAnimationFrame(()=>p(!0));return()=>cancelAnimationFrame(d)},[t]),xe(()=>{if(!o)return;let d=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=d}},[o]),xe(()=>{if(!o)return;s.current?.focus();function d(m){m.key==="Escape"&&e(!1)}return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[o,e]),!o||typeof document>"u"?null:ci(pe(gi,{children:[D("div",{className:`rle-sheet-backdrop${l?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),pe("div",{ref:s,className:`rle-sheet${l?" rle-sheet--open":""}`,role:"dialog","aria-modal":"true","aria-label":i,tabIndex:-1,children:[D("div",{className:"rle-sheet__handle","aria-hidden":"true"}),pe("div",{className:"rle-sheet__header",children:[i&&D("div",{className:"rle-sheet__title",children:i}),D("button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:D(mi,{})})]}),D("div",{className:"rle-sheet__body",children:n}),r&&D("div",{className:"rle-sheet__footer",children:r})]})]}),document.body)}function mi(){return pe("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",width:"16",height:"16","aria-hidden":"true",children:[D("path",{d:"M18 6 6 18"}),D("path",{d:"m6 6 12 12"})]})}import{useEffect as ce,useRef as Re,useState as V}from"react";import{jsx as P,jsxs as ue}from"react/jsx-runtime";function yt({search:t,onFiltersClick:e,filterCount:i=0,action:n}){let{Search:r}=S();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(fi,{}),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(yi,{})})]})}function fi(){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 yi(){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 ht,jsx as c,jsxs as K}from"react/jsx-runtime";var hi=c("div",{className:"rle-empty",children:"Map unavailable"}),vi=c("div",{className:"rle-map-pending"});function bi(){let t=Re(null),[e,i]=V(!0),[n,r]=V(!0);return ce(()=>{let s=t.current;if(!s)return;let o=()=>{let{clientWidth:m,scrollLeft:b,scrollWidth:E}=s;i(b<=0),r(b+m>=E-1)},a=0,l=()=>{a||(a=requestAnimationFrame(()=>{a=0,o()}))};o(),s.addEventListener("scroll",o,{passive:!0});let p,d;return typeof ResizeObserver<"u"&&(p=new ResizeObserver(o),p.observe(s)),typeof MutationObserver<"u"&&(d=new MutationObserver(l),d.observe(s,{characterData:!0,childList:!0,subtree:!0})),()=>{s.removeEventListener("scroll",o),p?.disconnect(),d?.disconnect(),a&&cancelAnimationFrame(a)}},[]),{atEnd:n,atStart:e,ref:t}}function Li(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 vt({search:t,filterBarStart:e,resultsSlot:i,toolbarEnd:n,mobileAction:r,autoFetch:s=!0,initialPage:o,hasMap:a,mapCenter:l,mapZoom:p,mapControls:d,mapPending:m,onMapReady:b,mobileSheetFooter:E,className:_}){let F=L(),{BottomNav:B,Search:u}=S(),A=W(),{filters:x,set:H}=oe(),{pagination:g}=C(),N=a??F.map!=null,[z,q]=V("list"),[v,f]=V(!1),{atEnd:y,atStart:h,ref:R}=bi(),U=Re(null);ce(()=>{g.mode==="paged"&&U.current&&(U.current.scrollTop=0)},[g.mode,g.pageIndex]);let[T,Me]=V(x),[Lt,Pt]=V(v);v!==Lt&&(Pt(v),v&&Me(x));let De=ge=>Me(Ft=>({...Ft,...ge})),[Be,Oe]=V(!1),me=Re(!1);ce(()=>{if(Be){if(g.loading){me.current=!0;return}me.current&&(me.current=!1,Oe(!1),f(!1))}},[Be,g.loading]);let Q=t?{value:String(x[t.filterKey]??""),onChange:ge=>{H({[t.filterKey]:ge||void 0})},placeholder:t.placeholder}:void 0;ce(()=>{s!==!1&&(o&&o>0?F.goToPage(o):F.applyFilters({}))},[F,s]);let _e=()=>{De(F.filters.clearedParams())},Ae=()=>{if(Li(T,x)){f(!1);return}Oe(!0),F.applyFilters(T)},Tt=F.filters.activeKeys(x).length,He=A.total??A.items.length;return K("div",{className:_?`rle-app ${_}`:"rle-app",children:[K("div",{className:"rle-filter-bar",children:[K("div",{className:"rle-filter-bar__scroll",ref:R,children:[Q&&c("div",{className:"rle-filter-bar__search",children:c(u,{value:Q.value,onChange:Q.onChange,placeholder:Q.placeholder})}),e&&c("div",{className:"rle-filter-bar__slot",children:e}),c(ye,{className:"rle-filters-row",groupClassName:"rle-filter-group",hideLabels:!0})]}),!h&&c("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!y&&c("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),c(yt,{search:Q,onFiltersClick:()=>f(!0),filterCount:Tt,action:r}),K("div",{className:`rle-body ${N?"rle-split":"rle-body--list-only"}`,"data-mobile-view":z,children:[c("div",{className:"rle-list",ref:U,children:i??K(ht,{children:[K("div",{className:"rle-list-header",children:[c(ot,{}),n&&c("div",{className:"rle-list-header__toolbar",children:n})]}),c(Ye,{className:"rle-list-grid"}),c(st,{})]})}),N&&c("div",{className:"rle-map",children:c(rt,{center:l,zoom:p,fallback:m?vi:hi,mapControls:d,onMapReady:b})})]}),N&&c(B,{view:z,onViewChange:q}),c(ft,{title:"Filters",open:v,onOpenChange:f,footer:E?E({draft:T,apply:Ae,clear:_e,resultCount:He,loading:g.loading}):K(ht,{children:[c("button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:_e,children:"Clear all"}),c("button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:g.loading,onClick:Ae,children:g.loading?c("span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${He} results`})]}),children:c(ye,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:T,onDraftChange:De})})]})}import{useEffect as Pi,useRef as Ti,useState as Fi}from"react";import{jsx as Ne,jsxs as Si}from"react/jsx-runtime";function bt(t){return"provider"in t}function ki(t){let e=t!=null&&!bt(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,l]=Fi(()=>!t||bt(t)?{ready:!0,provider:t?.provider}:{ready:!1});return Pi(()=>{if(!i)return;let p=!1;return import("./maps/google/index.js").then(({googleProvider:d})=>{p||l({ready:!0,provider:d({apiKey:i,mapId:n,mapOptions:r,styles:s,overlayMarkers:o})})}),()=>{p=!0}},[i,n]),a}function wi({onFiltersChange:t}){let e=Ti(t);return e.current=t,at("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function Wr(t){let{datasets:e,filters:i,map:n,components:r,initialFilters:s,initialResults:o,onFiltersChange:a,mobileAction:l,search:p,filterBarStart:d,resultsSlot:m,toolbarEnd:b,mapControls:E,onMapReady:_,mobileSheetFooter:F,config:B,autoFetch:u,initialPage:A,className:x}=t,{provider:H}=ki(n),g=[];for(let q of e)g.push(qe(q));i&&g.push($e(i)),H&&g.push(Ve(H)),s&&g.push(We(s)),o&&g.push(je(o)),B&&g.push(Ke(B));let N=Ue(...g),z={...mt,...r};return Si(dt,{...N,children:[a&&Ne(wi,{onFiltersChange:a}),Ne(Qe,{...z,children:Ne(vt,{className:x,search:p,filterBarStart:d,resultsSlot:m,toolbarEnd:b,mobileAction:l,autoFetch:u??o==null,hasMap:n!=null,mapCenter:n?.center,mapZoom:n?.zoom,mapControls:E,mapPending:n!=null&&H==null,onMapReady:_,initialPage:A,mobileSheetFooter:F})})]})}export{ee as a,$ as b,te as c,ie as d,ze as e,ne as f,re as g,Ue as h,Ke as i,Ve as j,qe as k,$e as l,Ui as m,We as n,je as o,Ki as p,fe as q,Qe as r,S as s,se as t,L as u,C as v,oe as w,ye as x,W as y,Ye as z,rt as A,st as B,ot as C,at as D,dt as E,pt as F,be as G,Le as H,Pe as I,Te as J,Fe as K,we as L,Se as M,Ce as N,Ie as O,Ee as P,mt as Q,ft as R,vt as S,Wr as T};
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 _chunk326ZSXGNcjs = require('./chunk-326ZSXGN.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}=_chunk326ZSXGNcjs.r.call(void 0, );return _jsxruntime.jsx.call(void 0, t,{children:e})}var _react = require('react');function ut(){let e=_chunk326ZSXGNcjs.t.call(void 0, ),t=_chunk326ZSXGNcjs.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=_chunk326ZSXGNcjs.t.call(void 0, ),r=_chunk326ZSXGNcjs.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 = _chunk326ZSXGNcjs.c; exports.FallbackPopup = _chunk326ZSXGNcjs.p; exports.FilterRegistry = _chunk326ZSXGNcjs.b; exports.ListingApp = _chunk326ZSXGNcjs.S; exports.ListingComponentsProvider = _chunk326ZSXGNcjs.q; exports.ListingConfig = _chunk326ZSXGNcjs.f; exports.ListingEngine = _chunk326ZSXGNcjs.g; exports.ListingEngineContext = _chunk326ZSXGNcjs.s; exports.ListingEventType = v; exports.ListingFilters = _chunk326ZSXGNcjs.w; exports.ListingList = _chunk326ZSXGNcjs.y; exports.ListingMap = _chunk326ZSXGNcjs.z; exports.ListingPagination = _chunk326ZSXGNcjs.A; exports.ListingProvider = _chunk326ZSXGNcjs.D; exports.ListingResultHeader = _chunk326ZSXGNcjs.B; exports.ListingStore = _chunk326ZSXGNcjs.a; exports.ListingToolbar = st; exports.MemoryHistoryPort = h; exports.PaginationMode = b; exports.TypedEmitter = _chunk326ZSXGNcjs.d; exports.UrlSyncController = f; exports.composeListingProviders = _chunk326ZSXGNcjs.h; exports.listingDefaultConfig = _chunk326ZSXGNcjs.e; exports.useListing = _chunk326ZSXGNcjs.t; exports.useListingComponents = _chunk326ZSXGNcjs.r; exports.useListingEvent = _chunk326ZSXGNcjs.C; exports.useListingFilters = _chunk326ZSXGNcjs.v; exports.useListingLayer = ht; exports.useListingMap = ut; exports.useListingResults = _chunk326ZSXGNcjs.x; exports.useListingState = _chunk326ZSXGNcjs.u; exports.withConfig = _chunk326ZSXGNcjs.i; exports.withDataset = _chunk326ZSXGNcjs.k; exports.withFilters = _chunk326ZSXGNcjs.l; exports.withInitialFilters = _chunk326ZSXGNcjs.n; exports.withMap = _chunk326ZSXGNcjs.j; exports.withPrimaryDataset = _chunk326ZSXGNcjs.o; exports.withUrlSync = _chunk326ZSXGNcjs.m;
2
+ var _chunkCJPRUL76cjs = require('./chunk-CJPRUL76.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 it({children:e}){let{Toolbar:t}=_chunkCJPRUL76cjs.s.call(void 0, );return _jsxruntime.jsx.call(void 0, t,{children:e})}var _react = require('react');function yt(){let e=_chunkCJPRUL76cjs.u.call(void 0, ),t=_chunkCJPRUL76cjs.v.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 ft(e){let t=_chunkCJPRUL76cjs.u.call(void 0, ),r=_chunkCJPRUL76cjs.v.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 = _chunkCJPRUL76cjs.c; exports.FallbackPopup = _chunkCJPRUL76cjs.q; exports.FilterRegistry = _chunkCJPRUL76cjs.b; exports.ListingApp = _chunkCJPRUL76cjs.T; exports.ListingComponentsProvider = _chunkCJPRUL76cjs.r; exports.ListingConfig = _chunkCJPRUL76cjs.f; exports.ListingEngine = _chunkCJPRUL76cjs.g; exports.ListingEngineContext = _chunkCJPRUL76cjs.t; exports.ListingEventType = v; exports.ListingFilters = _chunkCJPRUL76cjs.x; exports.ListingList = _chunkCJPRUL76cjs.z; exports.ListingMap = _chunkCJPRUL76cjs.A; exports.ListingPagination = _chunkCJPRUL76cjs.B; exports.ListingProvider = _chunkCJPRUL76cjs.E; exports.ListingResultHeader = _chunkCJPRUL76cjs.C; exports.ListingStore = _chunkCJPRUL76cjs.a; exports.ListingToolbar = it; exports.MemoryHistoryPort = h; exports.PaginationMode = b; exports.TypedEmitter = _chunkCJPRUL76cjs.d; exports.UrlSyncController = f; exports.composeListingProviders = _chunkCJPRUL76cjs.h; exports.listingDefaultConfig = _chunkCJPRUL76cjs.e; exports.useListing = _chunkCJPRUL76cjs.u; exports.useListingComponents = _chunkCJPRUL76cjs.s; exports.useListingEvent = _chunkCJPRUL76cjs.D; exports.useListingFilters = _chunkCJPRUL76cjs.w; exports.useListingLayer = ft; exports.useListingMap = yt; exports.useListingResults = _chunkCJPRUL76cjs.y; exports.useListingState = _chunkCJPRUL76cjs.v; exports.withConfig = _chunkCJPRUL76cjs.i; exports.withDataset = _chunkCJPRUL76cjs.k; exports.withFilters = _chunkCJPRUL76cjs.l; exports.withInitialFilters = _chunkCJPRUL76cjs.n; exports.withInitialResults = _chunkCJPRUL76cjs.o; exports.withMap = _chunkCJPRUL76cjs.j; exports.withPrimaryDataset = _chunkCJPRUL76cjs.p; exports.withUrlSync = _chunkCJPRUL76cjs.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-D3pwkbog.cjs';
2
2
  export { c as EntityAdapter, d as MapInitOptions, e as MapOverlayHandle, f as PageRequest, R as RenderedLayer } from './map-provider.interface-D3pwkbog.cjs';
3
- import { P as PaginationMode, D as DatasetDefinition, I as IListingConfigOptions, F as FilterRegistry, a as IListingToolbarProps } from './listing-app-D1Y9PSCR.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-D1Y9PSCR.cjs';
3
+ import { P as PaginationMode, D as DatasetDefinition, I as IListingConfigOptions, F as FilterRegistry, a as IListingToolbarProps } from './listing-app-BtL-wU3p.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-BtL-wU3p.cjs';
5
5
  import * as react from 'react';
6
6
  import { ReactNode } from 'react';
7
7
 
@@ -27,9 +27,18 @@ interface ListingState<TEntity, TFilters> {
27
27
  layers: Record<string, boolean>;
28
28
  points: Readonly<Record<string, ReadonlyArray<MapPoint<unknown>>>>;
29
29
  }
30
- interface ListingStoreInit<TFilters> {
30
+ interface ListingStoreInit<TEntity, TFilters> {
31
31
  filters: TFilters;
32
32
  mode?: PaginationMode;
33
+ /**
34
+ * First page to start from, instead of the empty list a fetch would replace.
35
+ *
36
+ * Exists so a consumer that already has page one -- typically because it
37
+ * rendered on a server -- can hand it over and have the FIRST render carry
38
+ * real results. Without it the only way to fill the list is the adapter, and
39
+ * an adapter call cannot happen during a server render.
40
+ */
41
+ results?: Page<TEntity>;
33
42
  }
34
43
  type Listener$1 = () => void;
35
44
  type DeepReadonly<T> = T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>> : T extends object ? {
@@ -38,7 +47,7 @@ type DeepReadonly<T> = T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>> :
38
47
  declare class ListingStore<TEntity, TFilters> {
39
48
  private state;
40
49
  private readonly listeners;
41
- constructor(init: ListingStoreInit<TFilters>);
50
+ constructor(init: ListingStoreInit<TEntity, TFilters>);
42
51
  getState(): DeepReadonly<ListingState<TEntity, TFilters>>;
43
52
  setFilters(patch: Partial<TFilters>): void;
44
53
  setResults(page: Page<TEntity>): void;
@@ -135,6 +144,8 @@ interface ListingEngineOptions<TFilters> {
135
144
  config?: Partial<IListingConfigOptions>;
136
145
  map?: MapProvider;
137
146
  initialFilters?: TFilters;
147
+ /** First page to start from -- see `ListingStoreInit.results`. */
148
+ initialResults?: Page<unknown>;
138
149
  primaryDatasetId?: string;
139
150
  }
140
151
  /**
@@ -160,6 +171,7 @@ declare class ListingEngine<TEntity, TFilters> {
160
171
  readonly datasets: DatasetRegistry<unknown, TFilters>;
161
172
  readonly primaryDatasetId: string;
162
173
  private readonly store;
174
+ private disposed;
163
175
  private readonly emitter;
164
176
  private readonly config;
165
177
  private debounceTimer;
@@ -238,6 +250,10 @@ declare class ListingEngine<TEntity, TFilters> {
238
250
  toggleLayer(id: string): void;
239
251
  subscribe(cb: () => void): () => void;
240
252
  on(type: ListingEvent<TEntity, TFilters>['type'] | '*', cb: (e: ListingEvent<TEntity, TFilters>) => void): () => void;
253
+ /** True once `dispose()` has run. A disposed engine's emitter is dead, so it
254
+ * can never drive a UI again -- see `ListingProvider`, which uses this to
255
+ * tell a live engine from one Strict Mode already tore down. */
256
+ get isDisposed(): boolean;
241
257
  dispose(): void;
242
258
  private runQuery;
243
259
  private primaryDataset;
@@ -368,6 +384,7 @@ interface IListingProviderProps<TFilters> {
368
384
  map?: MapProvider;
369
385
  urlSync?: UrlSyncController<TFilters>;
370
386
  initialFilters?: TFilters;
387
+ initialResults?: Page<unknown>;
371
388
  primaryDatasetId?: string;
372
389
  }
373
390
  /**
@@ -382,6 +399,14 @@ declare const withDataset: <TEntity, TFilters>(def: DatasetDefinition<TEntity, T
382
399
  declare const withFilters: <TFilters>(fn: (reg: FilterRegistry<TFilters>) => void) => ListingProviderMod<TFilters>;
383
400
  declare const withUrlSync: <TFilters>(controller: UrlSyncController<TFilters>) => ListingProviderMod<TFilters>;
384
401
  declare const withInitialFilters: <TFilters>(filters: TFilters) => ListingProviderMod<TFilters>;
402
+ /**
403
+ * Seeds the first page so the initial render already has results.
404
+ *
405
+ * For server-rendered consumers: pair with `autoFetch={false}` (or the styled
406
+ * layout, which skips its mount fetch automatically when seeded) so the list
407
+ * hydrates from these rows instead of blanking and refetching.
408
+ */
409
+ declare const withInitialResults: <TFilters>(page: Page<unknown>) => ListingProviderMod<TFilters>;
385
410
  declare const withPrimaryDataset: <TFilters>(id: string) => ListingProviderMod<TFilters>;
386
411
 
387
412
  interface BrowserHistoryPortOptions {
@@ -897,6 +922,6 @@ interface IListingProviderComponentProps<TFilters> extends IListingProviderProps
897
922
  * </ListingProvider>
898
923
  * ```
899
924
  */
900
- declare function ListingProvider<TEntity, TFilters>(props: IListingProviderComponentProps<TFilters>): react.JSX.Element | null;
925
+ declare function ListingProvider<TEntity, TFilters>(props: IListingProviderComponentProps<TFilters>): react.JSX.Element;
901
926
 
902
- export { Bounds, BrowserHistoryPort, type BrowserHistoryPortOptions, DatasetDefinition, DatasetRegistry, EntityId, FilterRegistry, FitBoundsOptions, type HistoryPort, IListingConfigOptions, type IListingFiltersProps, type IListingMapProps, type IListingProviderProps, IListingToolbarProps, LatLng, ListingConfig, ListingEngine, ListingEngineContext, type ListingEngineOptions, type ListingEvent, ListingEventType, ListingFilters, ListingList, ListingMap, ListingPagination, ListingProvider, type ListingProviderMod, ListingResultHeader, type ListingState, ListingStore, type ListingStoreInit, ListingToolbar, MapHandle, MapPoint, MapProvider, MemoryHistoryPort, Page, PaginationMode, QueryParams, TypedEmitter, Unsubscribe, UrlSyncController, type UrlSyncEngine, type UrlSyncOptions, composeListingProviders, listingDefaultConfig, useListing, useListingEvent, useListingFilters, useListingLayer, useListingMap, useListingResults, useListingState, withConfig, withDataset, withFilters, withInitialFilters, withMap, withPrimaryDataset, withUrlSync };
927
+ export { Bounds, BrowserHistoryPort, type BrowserHistoryPortOptions, DatasetDefinition, DatasetRegistry, EntityId, FilterRegistry, FitBoundsOptions, type HistoryPort, IListingConfigOptions, type IListingFiltersProps, type IListingMapProps, type IListingProviderProps, IListingToolbarProps, LatLng, ListingConfig, ListingEngine, ListingEngineContext, type ListingEngineOptions, type ListingEvent, ListingEventType, ListingFilters, ListingList, ListingMap, ListingPagination, ListingProvider, type ListingProviderMod, ListingResultHeader, type ListingState, ListingStore, type ListingStoreInit, ListingToolbar, MapHandle, MapPoint, MapProvider, MemoryHistoryPort, Page, PaginationMode, QueryParams, TypedEmitter, Unsubscribe, UrlSyncController, type UrlSyncEngine, type UrlSyncOptions, composeListingProviders, listingDefaultConfig, useListing, useListingEvent, useListingFilters, useListingLayer, useListingMap, useListingResults, useListingState, withConfig, withDataset, withFilters, withInitialFilters, withInitialResults, withMap, withPrimaryDataset, withUrlSync };
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-D3pwkbog.js';
2
2
  export { c as EntityAdapter, d as MapInitOptions, e as MapOverlayHandle, f as PageRequest, R as RenderedLayer } from './map-provider.interface-D3pwkbog.js';
3
- import { P as PaginationMode, D as DatasetDefinition, I as IListingConfigOptions, F as FilterRegistry, a as IListingToolbarProps } from './listing-app-tRTA7DDI.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-tRTA7DDI.js';
3
+ import { P as PaginationMode, D as DatasetDefinition, I as IListingConfigOptions, F as FilterRegistry, a as IListingToolbarProps } from './listing-app-C4jHr8cd.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-C4jHr8cd.js';
5
5
  import * as react from 'react';
6
6
  import { ReactNode } from 'react';
7
7
 
@@ -27,9 +27,18 @@ interface ListingState<TEntity, TFilters> {
27
27
  layers: Record<string, boolean>;
28
28
  points: Readonly<Record<string, ReadonlyArray<MapPoint<unknown>>>>;
29
29
  }
30
- interface ListingStoreInit<TFilters> {
30
+ interface ListingStoreInit<TEntity, TFilters> {
31
31
  filters: TFilters;
32
32
  mode?: PaginationMode;
33
+ /**
34
+ * First page to start from, instead of the empty list a fetch would replace.
35
+ *
36
+ * Exists so a consumer that already has page one -- typically because it
37
+ * rendered on a server -- can hand it over and have the FIRST render carry
38
+ * real results. Without it the only way to fill the list is the adapter, and
39
+ * an adapter call cannot happen during a server render.
40
+ */
41
+ results?: Page<TEntity>;
33
42
  }
34
43
  type Listener$1 = () => void;
35
44
  type DeepReadonly<T> = T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>> : T extends object ? {
@@ -38,7 +47,7 @@ type DeepReadonly<T> = T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>> :
38
47
  declare class ListingStore<TEntity, TFilters> {
39
48
  private state;
40
49
  private readonly listeners;
41
- constructor(init: ListingStoreInit<TFilters>);
50
+ constructor(init: ListingStoreInit<TEntity, TFilters>);
42
51
  getState(): DeepReadonly<ListingState<TEntity, TFilters>>;
43
52
  setFilters(patch: Partial<TFilters>): void;
44
53
  setResults(page: Page<TEntity>): void;
@@ -135,6 +144,8 @@ interface ListingEngineOptions<TFilters> {
135
144
  config?: Partial<IListingConfigOptions>;
136
145
  map?: MapProvider;
137
146
  initialFilters?: TFilters;
147
+ /** First page to start from -- see `ListingStoreInit.results`. */
148
+ initialResults?: Page<unknown>;
138
149
  primaryDatasetId?: string;
139
150
  }
140
151
  /**
@@ -160,6 +171,7 @@ declare class ListingEngine<TEntity, TFilters> {
160
171
  readonly datasets: DatasetRegistry<unknown, TFilters>;
161
172
  readonly primaryDatasetId: string;
162
173
  private readonly store;
174
+ private disposed;
163
175
  private readonly emitter;
164
176
  private readonly config;
165
177
  private debounceTimer;
@@ -238,6 +250,10 @@ declare class ListingEngine<TEntity, TFilters> {
238
250
  toggleLayer(id: string): void;
239
251
  subscribe(cb: () => void): () => void;
240
252
  on(type: ListingEvent<TEntity, TFilters>['type'] | '*', cb: (e: ListingEvent<TEntity, TFilters>) => void): () => void;
253
+ /** True once `dispose()` has run. A disposed engine's emitter is dead, so it
254
+ * can never drive a UI again -- see `ListingProvider`, which uses this to
255
+ * tell a live engine from one Strict Mode already tore down. */
256
+ get isDisposed(): boolean;
241
257
  dispose(): void;
242
258
  private runQuery;
243
259
  private primaryDataset;
@@ -368,6 +384,7 @@ interface IListingProviderProps<TFilters> {
368
384
  map?: MapProvider;
369
385
  urlSync?: UrlSyncController<TFilters>;
370
386
  initialFilters?: TFilters;
387
+ initialResults?: Page<unknown>;
371
388
  primaryDatasetId?: string;
372
389
  }
373
390
  /**
@@ -382,6 +399,14 @@ declare const withDataset: <TEntity, TFilters>(def: DatasetDefinition<TEntity, T
382
399
  declare const withFilters: <TFilters>(fn: (reg: FilterRegistry<TFilters>) => void) => ListingProviderMod<TFilters>;
383
400
  declare const withUrlSync: <TFilters>(controller: UrlSyncController<TFilters>) => ListingProviderMod<TFilters>;
384
401
  declare const withInitialFilters: <TFilters>(filters: TFilters) => ListingProviderMod<TFilters>;
402
+ /**
403
+ * Seeds the first page so the initial render already has results.
404
+ *
405
+ * For server-rendered consumers: pair with `autoFetch={false}` (or the styled
406
+ * layout, which skips its mount fetch automatically when seeded) so the list
407
+ * hydrates from these rows instead of blanking and refetching.
408
+ */
409
+ declare const withInitialResults: <TFilters>(page: Page<unknown>) => ListingProviderMod<TFilters>;
385
410
  declare const withPrimaryDataset: <TFilters>(id: string) => ListingProviderMod<TFilters>;
386
411
 
387
412
  interface BrowserHistoryPortOptions {
@@ -897,6 +922,6 @@ interface IListingProviderComponentProps<TFilters> extends IListingProviderProps
897
922
  * </ListingProvider>
898
923
  * ```
899
924
  */
900
- declare function ListingProvider<TEntity, TFilters>(props: IListingProviderComponentProps<TFilters>): react.JSX.Element | null;
925
+ declare function ListingProvider<TEntity, TFilters>(props: IListingProviderComponentProps<TFilters>): react.JSX.Element;
901
926
 
902
- export { Bounds, BrowserHistoryPort, type BrowserHistoryPortOptions, DatasetDefinition, DatasetRegistry, EntityId, FilterRegistry, FitBoundsOptions, type HistoryPort, IListingConfigOptions, type IListingFiltersProps, type IListingMapProps, type IListingProviderProps, IListingToolbarProps, LatLng, ListingConfig, ListingEngine, ListingEngineContext, type ListingEngineOptions, type ListingEvent, ListingEventType, ListingFilters, ListingList, ListingMap, ListingPagination, ListingProvider, type ListingProviderMod, ListingResultHeader, type ListingState, ListingStore, type ListingStoreInit, ListingToolbar, MapHandle, MapPoint, MapProvider, MemoryHistoryPort, Page, PaginationMode, QueryParams, TypedEmitter, Unsubscribe, UrlSyncController, type UrlSyncEngine, type UrlSyncOptions, composeListingProviders, listingDefaultConfig, useListing, useListingEvent, useListingFilters, useListingLayer, useListingMap, useListingResults, useListingState, withConfig, withDataset, withFilters, withInitialFilters, withMap, withPrimaryDataset, withUrlSync };
927
+ export { Bounds, BrowserHistoryPort, type BrowserHistoryPortOptions, DatasetDefinition, DatasetRegistry, EntityId, FilterRegistry, FitBoundsOptions, type HistoryPort, IListingConfigOptions, type IListingFiltersProps, type IListingMapProps, type IListingProviderProps, IListingToolbarProps, LatLng, ListingConfig, ListingEngine, ListingEngineContext, type ListingEngineOptions, type ListingEvent, ListingEventType, ListingFilters, ListingList, ListingMap, ListingPagination, ListingProvider, type ListingProviderMod, ListingResultHeader, type ListingState, ListingStore, type ListingStoreInit, ListingToolbar, MapHandle, MapPoint, MapProvider, MemoryHistoryPort, Page, PaginationMode, QueryParams, TypedEmitter, Unsubscribe, UrlSyncController, type UrlSyncEngine, type UrlSyncOptions, composeListingProviders, listingDefaultConfig, useListing, useListingEvent, useListingFilters, useListingLayer, useListingMap, useListingResults, useListingState, withConfig, withDataset, withFilters, withInitialFilters, withInitialResults, withMap, withPrimaryDataset, withUrlSync };
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-7IG7X4NK.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,E as Z,T 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 j,s as d,t as A,u,v as y,w as D,x as J,y as K,z as N}from"./chunk-SEXAGR6S.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 it({children:e}){let{Toolbar:t}=d();return w(t,{children:e})}import{useCallback as a}from"react";function yt(){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 ft(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,$ as FallbackPopup,x as FilterRegistry,P as ListingApp,j as ListingComponentsProvider,H as ListingConfig,E as ListingEngine,A as ListingEngineContext,v as ListingEventType,J as ListingFilters,N as ListingList,V as ListingMap,W as ListingPagination,Z as ListingProvider,X as ListingResultHeader,Q as ListingStore,it 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,Y as useListingEvent,D as useListingFilters,ft as useListingLayer,yt as useListingMap,K as useListingResults,y as useListingState,q as withConfig,C as withDataset,I as withFilters,z as withInitialFilters,G as withInitialResults,B as withMap,R as withPrimaryDataset,U as withUrlSync};
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentType, ReactNode } from 'react';
3
- import { c as EntityAdapter, M as MapPoint, L as LatLng, a as MapProvider } from './map-provider.interface-D3pwkbog.js';
3
+ import { c as EntityAdapter, M as MapPoint, L as LatLng, a as MapProvider, P as Page } from './map-provider.interface-D3pwkbog.cjs';
4
4
 
5
5
  interface FilterControlProps<TValue> {
6
6
  value: TValue;
@@ -242,6 +242,14 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
242
242
  mapZoom?: number;
243
243
  /** Forwarded verbatim to `<ListingMap mapControls={mapControls} />` -- see that prop's doc comment. */
244
244
  mapControls?: ReactNode;
245
+ /**
246
+ * A map WAS asked for but its provider has not resolved yet.
247
+ *
248
+ * Only `ListingApp` knows this: it resolves an API key into a provider
249
+ * through a dynamic import. Without it the map pane cannot tell "this app
250
+ * has no map" from "the map is still loading", and says the former.
251
+ */
252
+ mapPending?: boolean;
245
253
  /** Forwarded verbatim to `<ListingMap onMapReady={onMapReady} />` -- the native-map escape hatch; see that prop's doc comment. */
246
254
  onMapReady?: (map: unknown) => void;
247
255
  /**
@@ -324,7 +332,7 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
324
332
  * default -- pass `autoFetch={false}`
325
333
  * to opt out and drive the first fetch yourself.
326
334
  */
327
- declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, resultsSlot, toolbarEnd, mobileAction, autoFetch, initialPage, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, onMapReady, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
335
+ declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, resultsSlot, toolbarEnd, mobileAction, autoFetch, initialPage, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, mapPending, onMapReady, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
328
336
 
329
337
  /**
330
338
  * Two-shape `map` prop: pass a ready `MapProvider`, or the `{ apiKey, mapId? }`
@@ -375,6 +383,16 @@ interface ListingAppProps<TFilters> {
375
383
  * reads `window.location` itself, it only accepts filters as a prop.
376
384
  */
377
385
  initialFilters?: TFilters;
386
+ /**
387
+ * First page of results, so the very first render already has rows.
388
+ *
389
+ * For server rendering: hand over the page the server already fetched and
390
+ * the list renders it immediately -- on the server, and again on the client
391
+ * as hydration -- instead of blanking while an adapter call goes out. The
392
+ * mount fetch is skipped when this is set, so the seeded rows are not
393
+ * replaced a moment later by an identical request.
394
+ */
395
+ initialResults?: Page<unknown>;
378
396
  /**
379
397
  * EVENT OUT: fires with the engine's current filters (`TFilters`, not the
380
398
  * store's `DeepReadonly` wrapper) every time `ListingEventType.FiltersChanged`
@@ -468,6 +486,6 @@ interface ListingAppProps<TFilters> {
468
486
  * a React Router `setSearchParams`, etc. all work identically from the
469
487
  * consumer's side) instead of assuming `window.history` is the right target.
470
488
  */
471
- declare function ListingApp<TEntity, TFilters>(props: ListingAppProps<TFilters>): react.JSX.Element | null;
489
+ declare function ListingApp<TEntity, TFilters>(props: ListingAppProps<TFilters>): react.JSX.Element;
472
490
 
473
491
  export { BottomNav as B, type ClusterOptions as C, type DatasetDefinition as D, FilterRegistry as F, type IListingConfigOptions as I, ListingApp as L, type MarkerRenderer as M, PaginationMode as P, StyledListingLayout as S, type IListingToolbarProps as a, FallbackPopup as b, type FilterControlProps as c, type FilterDefinition as d, type IListingBottomNavProps as e, type IListingCardProps as f, type IListingComponents as g, type IListingEmptyProps as h, type IListingFilterPanelProps as i, type IListingLoadingProps as j, type IListingMarkerProps as k, type IListingPopupProps as l, type IListingResultHeaderProps as m, type IListingSearchProps as n, type IListingSidebarProps as o, type ListingAppProps as p, ListingComponentsProvider as q, type MobileSheetFooterContext as r, type BottomNavView as s, type IBottomNavAction as t, useListingComponents as u, type IBottomNavProps as v, type IStyledListingLayoutProps as w, type ListingAppMapProp as x };
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentType, ReactNode } from 'react';
3
- import { c as EntityAdapter, M as MapPoint, L as LatLng, a as MapProvider } from './map-provider.interface-D3pwkbog.cjs';
3
+ import { c as EntityAdapter, M as MapPoint, L as LatLng, a as MapProvider, P as Page } from './map-provider.interface-D3pwkbog.js';
4
4
 
5
5
  interface FilterControlProps<TValue> {
6
6
  value: TValue;
@@ -242,6 +242,14 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
242
242
  mapZoom?: number;
243
243
  /** Forwarded verbatim to `<ListingMap mapControls={mapControls} />` -- see that prop's doc comment. */
244
244
  mapControls?: ReactNode;
245
+ /**
246
+ * A map WAS asked for but its provider has not resolved yet.
247
+ *
248
+ * Only `ListingApp` knows this: it resolves an API key into a provider
249
+ * through a dynamic import. Without it the map pane cannot tell "this app
250
+ * has no map" from "the map is still loading", and says the former.
251
+ */
252
+ mapPending?: boolean;
245
253
  /** Forwarded verbatim to `<ListingMap onMapReady={onMapReady} />` -- the native-map escape hatch; see that prop's doc comment. */
246
254
  onMapReady?: (map: unknown) => void;
247
255
  /**
@@ -324,7 +332,7 @@ interface IStyledListingLayoutProps<TFilters = unknown> {
324
332
  * default -- pass `autoFetch={false}`
325
333
  * to opt out and drive the first fetch yourself.
326
334
  */
327
- declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, resultsSlot, toolbarEnd, mobileAction, autoFetch, initialPage, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, onMapReady, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
335
+ declare function StyledListingLayout<TFilters = unknown>({ search, filterBarStart, resultsSlot, toolbarEnd, mobileAction, autoFetch, initialPage, hasMap: hasMapProp, mapCenter, mapZoom, mapControls, mapPending, onMapReady, mobileSheetFooter, className, }: IStyledListingLayoutProps<TFilters>): react.JSX.Element;
328
336
 
329
337
  /**
330
338
  * Two-shape `map` prop: pass a ready `MapProvider`, or the `{ apiKey, mapId? }`
@@ -375,6 +383,16 @@ interface ListingAppProps<TFilters> {
375
383
  * reads `window.location` itself, it only accepts filters as a prop.
376
384
  */
377
385
  initialFilters?: TFilters;
386
+ /**
387
+ * First page of results, so the very first render already has rows.
388
+ *
389
+ * For server rendering: hand over the page the server already fetched and
390
+ * the list renders it immediately -- on the server, and again on the client
391
+ * as hydration -- instead of blanking while an adapter call goes out. The
392
+ * mount fetch is skipped when this is set, so the seeded rows are not
393
+ * replaced a moment later by an identical request.
394
+ */
395
+ initialResults?: Page<unknown>;
378
396
  /**
379
397
  * EVENT OUT: fires with the engine's current filters (`TFilters`, not the
380
398
  * store's `DeepReadonly` wrapper) every time `ListingEventType.FiltersChanged`
@@ -468,6 +486,6 @@ interface ListingAppProps<TFilters> {
468
486
  * a React Router `setSearchParams`, etc. all work identically from the
469
487
  * consumer's side) instead of assuming `window.history` is the right target.
470
488
  */
471
- declare function ListingApp<TEntity, TFilters>(props: ListingAppProps<TFilters>): react.JSX.Element | null;
489
+ declare function ListingApp<TEntity, TFilters>(props: ListingAppProps<TFilters>): react.JSX.Element;
472
490
 
473
491
  export { BottomNav as B, type ClusterOptions as C, type DatasetDefinition as D, FilterRegistry as F, type IListingConfigOptions as I, ListingApp as L, type MarkerRenderer as M, PaginationMode as P, StyledListingLayout as S, type IListingToolbarProps as a, FallbackPopup as b, type FilterControlProps as c, type FilterDefinition as d, type IListingBottomNavProps as e, type IListingCardProps as f, type IListingComponents as g, type IListingEmptyProps as h, type IListingFilterPanelProps as i, type IListingLoadingProps as j, type IListingMarkerProps as k, type IListingPopupProps as l, type IListingResultHeaderProps as m, type IListingSearchProps as n, type IListingSidebarProps as o, type ListingAppProps as p, ListingComponentsProvider as q, type MobileSheetFooterContext as r, type BottomNavView as s, type IBottomNavAction as t, useListingComponents as u, type IBottomNavProps as v, type IStyledListingLayoutProps as w, type ListingAppMapProp as x };
@@ -1,2 +1,2 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
- var _chunk326ZSXGNcjs = require('../chunk-326ZSXGN.cjs');var _jsxruntime = require('react/jsx-runtime');function L({children:o}){return _jsxruntime.jsx.call(void 0, _chunk326ZSXGNcjs.q,{..._chunk326ZSXGNcjs.P,children:o})}exports.BottomNav = _chunk326ZSXGNcjs.E; exports.BottomSheet = _chunk326ZSXGNcjs.Q; exports.ListingApp = _chunk326ZSXGNcjs.S; exports.StyledCard = _chunk326ZSXGNcjs.F; exports.StyledComponentsProviderWithDefaults = L; exports.StyledEmpty = _chunk326ZSXGNcjs.G; exports.StyledFilterPanel = _chunk326ZSXGNcjs.H; exports.StyledListingLayout = _chunk326ZSXGNcjs.R; exports.StyledLoading = _chunk326ZSXGNcjs.I; exports.StyledMarker = _chunk326ZSXGNcjs.J; exports.StyledPopup = _chunk326ZSXGNcjs.K; exports.StyledResultHeader = _chunk326ZSXGNcjs.L; exports.StyledSearch = _chunk326ZSXGNcjs.M; exports.StyledSidebar = _chunk326ZSXGNcjs.N; exports.StyledToolbar = _chunk326ZSXGNcjs.O; exports.styledDefaultComponents = _chunk326ZSXGNcjs.P;
2
+ var _chunkCJPRUL76cjs = require('../chunk-CJPRUL76.cjs');var _jsxruntime = require('react/jsx-runtime');function L({children:o}){return _jsxruntime.jsx.call(void 0, _chunkCJPRUL76cjs.r,{..._chunkCJPRUL76cjs.Q,children:o})}exports.BottomNav = _chunkCJPRUL76cjs.F; exports.BottomSheet = _chunkCJPRUL76cjs.R; exports.ListingApp = _chunkCJPRUL76cjs.T; exports.StyledCard = _chunkCJPRUL76cjs.G; exports.StyledComponentsProviderWithDefaults = L; exports.StyledEmpty = _chunkCJPRUL76cjs.H; exports.StyledFilterPanel = _chunkCJPRUL76cjs.I; exports.StyledListingLayout = _chunkCJPRUL76cjs.S; exports.StyledLoading = _chunkCJPRUL76cjs.J; exports.StyledMarker = _chunkCJPRUL76cjs.K; exports.StyledPopup = _chunkCJPRUL76cjs.L; exports.StyledResultHeader = _chunkCJPRUL76cjs.M; exports.StyledSearch = _chunkCJPRUL76cjs.N; exports.StyledSidebar = _chunkCJPRUL76cjs.O; exports.StyledToolbar = _chunkCJPRUL76cjs.P; exports.styledDefaultComponents = _chunkCJPRUL76cjs.Q;
@@ -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-D1Y9PSCR.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-D1Y9PSCR.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-BtL-wU3p.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-BtL-wU3p.cjs';
5
5
  import '../map-provider.interface-D3pwkbog.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-tRTA7DDI.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-tRTA7DDI.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-C4jHr8cd.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-C4jHr8cd.js';
5
5
  import '../map-provider.interface-D3pwkbog.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-7IG7X4NK.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{F as r,G as p,H as i,I as y,J as d,K as l,L as n,M as m,N as s,O as a,P as S,Q as t,R as f,S as P,T as u,r as e}from"../chunk-SEXAGR6S.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/dist/styles.css CHANGED
@@ -1140,3 +1140,11 @@
1140
1140
  animation: none;
1141
1141
  }
1142
1142
  }
1143
+
1144
+ /* The map's place while its provider resolves. Deliberately blank -- it is a
1145
+ sub-second gap on a working map, and any message there would be wrong by the
1146
+ time it was read. Sized so the pane does not collapse and reflow the split. */
1147
+ .rle-map-pending {
1148
+ width: 100%;
1149
+ height: 100%;
1150
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-listing-engine",
3
- "version": "0.11.0",
3
+ "version": "0.12.1",
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": [
@@ -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 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(o=>this.defs.has(o));n.forEach((o,s)=>{this.defs.get(o).order=s});let r=new Set(n);return i.filter(o=>!r.has(o.key)).forEach((o,s)=>{o.order=n.length+s}),this}list(){return[...this.defs.values()].sort((e,i)=>e.order-i.order)}has(e){return this.defs.has(e)}toFilters(e){return this.list().filter(n=>Object.hasOwn(e,n.key)).map(n=>n.toParams(e[n.key])).reduce((n,r)=>({...n,...r}),{})}activeKeys(e){return this.list().filter(i=>_optionalChain([i, 'access', _2 => _2.isActive, 'optionalCall', _3 => _3(e)])).map(i=>i.key)}clearedParams(){return this.list().reduce((e,i)=>Object.assign(e,i.toParams(i.fromParams({}))),{})}}, _class2);var te= (_class3 =class{constructor() { _class3.prototype.__init3.call(this); }__init3() {this.defs=new Map}add(e){if(this.defs.has(e.id))throw new Error(`DatasetRegistry: dataset "${e.id}" is already registered`);return this.defs.set(e.id,{...e}),this}get(e){return this.defs.get(e)}has(e){return this.defs.has(e)}list(){return[...this.defs.values()]}visibleIds(){return this.list().filter(e=>_optionalChain([e, 'access', _4 => _4.visible, 'optionalCall', _5 => _5()])!==!1).map(e=>e.id)}}, _class3);var ie= (_class4 =class{constructor() { _class4.prototype.__init4.call(this); }__init4() {this.map=new Map}dispose(){this.map.clear()}emit(e){let i=this.map.get(e.type);if(i)for(let r of[...i])r(e);let n=this.map.get("*");if(n)for(let r of[...n])r(e)}on(e,i){let n=this.map.get(e);return n||(n=new Set,this.map.set(e,n)),n.add(i),()=>{n.delete(i)}}}, _class4);var Ae={pagination:"paged",pageSize:20,debounceMs:250};var ne=class{constructor(e){this.options=Object.freeze({...Ae,...e})}};var re= (_class5 =class{__init5() {this.emitter=new ie}__init6() {this.debounceTimer=null}__init7() {this.debounceResolve=null}__init8() {this.queryToken=0}__init9() {this.pointsToken=0}__init10() {this.mapHandle=null}constructor(e){;_class5.prototype.__init5.call(this);_class5.prototype.__init6.call(this);_class5.prototype.__init7.call(this);_class5.prototype.__init8.call(this);_class5.prototype.__init9.call(this);_class5.prototype.__init10.call(this);this.datasets=e.datasets,this.filters=_nullishCoalesce(e.filters, () => (new $)),this.map=e.map,this.config=new ne(e.config);let i=_nullishCoalesce(e.primaryDatasetId, () => (_optionalChain([this, 'access', _6 => _6.datasets, 'access', _7 => _7.list, 'call', _8 => _8(), 'access', _9 => _9[0], 'optionalAccess', _10 => _10.id])));if(i==null||!this.datasets.has(i))throw new Error(`ListingEngine: primary dataset "${_nullishCoalesce(i, () => (""))}" is not registered \u2014 pass a valid primaryDatasetId or register at least one dataset`);this.primaryDatasetId=i,this.store=new ee({filters:_nullishCoalesce(e.initialFilters, () => ({})),mode:this.config.options.pagination})}get state(){return this.store.getState()}get options(){return this.config.options}applyFilters(e){this.store.setFilters(e),this.emitter.emit({type:"FiltersChanged",filters:this.currentFilters()}),this.clearDebounce();let i=++this.queryToken,n=this.config.options.debounceMs;return n<=0?this.runQuery(i):new Promise(r=>{this.debounceResolve=r,this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.debounceResolve=null,r(this.runQuery(i))},n)})}async loadPage(){let e=this.state.results.nextCursor;if(e===null)return;let i=++this.queryToken,n=this.primaryDataset();this.store.setLoading(!0);try{let r=await n.adapter.list(this.currentFilters(),{cursor:e,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.config.options.pagination==="infinite"?this.store.appendResults(r):this.store.setResults(r),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async goToPage(e){if(e<0)return;let i=++this.queryToken,n=this.primaryDataset();this.store.setLoading(!0);try{let r=await n.adapter.list(this.currentFilters(),{offset:e*this.config.options.pageSize,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.store.setResults(r),this.store.setPageIndex(e),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async loadPoints(e){this.store.setBounds(e),this.emitter.emit({type:"BoundsChanged",bounds:e});let i=this.currentFilters(),n=++this.pointsToken;await Promise.allSettled(this.datasets.visibleIds().map(async r=>{let o=this.datasets.get(r);if(!o)return;let s=await o.adapter.getPoints(i,e);n===this.pointsToken&&this.store.setPoints(r,s)}))}setMapHandle(e){this.mapHandle=e}fitBounds(e,i){!this.map||!this.mapHandle||this.map.fitBounds(this.mapHandle,e,i)}selectPoint(e,i){this.store.setSelection(i);let n=_optionalChain([this, 'access', _11 => _11.state, 'access', _12 => _12.points, 'access', _13 => _13[e], 'optionalAccess', _14 => _14.find, 'call', _15 => _15(r=>r.id===i)]);n&&this.emitter.emit({type:"PointClicked",datasetId:e,id:n.id,entity:n.entity})}setHovered(e,i){this.store.setHovered(i)}toggleLayer(e){let n=!(_nullishCoalesce(this.state.layers[e], () => (!0)));this.store.setLayerVisible(e,n),this.emitter.emit({type:"LayerToggled",datasetId:e,visible:n})}subscribe(e){return this.store.subscribe(e)}on(e,i){return this.emitter.on(e,i)}dispose(){this.clearDebounce(),this.emitter.dispose(),this.mapHandle=null}async runQuery(e){if(e!==this.queryToken)return;let i=this.primaryDataset();this.store.setLoading(!0);try{let n=await i.adapter.list(this.currentFilters(),{cursor:null,limit:this.config.options.pageSize});if(e!==this.queryToken)return;this.store.setResults(n),this.store.setPageIndex(0),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:n.items.length})}finally{e===this.queryToken&&this.store.setLoading(!1)}}primaryDataset(){return this.datasets.get(this.primaryDatasetId)}currentFilters(){return this.store.getState().filters}clearDebounce(){this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.debounceResolve!==null&&(this.debounceResolve(),this.debounceResolve=null)}}, _class5);function ze(...t){let e={config:{},filters:new $,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)},Oi= exports.m =t=>e=>{e.urlSync=t},$e= exports.n =t=>e=>{e.initialFilters=t},_i= exports.o =t=>e=>{e.primaryDatasetId=t};var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function St(t){return String(_nullishCoalesce(_optionalChain([t, 'optionalAccess', _16 => _16.title]), () => ("")))}var kt=({item:t})=>_jsxruntime.jsx.call(void 0, "div",{children:St(t)}),Ct=()=>_jsxruntime.jsx.call(void 0, "div",{}),fe= exports.p =()=>_jsxruntime.jsx.call(void 0, "div",{}),wt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),It=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Et=({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"))}),xt=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status",children:"No results"}),Nt=()=>_jsxruntime.jsx.call(void 0, "div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),Rt=({count:t})=>_jsxruntime.jsxs.call(void 0, "div",{children:[t," results"]}),Mt=({children:t})=>_jsxruntime.jsx.call(void 0, "div",{children:t}),Dt=({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:Dt,Card:kt,Marker:Ct,Popup:fe,Sidebar:wt,FilterPanel:It,Search:Et,Empty:xt,Loading:Nt,ResultHeader:Rt,Toolbar:Mt},We=_react.createContext.call(void 0, k);function je(t){let{BottomNav:e,Card:i,Marker:n,Popup:r,Sidebar:o,FilterPanel:s,Search:a,Empty:p,Loading:d,ResultHeader:l,Toolbar:m,children:y}=t,x={BottomNav:_nullishCoalesce(e, () => (k.BottomNav)),Card:_nullishCoalesce(i, () => (k.Card)),Marker:_nullishCoalesce(n, () => (k.Marker)),Popup:_nullishCoalesce(r, () => (k.Popup)),Sidebar:_nullishCoalesce(o, () => (k.Sidebar)),FilterPanel:_nullishCoalesce(s, () => (k.FilterPanel)),Search:_nullishCoalesce(a, () => (k.Search)),Empty:_nullishCoalesce(p, () => (k.Empty)),Loading:_nullishCoalesce(d, () => (k.Loading)),ResultHeader:_nullishCoalesce(l, () => (k.ResultHeader)),Toolbar:_nullishCoalesce(m, () => (k.Toolbar))};return _jsxruntime.jsx.call(void 0, We.Provider,{value:x,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,o)=>t.applyFilters({[r]:o}),[t]);return{filters:e.filters,set:i,setField:n}}function ye({className:t,groupClassName:e,hideLabels:i,draft:n,onDraftChange:r}={}){let o=h(),{FilterPanel:s}=w(),{filters:a}=oe(),p=n!==void 0&&r!==void 0,d=p?n:a;return _jsxruntime.jsx.call(void 0, s,{children:_jsxruntime.jsx.call(void 0, "div",{className:_nullishCoalesce(t, () => ("space-y-5")),children:o.filters.list().map(l=>{if(typeof l.render=="string")return _jsxruntime.jsx.call(void 0, "div",{"data-filter":l.key,className:e},l.key);let m=l.render;return _jsxruntime.jsxs.call(void 0, "div",{className:e,children:[l.label&&!i&&_jsxruntime.jsx.call(void 0, "div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:l.label}),_jsxruntime.jsx.call(void 0, m,{value:l.fromParams(d),onChange:y=>p?r(l.toParams(y)):void o.applyFilters(l.toParams(y))})]},l.key)})})})}function W(){return I().results}function At(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:o,Empty:s,Loading:a}=w();return n.loading&&i.length===0?_jsxruntime.jsx.call(void 0, a,{}):i.length===0?_jsxruntime.jsx.call(void 0, s,{}):_jsxruntime.jsx.call(void 0, "div",{role:"list",className:t,children:i.map((p,d)=>{let l=At(p,d);return _jsxruntime.jsx.call(void 0, o,{item:p,selected:r===l,onSelect:()=>e.selectPoint(e.primaryDatasetId,l)},l)})})}var _reactdom = require('react-dom');var Ut={west:-179.9,south:-85,east:179.9,north:85},Ye=.1,et=.02;function Kt(t){if(t.length===0)return null;let e=t[0].lng,i=t[0].lng,n=t[0].lat,r=t[0].lat;for(let{lat:a,lng:p}of t)p<e&&(e=p),p>i&&(i=p),a<n&&(n=a),a>r&&(r=a);let o=r>n?(r-n)*Ye:et,s=i>e?(i-e)*Ye:et;return{west:e-s,east:i+s,south:n-o,north:r+o}}function it(t){let{center:e,zoom:i,fallback:n,mapControls:r,onMapReady:o}=t,s=h(),a=I(),p=_react.useRef.call(void 0, o);p.current=o;let d=_react.useRef.call(void 0, null),l=_react.useRef.call(void 0, null),m=_react.useRef.call(void 0, null),[y,x]=_react.useState.call(void 0, !1),F=_react.useRef.call(void 0, !1),A=_react.useRef.call(void 0, !1),z=_react.useRef.call(void 0, !1),u=s.map;_react.useEffect.call(void 0, ()=>{let v=m.current;if(!u||!v)return;let b=[];for(let g of Object.keys(a.points)){if(a.layers[g]===!1)continue;let f=s.datasets.get(g),S=_nullishCoalesce(a.points[g], () => ([])),_={id:g,markers:S.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)};b.push(u.renderLayer(v,_))}return()=>{b.forEach(g=>g())}},[s,u,y,a.points,a.layers]),_react.useEffect.call(void 0, ()=>{if(!d.current||!u)return;let v=d.current,b=!1,g=null;return(async()=>{let f=await u.mount(v,{center:e,zoom:i,fullscreenTarget:_nullishCoalesce(l.current, () => (void 0))});if(b){u.destroy(f);return}m.current=f,s.setMapHandle(f),g=u.onBoundsChange(f,S=>{z.current?z.current=!1:A.current=!0,s.loadPoints(S)}),x(!0),_optionalChain([p, 'access', _24 => _24.current, 'optionalCall', _25 => _25(_nullishCoalesce(f.nativeMap, () => (f.raw)))]),s.loadPoints(Ut)})(),()=>{b=!0,_optionalChain([g, 'optionalCall', _26 => _26()]),m.current&&(u.destroy(m.current),m.current=null,s.setMapHandle(null),_optionalChain([p, 'access', _27 => _27.current, 'optionalCall', _28 => _28(null)])),x(!1)}},[s,u]),_react.useEffect.call(void 0, ()=>{let v=m.current;if(!u||!v||e||F.current||A.current)return;let b=[];for(let f of Object.keys(a.points))if(a.layers[f]!==!1)for(let S of _nullishCoalesce(a.points[f], () => ([])))b.push(S.position);let g=Kt(b);g&&(F.current=!0,z.current=!0,u.fitBounds(v,g))},[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:R}=w(),U=R!==fe,P=_nullishCoalesce(a.points[s.primaryDatasetId], () => ([])),T=a.selection!=null?P.find(v=>v.id===a.selection):void 0,[O,q]=_react.useState.call(void 0, null),M=_react.useRef.call(void 0, T);return M.current=T,_react.useEffect.call(void 0, ()=>{let v=m.current;if(!u||!v||!U)return;let b=M.current;if(!b)return;let g=u.mountOverlay(b.position);q({entity:b.entity,position:b.position,container:g.container});let f=()=>s.selectPoint(s.primaryDatasetId,null),S=N=>{N.key==="Escape"&&f()};document.addEventListener("keydown",S);let _=u.onMapClick(f);return()=>{document.removeEventListener("keydown",S),_(),g.unmount(),q(null)}},[s,u,y,a.selection,U]),_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,U&&O?_reactdom.createPortal.call(void 0, _jsxruntime.jsx.call(void 0, R,{entity:O.entity,onClose:()=>s.selectPoint(s.primaryDatasetId,null)}),O.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 Vt(t,e){if(t<=7)return Array.from({length:t},(o,s)=>s+1);let i=Math.max(2,e-1),n=Math.min(t-1,e+1),r=[1];i>2&&r.push(he);for(let o=i;o<=n;o+=1)r.push(o);return n<t-1&&r.push(he),r.push(t),r}function nt(){let t=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,o=r+1,s=e.total!=null?Math.ceil(e.total/n):null,a=s!=null?o<s:e.nextCursor!=null||e.items.length>=n;if(s!=null?s<=1:r===0&&!a)return null;let p=d=>()=>{t.goToPage(d)};return _jsxruntime.jsxs.call(void 0, "nav",{className:"rle-pagination","aria-label":"Pagination",children:[_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Previous page",disabled:i.loading||r===0,onClick:p(r-1),children:"\u2039"}),s!=null&&Vt(s,o).map((d,l)=>d===he?_jsxruntime.jsx.call(void 0, "span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${l}`):_jsxruntime.jsx.call(void 0, "button",{type:"button",className:d===o?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${d}`,"aria-current":d===o?"page":void 0,disabled:i.loading,onClick:p(d-1),children:d},d)),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-page-btn rle-page-btn--nav","aria-label":"Next page",disabled:i.loading||!a,onClick:p(r+1),children:"\u203A"})]})}function rt(){let{items:t,total:e}=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,o]=_react.useState.call(void 0, null);return _react.useEffect.call(void 0, ()=>{let s=new re({datasets:n.datasets,filters:n.filters,config:n.config,map:n.map,initialFilters:n.initialFilters,primaryDatasetId:n.primaryDatasetId});return n.urlSync&&n.urlSync.start(s),o(s),()=>{n.urlSync&&n.urlSync.stop(),s.dispose(),o(a=>a===s?null:a)}},[n]),r?_jsxruntime.jsx.call(void 0, se.Provider,{value:r,children:e}):null}function lt({view:t,onViewChange:e}){return _jsxruntime.jsx.call(void 0, "nav",{className:"rle-bottom-nav","aria-label":"Listing navigation",children:_jsxruntime.jsxs.call(void 0, "div",{className:"rle-viewtoggle",role:"group","aria-label":"View",children:[_jsxruntime.jsxs.call(void 0, "button",{type:"button",className:`rle-viewtoggle__btn${t==="list"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="list",onClick:()=>e("list"),children:[_jsxruntime.jsx.call(void 0, Zt,{}),"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, Xt,{}),"Map"]})]})})}function Zt(){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 Xt(){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 Jt(t){return t?"rle-card rle-card--selected":"rle-card"}function be({item:t,selected:e,onSelect:i}){let n=_nullishCoalesce(t, () => ({})),r=Jt(e),o=_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[n.imageUrl?_jsxruntime.jsx.call(void 0, "img",{src:n.imageUrl,alt:_nullishCoalesce(n.title, () => ("")),className:"rle-card-media"}):_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{className:"rle-card-body",children:[n.title&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-title",children:n.title}),n.subtitle&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-address",children:n.subtitle}),n.badge&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-card-info",children:_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-info-item",children:n.badge})}),n.price!=null&&_jsxruntime.jsx.call(void 0, "span",{className:"rle-card-price",children:j(n.price)})]})]});return i?_jsxruntime.jsx.call(void 0, "button",{type:"button",onClick:i,"aria-pressed":_nullishCoalesce(e, () => (!1)),className:r,children:o}):_jsxruntime.jsx.call(void 0, "article",{className:r,children:o})}function Le(t){return _jsxruntime.jsxs.call(void 0, "div",{role:"status",className:"rle-empty",children:[_jsxruntime.jsxs.call(void 0, "svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",className:"rle-empty-icon","aria-hidden":"true",children:[_jsxruntime.jsx.call(void 0, "circle",{cx:"11",cy:"11",r:"7"}),_jsxruntime.jsx.call(void 0, "path",{d:"m21 21-4.3-4.3"})]}),_jsxruntime.jsx.call(void 0, "p",{className:"rle-empty-title",children:"No results"}),_jsxruntime.jsx.call(void 0, "p",{className:"rle-empty-hint",children:"Try adjusting your filters or search terms."})]})}function 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 ke({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 Ce({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:ke,Sidebar:Ie,FilterPanel:Pe,Search:we,Empty:Le,Loading:Te,ResultHeader:Ce,Toolbar:Ee};function mt({open:t,onOpenChange:e,title:i,children:n,footer:r}){let o=_react.useRef.call(void 0, null),[s,a]=_react.useState.call(void 0, !1),[p,d]=_react.useState.call(void 0, !1);return _react.useEffect.call(void 0, ()=>{if(!t){d(!1),a(!1);return}a(!0);let l=requestAnimationFrame(()=>d(!0));return()=>cancelAnimationFrame(l)},[t]),_react.useEffect.call(void 0, ()=>{if(!s)return;let l=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=l}},[s]),_react.useEffect.call(void 0, ()=>{if(!s)return;_optionalChain([o, 'access', _31 => _31.current, 'optionalAccess', _32 => _32.focus, 'call', _33 => _33()]);function l(m){m.key==="Escape"&&e(!1)}return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[s,e]),!s||typeof document>"u"?null:_reactdom.createPortal.call(void 0, _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, "div",{className:`rle-sheet-backdrop${p?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{ref:o,className:`rle-sheet${p?" rle-sheet--open":""}`,role:"dialog","aria-modal":"true","aria-label":i,tabIndex:-1,children:[_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__handle","aria-hidden":"true"}),_jsxruntime.jsxs.call(void 0, "div",{className:"rle-sheet__header",children:[i&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-sheet__title",children:i}),_jsxruntime.jsx.call(void 0, "button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:_jsxruntime.jsx.call(void 0, di,{})})]}),_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 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",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, ui,{}),_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, ci,{})))})]})}function ui(){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 ci(){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 mi=_jsxruntime.jsx.call(void 0, "div",{className:"rle-empty",children:"Map unavailable"});function gi(){let t=_react.useRef.call(void 0, null),[e,i]=_react.useState.call(void 0, !0),[n,r]=_react.useState.call(void 0, !0);return _react.useEffect.call(void 0, ()=>{let o=t.current;if(!o)return;let s=()=>{let{clientWidth:m,scrollLeft:y,scrollWidth:x}=o;i(y<=0),r(y+m>=x-1)},a=0,p=()=>{a||(a=requestAnimationFrame(()=>{a=0,s()}))};s(),o.addEventListener("scroll",s,{passive:!0});let d,l;return typeof ResizeObserver<"u"&&(d=new ResizeObserver(s),d.observe(o)),typeof MutationObserver<"u"&&(l=new MutationObserver(p),l.observe(o,{characterData:!0,childList:!0,subtree:!0})),()=>{o.removeEventListener("scroll",s),_optionalChain([d, 'optionalAccess', _34 => _34.disconnect, 'call', _35 => _35()]),_optionalChain([l, 'optionalAccess', _36 => _36.disconnect, 'call', _37 => _37()]),a&&cancelAnimationFrame(a)}},[]),{atEnd:n,atStart:e,ref:t}}function fi(t,e){if(t===e)return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;let i=t,n=e,r=new Set([...Object.keys(i),...Object.keys(n)]);for(let o of r)if(i[o]!==n[o])return!1;return!0}function yt({search:t,filterBarStart:e,resultsSlot:i,toolbarEnd:n,mobileAction:r,autoFetch:o=!0,initialPage:s,hasMap:a,mapCenter:p,mapZoom:d,mapControls:l,onMapReady:m,mobileSheetFooter:y,className:x}){let F=h(),{BottomNav:A,Search:z}=w(),u=W(),{filters:R,set:U}=oe(),{pagination:P}=I(),T=_nullishCoalesce(a, () => (F.map!=null)),[O,q]=_react.useState.call(void 0, "list"),[M,v]=_react.useState.call(void 0, !1),{atEnd:b,atStart:g,ref:f}=gi(),S=_react.useRef.call(void 0, null);_react.useEffect.call(void 0, ()=>{P.mode==="paged"&&S.current&&(S.current.scrollTop=0)},[P.mode,P.pageIndex]);let[_,N]=_react.useState.call(void 0, R),[ht,bt]=_react.useState.call(void 0, M);M!==ht&&(bt(M),M&&N(R));let Me=ge=>N(Pt=>({...Pt,...ge})),[De,Be]=_react.useState.call(void 0, !1),me=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{if(De){if(P.loading){me.current=!0;return}me.current&&(me.current=!1,Be(!1),v(!1))}},[De,P.loading]);let Q=t?{value:String(_nullishCoalesce(R[t.filterKey], () => (""))),onChange:ge=>{U({[t.filterKey]:ge||void 0})},placeholder:t.placeholder}:void 0;_react.useEffect.call(void 0, ()=>{o!==!1&&(s&&s>0?F.goToPage(s):F.applyFilters({}))},[F,o]);let Oe=()=>{Me(F.filters.clearedParams())},_e=()=>{if(fi(_,R)){v(!1);return}Be(!0),F.applyFilters(_)},Lt=F.filters.activeKeys(R).length,He=_nullishCoalesce(u.total, () => (u.items.length));return _jsxruntime.jsxs.call(void 0, "div",{className:x?`rle-app ${x}`:"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, z,{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})]}),!g&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!b&&_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:()=>v(!0),filterCount:Lt,action:r}),_jsxruntime.jsxs.call(void 0, "div",{className:`rle-body ${T?"rle-split":"rle-body--list-only"}`,"data-mobile-view":O,children:[_jsxruntime.jsx.call(void 0, "div",{className:"rle-list",ref:S,children:_nullishCoalesce(i, () => (_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, "div",{className:"rle-list-header",children:[_jsxruntime.jsx.call(void 0, rt,{}),n&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-list-header__toolbar",children:n})]}),_jsxruntime.jsx.call(void 0, Xe,{className:"rle-list-grid"}),_jsxruntime.jsx.call(void 0, nt,{})]})))}),T&&_jsxruntime.jsx.call(void 0, "div",{className:"rle-map",children:_jsxruntime.jsx.call(void 0, it,{center:p,zoom:d,fallback:mi,mapControls:l,onMapReady:m})})]}),T&&_jsxruntime.jsx.call(void 0, A,{view:O,onViewChange:q}),_jsxruntime.jsx.call(void 0, mt,{title:"Filters",open:M,onOpenChange:v,footer:y?y({draft:_,apply:_e,clear:Oe,resultCount:He,loading:P.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:P.loading,onClick:_e,children:P.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:_,onDraftChange:Me})})]})}function vt(t){return"provider"in t}function bi(t){let e=t!=null&&!vt(t),i=e?t.apiKey:void 0,n=e?t.mapId:void 0,r=e?t.mapOptions:void 0,o=e?t.styles:void 0,s=e?t.overlayMarkers:void 0,[a,p]=_react.useState.call(void 0, ()=>!t||vt(t)?{ready:!0,provider:_optionalChain([t, 'optionalAccess', _38 => _38.provider])}:{ready:!1});return _react.useEffect.call(void 0, ()=>{if(!i)return;let d=!1;return Promise.resolve().then(() => _interopRequireWildcard(require("./maps/google/index.cjs"))).then(({googleProvider:l})=>{d||p({ready:!0,provider:l({apiKey:i,mapId:n,mapOptions:r,styles:o,overlayMarkers:s})})}),()=>{d=!0}},[i,n]),a}function Li({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 Ur(t){let{datasets:e,filters:i,map:n,components:r,initialFilters:o,onFiltersChange:s,mobileAction:a,search:p,filterBarStart:d,resultsSlot:l,toolbarEnd:m,mapControls:y,onMapReady:x,mobileSheetFooter:F,config:A,autoFetch:z,initialPage:u,className:R}=t,{ready:U,provider:P}=bi(n);if(!U)return null;let T=[];for(let M of e)T.push(Ve(M));i&&T.push(qe(i)),P&&T.push(Ke(P)),o&&T.push($e(o)),A&&T.push(Ue(A));let O=ze(...T),q={...ut,...r};return _jsxruntime.jsxs.call(void 0, at,{...O,children:[s&&_jsxruntime.jsx.call(void 0, Li,{onFiltersChange:s}),_jsxruntime.jsx.call(void 0, je,{...q,children:_jsxruntime.jsx.call(void 0, yt,{className:R,search:p,filterBarStart:d,resultsSlot:l,toolbarEnd:m,mobileAction:a,autoFetch:z,mapCenter:_optionalChain([n, 'optionalAccess', _39 => _39.center]),mapZoom:_optionalChain([n, 'optionalAccess', _40 => _40.zoom]),mapControls:y,onMapReady:x,initialPage:u,mobileSheetFooter:F})})]})}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 = Oi; exports.n = $e; exports.o = _i; 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 = ke; exports.L = Ce; exports.M = we; exports.N = Ie; exports.O = Ee; exports.P = ut; exports.Q = mt; exports.R = yt; exports.S = Ur;
@@ -1,2 +0,0 @@
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(o=>this.defs.has(o));n.forEach((o,s)=>{this.defs.get(o).order=s});let r=new Set(n);return i.filter(o=>!r.has(o.key)).forEach((o,s)=>{o.order=n.length+s}),this}list(){return[...this.defs.values()].sort((e,i)=>e.order-i.order)}has(e){return this.defs.has(e)}toFilters(e){return this.list().filter(n=>Object.hasOwn(e,n.key)).map(n=>n.toParams(e[n.key])).reduce((n,r)=>({...n,...r}),{})}activeKeys(e){return this.list().filter(i=>i.isActive?.(e)).map(i=>i.key)}clearedParams(){return this.list().reduce((e,i)=>Object.assign(e,i.toParams(i.fromParams({}))),{})}};var te=class{defs=new Map;add(e){if(this.defs.has(e.id))throw new Error(`DatasetRegistry: dataset "${e.id}" is already registered`);return this.defs.set(e.id,{...e}),this}get(e){return this.defs.get(e)}has(e){return this.defs.has(e)}list(){return[...this.defs.values()]}visibleIds(){return this.list().filter(e=>e.visible?.()!==!1).map(e=>e.id)}};var ie=class{map=new Map;dispose(){this.map.clear()}emit(e){let i=this.map.get(e.type);if(i)for(let r of[...i])r(e);let n=this.map.get("*");if(n)for(let r of[...n])r(e)}on(e,i){let n=this.map.get(e);return n||(n=new Set,this.map.set(e,n)),n.add(i),()=>{n.delete(i)}}};var Ae={pagination:"paged",pageSize:20,debounceMs:250};var ne=class{options;constructor(e){this.options=Object.freeze({...Ae,...e})}};var re=class{filters;map;datasets;primaryDatasetId;store;emitter=new ie;config;debounceTimer=null;debounceResolve=null;queryToken=0;pointsToken=0;mapHandle=null;constructor(e){this.datasets=e.datasets,this.filters=e.filters??new $,this.map=e.map,this.config=new ne(e.config);let i=e.primaryDatasetId??this.datasets.list()[0]?.id;if(i==null||!this.datasets.has(i))throw new Error(`ListingEngine: primary dataset "${i??""}" is not registered \u2014 pass a valid primaryDatasetId or register at least one dataset`);this.primaryDatasetId=i,this.store=new ee({filters:e.initialFilters??{},mode:this.config.options.pagination})}get state(){return this.store.getState()}get options(){return this.config.options}applyFilters(e){this.store.setFilters(e),this.emitter.emit({type:"FiltersChanged",filters:this.currentFilters()}),this.clearDebounce();let i=++this.queryToken,n=this.config.options.debounceMs;return n<=0?this.runQuery(i):new Promise(r=>{this.debounceResolve=r,this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.debounceResolve=null,r(this.runQuery(i))},n)})}async loadPage(){let e=this.state.results.nextCursor;if(e===null)return;let i=++this.queryToken,n=this.primaryDataset();this.store.setLoading(!0);try{let r=await n.adapter.list(this.currentFilters(),{cursor:e,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.config.options.pagination==="infinite"?this.store.appendResults(r):this.store.setResults(r),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async goToPage(e){if(e<0)return;let i=++this.queryToken,n=this.primaryDataset();this.store.setLoading(!0);try{let r=await n.adapter.list(this.currentFilters(),{offset:e*this.config.options.pageSize,limit:this.config.options.pageSize});if(i!==this.queryToken)return;this.store.setResults(r),this.store.setPageIndex(e),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:r.items.length})}finally{i===this.queryToken&&this.store.setLoading(!1)}}async loadPoints(e){this.store.setBounds(e),this.emitter.emit({type:"BoundsChanged",bounds:e});let i=this.currentFilters(),n=++this.pointsToken;await Promise.allSettled(this.datasets.visibleIds().map(async r=>{let o=this.datasets.get(r);if(!o)return;let s=await o.adapter.getPoints(i,e);n===this.pointsToken&&this.store.setPoints(r,s)}))}setMapHandle(e){this.mapHandle=e}fitBounds(e,i){!this.map||!this.mapHandle||this.map.fitBounds(this.mapHandle,e,i)}selectPoint(e,i){this.store.setSelection(i);let n=this.state.points[e]?.find(r=>r.id===i);n&&this.emitter.emit({type:"PointClicked",datasetId:e,id:n.id,entity:n.entity})}setHovered(e,i){this.store.setHovered(i)}toggleLayer(e){let n=!(this.state.layers[e]??!0);this.store.setLayerVisible(e,n),this.emitter.emit({type:"LayerToggled",datasetId:e,visible:n})}subscribe(e){return this.store.subscribe(e)}on(e,i){return this.emitter.on(e,i)}dispose(){this.clearDebounce(),this.emitter.dispose(),this.mapHandle=null}async runQuery(e){if(e!==this.queryToken)return;let i=this.primaryDataset();this.store.setLoading(!0);try{let n=await i.adapter.list(this.currentFilters(),{cursor:null,limit:this.config.options.pageSize});if(e!==this.queryToken)return;this.store.setResults(n),this.store.setPageIndex(0),this.emitter.emit({type:"ResultsLoaded",datasetId:this.primaryDatasetId,count:n.items.length})}finally{e===this.queryToken&&this.store.setLoading(!1)}}primaryDataset(){return this.datasets.get(this.primaryDatasetId)}currentFilters(){return this.store.getState().filters}clearDebounce(){this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.debounceResolve!==null&&(this.debounceResolve(),this.debounceResolve=null)}};function ze(...t){let e={config:{},filters:new $,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)},Oi=t=>e=>{e.urlSync=t},$e=t=>e=>{e.initialFilters=t},_i=t=>e=>{e.primaryDatasetId=t};import{createContext as Tt,useContext as Ft}from"react";import{jsx as C,jsxs as Ge}from"react/jsx-runtime";function St(t){return String(t?.title??"")}var kt=({item:t})=>C("div",{children:St(t)}),Ct=()=>C("div",{}),fe=()=>C("div",{}),wt=({children:t})=>C("div",{children:t}),It=({children:t})=>C("div",{children:t}),Et=({value:t,onChange:e,placeholder:i})=>C("input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":i??"Search"}),xt=()=>C("div",{role:"status",children:"No results"}),Nt=()=>C("div",{role:"status","aria-busy":"true",children:"Loading\u2026"}),Rt=({count:t})=>Ge("div",{children:[t," results"]}),Mt=({children:t})=>C("div",{children:t}),Dt=({view:t,onViewChange:e})=>Ge("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:Dt,Card:kt,Marker:Ct,Popup:fe,Sidebar:wt,FilterPanel:It,Search:Et,Empty:xt,Loading:Nt,ResultHeader:Rt,Toolbar:Mt},We=Tt(k);function je(t){let{BottomNav:e,Card:i,Marker:n,Popup:r,Sidebar:o,FilterPanel:s,Search:a,Empty:p,Loading:d,ResultHeader:l,Toolbar:m,children:y}=t,x={BottomNav:e??k.BottomNav,Card:i??k.Card,Marker:n??k.Marker,Popup:r??k.Popup,Sidebar:o??k.Sidebar,FilterPanel:s??k.FilterPanel,Search:a??k.Search,Empty:p??k.Empty,Loading:d??k.Loading,ResultHeader:l??k.ResultHeader,Toolbar:m??k.Toolbar};return C(We.Provider,{value:x,children:y})}function w(){return Ft(We)}import{createContext as Bt}from"react";var se=Bt(null);import{useContext as Ot}from"react";function h(){let t=Ot(se);if(t===null)throw new Error("useListing must be used within a <ListingProvider>");return t}import{useCallback as Qe,useSyncExternalStore as _t}from"react";function I(){let t=h(),e=Qe(n=>t.subscribe(n),[t]),i=Qe(()=>t.state,[t]);return _t(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,o)=>t.applyFilters({[r]:o}),[t]);return{filters:e.filters,set:i,setField:n}}import{jsx as Z,jsxs as Ht}from"react/jsx-runtime";function ye({className:t,groupClassName:e,hideLabels:i,draft:n,onDraftChange:r}={}){let o=h(),{FilterPanel:s}=w(),{filters:a}=oe(),p=n!==void 0&&r!==void 0,d=p?n:a;return Z(s,{children:Z("div",{className:t??"space-y-5",children:o.filters.list().map(l=>{if(typeof l.render=="string")return Z("div",{"data-filter":l.key,className:e},l.key);let m=l.render;return Ht("div",{className:e,children:[l.label&&!i&&Z("div",{className:"mb-1.5 text-[13px] font-medium text-foreground",children:l.label}),Z(m,{value:l.fromParams(d),onChange:y=>p?r(l.toParams(y)):void o.applyFilters(l.toParams(y))})]},l.key)})})})}function W(){return I().results}import{jsx as ae}from"react/jsx-runtime";function At(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:o,Empty:s,Loading:a}=w();return n.loading&&i.length===0?ae(a,{}):i.length===0?ae(s,{}):ae("div",{role:"list",className:t,children:i.map((p,d)=>{let l=At(p,d);return ae(o,{item:p,selected:r===l,onSelect:()=>e.selectPoint(e.primaryDatasetId,l)},l)})})}import{useEffect as X,useRef as H,useState as Je}from"react";import{createPortal as zt}from"react-dom";import{jsx as ve,jsxs as tt}from"react/jsx-runtime";var Ut={west:-179.9,south:-85,east:179.9,north:85},Ye=.1,et=.02;function Kt(t){if(t.length===0)return null;let e=t[0].lng,i=t[0].lng,n=t[0].lat,r=t[0].lat;for(let{lat:a,lng:p}of t)p<e&&(e=p),p>i&&(i=p),a<n&&(n=a),a>r&&(r=a);let o=r>n?(r-n)*Ye:et,s=i>e?(i-e)*Ye:et;return{west:e-s,east:i+s,south:n-o,north:r+o}}function it(t){let{center:e,zoom:i,fallback:n,mapControls:r,onMapReady:o}=t,s=h(),a=I(),p=H(o);p.current=o;let d=H(null),l=H(null),m=H(null),[y,x]=Je(!1),F=H(!1),A=H(!1),z=H(!1),u=s.map;X(()=>{let v=m.current;if(!u||!v)return;let b=[];for(let g of Object.keys(a.points)){if(a.layers[g]===!1)continue;let f=s.datasets.get(g),S=a.points[g]??[],_={id:g,markers:S.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)};b.push(u.renderLayer(v,_))}return()=>{b.forEach(g=>g())}},[s,u,y,a.points,a.layers]),X(()=>{if(!d.current||!u)return;let v=d.current,b=!1,g=null;return(async()=>{let f=await u.mount(v,{center:e,zoom:i,fullscreenTarget:l.current??void 0});if(b){u.destroy(f);return}m.current=f,s.setMapHandle(f),g=u.onBoundsChange(f,S=>{z.current?z.current=!1:A.current=!0,s.loadPoints(S)}),x(!0),p.current?.(f.nativeMap??f.raw),s.loadPoints(Ut)})(),()=>{b=!0,g?.(),m.current&&(u.destroy(m.current),m.current=null,s.setMapHandle(null),p.current?.(null)),x(!1)}},[s,u]),X(()=>{let v=m.current;if(!u||!v||e||F.current||A.current)return;let b=[];for(let f of Object.keys(a.points))if(a.layers[f]!==!1)for(let S of a.points[f]??[])b.push(S.position);let g=Kt(b);g&&(F.current=!0,z.current=!0,u.fitBounds(v,g))},[u,e,y,a.points,a.layers]),X(()=>{u?.updateMarkerStates(a.selection,a.hovered)},[u,y,a.selection,a.hovered]);let{Popup:R}=w(),U=R!==fe,P=a.points[s.primaryDatasetId]??[],T=a.selection!=null?P.find(v=>v.id===a.selection):void 0,[O,q]=Je(null),M=H(T);return M.current=T,X(()=>{let v=m.current;if(!u||!v||!U)return;let b=M.current;if(!b)return;let g=u.mountOverlay(b.position);q({entity:b.entity,position:b.position,container:g.container});let f=()=>s.selectPoint(s.primaryDatasetId,null),S=N=>{N.key==="Escape"&&f()};document.addEventListener("keydown",S);let _=u.onMapClick(f);return()=>{document.removeEventListener("keydown",S),_(),g.unmount(),q(null)}},[s,u,y,a.selection,U]),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,U&&O?zt(ve(R,{entity:O.entity,onClose:()=>s.selectPoint(s.primaryDatasetId,null)}),O.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 qt}from"react/jsx-runtime";var he="gap";function Vt(t,e){if(t<=7)return Array.from({length:t},(o,s)=>s+1);let i=Math.max(2,e-1),n=Math.min(t-1,e+1),r=[1];i>2&&r.push(he);for(let o=i;o<=n;o+=1)r.push(o);return n<t-1&&r.push(he),r.push(t),r}function nt(){let t=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,o=r+1,s=e.total!=null?Math.ceil(e.total/n):null,a=s!=null?o<s:e.nextCursor!=null||e.items.length>=n;if(s!=null?s<=1:r===0&&!a)return null;let p=d=>()=>{t.goToPage(d)};return qt("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"}),s!=null&&Vt(s,o).map((d,l)=>d===he?J("span",{className:"rle-page-ellipsis",children:"\u2026"},`gap-${l}`):J("button",{type:"button",className:d===o?"rle-page-btn rle-page-btn--active":"rle-page-btn","aria-label":`Page ${d}`,"aria-current":d===o?"page":void 0,disabled:i.loading,onClick:p(d-1),children:d},d)),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 $t}from"react/jsx-runtime";function rt(){let{items:t,total:e}=W(),{ResultHeader:i}=w();return $t(i,{count:t.length,total:e})}import{useEffect as Wt,useRef as jt}from"react";function st(t,e){let i=h(),n=jt(e);n.current=e,Wt(()=>i.on(t,r=>n.current(r)),[i,t])}import{useEffect as Gt,useState as ot}from"react";import{jsx as Qt}from"react/jsx-runtime";function at(t){let{children:e,...i}=t,[n]=ot(()=>i),[r,o]=ot(null);return Gt(()=>{let s=new re({datasets:n.datasets,filters:n.filters,config:n.config,map:n.map,initialFilters:n.initialFilters,primaryDatasetId:n.primaryDatasetId});return n.urlSync&&n.urlSync.start(s),o(s),()=>{n.urlSync&&n.urlSync.stop(),s.dispose(),o(a=>a===s?null:a)}},[n]),r?Qt(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(Zt,{}),"List"]}),Y("button",{type:"button",className:`rle-viewtoggle__btn${t==="map"?" rle-viewtoggle__btn--active":""}`,"aria-pressed":t==="map",onClick:()=>e("map"),children:[E(Xt,{}),"Map"]})]})})}function Zt(){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 Xt(){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 Yt,jsx as D,jsxs as dt}from"react/jsx-runtime";function Jt(t){return t?"rle-card rle-card--selected":"rle-card"}function be({item:t,selected:e,onSelect:i}){let n=t??{},r=Jt(e),o=dt(Yt,{children:[n.imageUrl?D("img",{src:n.imageUrl,alt:n.title??"",className:"rle-card-media"}):D("div",{className:"rle-card-media rle-card-media--placeholder","aria-hidden":"true"}),dt("div",{className:"rle-card-body",children:[n.title&&D("span",{className:"rle-card-title",children:n.title}),n.subtitle&&D("span",{className:"rle-card-address",children:n.subtitle}),n.badge&&D("div",{className:"rle-card-info",children:D("span",{className:"rle-card-info-item",children:n.badge})}),n.price!=null&&D("span",{className:"rle-card-price",children:j(n.price)})]})]});return i?D("button",{type:"button",onClick:i,"aria-pressed":e??!1,className:r,children:o}):D("article",{className:r,children:o})}import{jsx as le,jsxs as pt}from"react/jsx-runtime";function Le(t){return pt("div",{role:"status",className:"rle-empty",children:[pt("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",className:"rle-empty-icon","aria-hidden":"true",children:[le("circle",{cx:"11",cy:"11",r:"7"}),le("path",{d:"m21 21-4.3-4.3"})]}),le("p",{className:"rle-empty-title",children:"No results"}),le("p",{className:"rle-empty-hint",children:"Try adjusting your filters or search terms."})]})}import{jsx as ei}from"react/jsx-runtime";function Pe({children:t}){return ei("div",{className:"rle-filter-panel",children:t})}import{jsx as de,jsxs as ti}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)=>ti("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 ii}from"react/jsx-runtime";function Fe({point:t}){let e=t.entity??{};return ii("span",{className:"rle-pin",children:e.price!=null?j(e.price):""})}import{jsx as G,jsxs as Se}from"react/jsx-runtime";function ke({entity:t,onClose:e}){let i=t??{};return Se("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:Se("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"})]})}),Se("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 ni}from"react/jsx-runtime";function Ce({count:t,total:e}){let i=e!=null&&e!==t?`${t} of ${e} results`:`${t} results`;return ni("div",{className:"rle-result-header",children:i})}import{jsx as ri}from"react/jsx-runtime";function we({value:t,onChange:e,placeholder:i}){return ri("input",{type:"search",value:t,placeholder:i,onChange:n=>e(n.target.value),"aria-label":i??"Search",className:"rle-input"})}import{jsx as si}from"react/jsx-runtime";function Ie({children:t}){return si("aside",{className:"rle-sidebar",children:t})}import{jsx as oi}from"react/jsx-runtime";function Ee({children:t}){return oi("div",{className:"rle-toolbar",children:t})}var ut={BottomNav:lt,Card:be,Marker:Fe,Popup:ke,Sidebar:Ie,FilterPanel:Pe,Search:we,Empty:Le,Loading:Te,ResultHeader:Ce,Toolbar:Ee};import{useEffect as xe,useRef as ai,useState as ct}from"react";import{createPortal as li}from"react-dom";import{Fragment as pi,jsx as B,jsxs as pe}from"react/jsx-runtime";function mt({open:t,onOpenChange:e,title:i,children:n,footer:r}){let o=ai(null),[s,a]=ct(!1),[p,d]=ct(!1);return xe(()=>{if(!t){d(!1),a(!1);return}a(!0);let l=requestAnimationFrame(()=>d(!0));return()=>cancelAnimationFrame(l)},[t]),xe(()=>{if(!s)return;let l=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=l}},[s]),xe(()=>{if(!s)return;o.current?.focus();function l(m){m.key==="Escape"&&e(!1)}return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[s,e]),!s||typeof document>"u"?null:li(pe(pi,{children:[B("div",{className:`rle-sheet-backdrop${p?" rle-sheet-backdrop--open":""}`,onClick:()=>e(!1),"aria-hidden":"true"}),pe("div",{ref:o,className:`rle-sheet${p?" rle-sheet--open":""}`,role:"dialog","aria-modal":"true","aria-label":i,tabIndex:-1,children:[B("div",{className:"rle-sheet__handle","aria-hidden":"true"}),pe("div",{className:"rle-sheet__header",children:[i&&B("div",{className:"rle-sheet__title",children:i}),B("button",{type:"button",className:"rle-sheet__close",onClick:()=>e(!1),"aria-label":"Close",children:B(di,{})})]}),B("div",{className:"rle-sheet__body",children:n}),r&&B("div",{className:"rle-sheet__footer",children:r})]})]}),document.body)}function di(){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:[B("path",{d:"M18 6 6 18"}),B("path",{d:"m6 6 12 12"})]})}import{useEffect as ce,useRef as Ne,useState as V}from"react";import{jsx as L,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&&L("div",{className:"rle-mobile-header__search",children:L(r,{value:t.value,onChange:t.onChange,placeholder:t.placeholder})}),ue("button",{type:"button",className:"rle-btn rle-mobile-header__btn",onClick:e,children:[L(ui,{}),L("span",{children:"Filters"}),i>0&&L("span",{className:"rle-mobile-header__count",children:i})]}),n&&L("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??L(ci,{})})]})}function ui(){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:[L("line",{x1:"4",y1:"6",x2:"20",y2:"6"}),L("circle",{cx:"9",cy:"6",r:"2",fill:"currentColor",stroke:"none"}),L("line",{x1:"4",y1:"12",x2:"20",y2:"12"}),L("circle",{cx:"15",cy:"12",r:"2",fill:"currentColor",stroke:"none"}),L("line",{x1:"4",y1:"18",x2:"20",y2:"18"}),L("circle",{cx:"11",cy:"18",r:"2",fill:"currentColor",stroke:"none"})]})}function ci(){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:[L("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),L("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}import{Fragment as ft,jsx as c,jsxs as K}from"react/jsx-runtime";var mi=c("div",{className:"rle-empty",children:"Map unavailable"});function gi(){let t=Ne(null),[e,i]=V(!0),[n,r]=V(!0);return ce(()=>{let o=t.current;if(!o)return;let s=()=>{let{clientWidth:m,scrollLeft:y,scrollWidth:x}=o;i(y<=0),r(y+m>=x-1)},a=0,p=()=>{a||(a=requestAnimationFrame(()=>{a=0,s()}))};s(),o.addEventListener("scroll",s,{passive:!0});let d,l;return typeof ResizeObserver<"u"&&(d=new ResizeObserver(s),d.observe(o)),typeof MutationObserver<"u"&&(l=new MutationObserver(p),l.observe(o,{characterData:!0,childList:!0,subtree:!0})),()=>{o.removeEventListener("scroll",s),d?.disconnect(),l?.disconnect(),a&&cancelAnimationFrame(a)}},[]),{atEnd:n,atStart:e,ref:t}}function fi(t,e){if(t===e)return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;let i=t,n=e,r=new Set([...Object.keys(i),...Object.keys(n)]);for(let o of r)if(i[o]!==n[o])return!1;return!0}function yt({search:t,filterBarStart:e,resultsSlot:i,toolbarEnd:n,mobileAction:r,autoFetch:o=!0,initialPage:s,hasMap:a,mapCenter:p,mapZoom:d,mapControls:l,onMapReady:m,mobileSheetFooter:y,className:x}){let F=h(),{BottomNav:A,Search:z}=w(),u=W(),{filters:R,set:U}=oe(),{pagination:P}=I(),T=a??F.map!=null,[O,q]=V("list"),[M,v]=V(!1),{atEnd:b,atStart:g,ref:f}=gi(),S=Ne(null);ce(()=>{P.mode==="paged"&&S.current&&(S.current.scrollTop=0)},[P.mode,P.pageIndex]);let[_,N]=V(R),[ht,bt]=V(M);M!==ht&&(bt(M),M&&N(R));let Me=ge=>N(Pt=>({...Pt,...ge})),[De,Be]=V(!1),me=Ne(!1);ce(()=>{if(De){if(P.loading){me.current=!0;return}me.current&&(me.current=!1,Be(!1),v(!1))}},[De,P.loading]);let Q=t?{value:String(R[t.filterKey]??""),onChange:ge=>{U({[t.filterKey]:ge||void 0})},placeholder:t.placeholder}:void 0;ce(()=>{o!==!1&&(s&&s>0?F.goToPage(s):F.applyFilters({}))},[F,o]);let Oe=()=>{Me(F.filters.clearedParams())},_e=()=>{if(fi(_,R)){v(!1);return}Be(!0),F.applyFilters(_)},Lt=F.filters.activeKeys(R).length,He=u.total??u.items.length;return K("div",{className:x?`rle-app ${x}`:"rle-app",children:[K("div",{className:"rle-filter-bar",children:[K("div",{className:"rle-filter-bar__scroll",ref:f,children:[Q&&c("div",{className:"rle-filter-bar__search",children:c(z,{value:Q.value,onChange:Q.onChange,placeholder:Q.placeholder})}),e&&c("div",{className:"rle-filter-bar__slot",children:e}),c(ye,{className:"rle-filters-row",groupClassName:"rle-filter-group",hideLabels:!0})]}),!g&&c("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--start","aria-hidden":"true"}),!b&&c("div",{className:"rle-filter-bar__fade rle-filter-bar__fade--end","aria-hidden":"true"})]}),c(gt,{search:Q,onFiltersClick:()=>v(!0),filterCount:Lt,action:r}),K("div",{className:`rle-body ${T?"rle-split":"rle-body--list-only"}`,"data-mobile-view":O,children:[c("div",{className:"rle-list",ref:S,children:i??K(ft,{children:[K("div",{className:"rle-list-header",children:[c(rt,{}),n&&c("div",{className:"rle-list-header__toolbar",children:n})]}),c(Xe,{className:"rle-list-grid"}),c(nt,{})]})}),T&&c("div",{className:"rle-map",children:c(it,{center:p,zoom:d,fallback:mi,mapControls:l,onMapReady:m})})]}),T&&c(A,{view:O,onViewChange:q}),c(mt,{title:"Filters",open:M,onOpenChange:v,footer:y?y({draft:_,apply:_e,clear:Oe,resultCount:He,loading:P.loading}):K(ft,{children:[c("button",{type:"button",className:"rle-btn rle-btn--ghost",onClick:Oe,children:"Clear all"}),c("button",{type:"button",className:"rle-btn rle-btn--primary rle-sheet__apply",disabled:P.loading,onClick:_e,children:P.loading?c("span",{className:"rle-spinner","aria-label":"Updating results"}):`Show ${He} results`})]}),children:c(ye,{className:"rle-filter-stack",groupClassName:"rle-filter-group",draft:_,onDraftChange:Me})})]})}import{useEffect as yi,useRef as vi,useState as hi}from"react";import{jsx as Re,jsxs as Pi}from"react/jsx-runtime";function vt(t){return"provider"in t}function bi(t){let e=t!=null&&!vt(t),i=e?t.apiKey:void 0,n=e?t.mapId:void 0,r=e?t.mapOptions:void 0,o=e?t.styles:void 0,s=e?t.overlayMarkers:void 0,[a,p]=hi(()=>!t||vt(t)?{ready:!0,provider:t?.provider}:{ready:!1});return yi(()=>{if(!i)return;let d=!1;return import("./maps/google/index.js").then(({googleProvider:l})=>{d||p({ready:!0,provider:l({apiKey:i,mapId:n,mapOptions:r,styles:o,overlayMarkers:s})})}),()=>{d=!0}},[i,n]),a}function Li({onFiltersChange:t}){let e=vi(t);return e.current=t,st("FiltersChanged",i=>{i.type==="FiltersChanged"&&e.current(i.filters)}),null}function Ur(t){let{datasets:e,filters:i,map:n,components:r,initialFilters:o,onFiltersChange:s,mobileAction:a,search:p,filterBarStart:d,resultsSlot:l,toolbarEnd:m,mapControls:y,onMapReady:x,mobileSheetFooter:F,config:A,autoFetch:z,initialPage:u,className:R}=t,{ready:U,provider:P}=bi(n);if(!U)return null;let T=[];for(let M of e)T.push(Ve(M));i&&T.push(qe(i)),P&&T.push(Ke(P)),o&&T.push($e(o)),A&&T.push(Ue(A));let O=ze(...T),q={...ut,...r};return Pi(at,{...O,children:[s&&Re(Li,{onFiltersChange:s}),Re(je,{...q,children:Re(yt,{className:R,search:p,filterBarStart:d,resultsSlot:l,toolbarEnd:m,mobileAction:a,autoFetch:z,mapCenter:n?.center,mapZoom:n?.zoom,mapControls:y,onMapReady:x,initialPage:u,mobileSheetFooter:F})})]})}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,Oi as m,$e as n,_i 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,ke as K,Ce as L,we as M,Ie as N,Ee as O,ut as P,mt as Q,yt as R,Ur as S};