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 +30 -0
- package/dist/chunk-CJPRUL76.cjs +2 -0
- package/dist/chunk-SEXAGR6S.js +2 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +31 -6
- package/dist/index.d.ts +31 -6
- package/dist/index.js +1 -1
- package/dist/{listing-app-tRTA7DDI.d.ts → listing-app-BtL-wU3p.d.cts} +21 -3
- package/dist/{listing-app-D1Y9PSCR.d.cts → listing-app-C4jHr8cd.d.ts} +21 -3
- package/dist/styled/index.cjs +1 -1
- package/dist/styled/index.d.cts +2 -2
- package/dist/styled/index.d.ts +2 -2
- package/dist/styled/index.js +1 -1
- package/dist/styles.css +8 -0
- package/package.json +1 -1
- package/dist/chunk-326ZSXGN.cjs +0 -2
- package/dist/chunk-7IG7X4NK.js +0 -2
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
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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,
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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 };
|
package/dist/styled/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
-
var
|
|
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;
|
package/dist/styled/index.d.cts
CHANGED
|
@@ -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-
|
|
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-
|
|
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
|
/**
|
package/dist/styled/index.d.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
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
|
/**
|
package/dist/styled/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{
|
|
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.
|
|
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": [
|
package/dist/chunk-326ZSXGN.cjs
DELETED
|
@@ -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;
|
package/dist/chunk-7IG7X4NK.js
DELETED
|
@@ -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};
|