@sonordev/re-site-kit Changelog
0.6.0
-
ListingPaginationoffers a next page when the total is unknown. Some live-mode responses come back withtotal_pages: null, and on page 1 the component rendered nothing, even with more pages to go. Pass the newlistingCountprop (listings.length) and a full page gets a Next link while a shorter one is treated as the last page, on page 1 and after. Without the prop it behaves as before, so add it to your listings page:<ListingPagination pagination={pagination} listingCount={listings.length} basePath="/listings" /> -
IdxAttributiontakes atimeZone. The data-freshness timestamp was always in US Eastern time. Pass an IANA zone (timeZone="America/Chicago") to show your office's time; US Eastern is still the default, and a zone the runtime doesn't recognize falls back to it. WithshowTimestamp={false}and no brokerage or agent to credit, it now renders nothing instead of an empty<div>. -
ListingGallerykeeps its focus ring. It turned its outline off inline, so keyboard users couldn't see when it had focus. It now shows the browser's:focus-visiblering (keyboard focus only, not mouse clicks), which you can restyle with.re-gallery:focus-visibleand no!important. Thumbnails draw their ring inside the thumbnail, where the scrolling strip can't clip it. -
ListingDetailhas ashowPhotosprop. PassshowPhotos={false}when the page also rendersListingGallery, so the photos don't appear twice. It replaces passing the listing withimages: null, which still works. -
Correct schema.org types in
buildListingJsonLdandListingSchema. Land was typedLandmarksOrHistoricalBuildings(a historical landmark); it's now aPlace. A listing with no property type, orother, is now anAccommodation(it wasResidence). Townhouses stay aHouse. Bedrooms, full bathrooms, year built and floor size now appear only on the types schema.org defines them for: all four on houses, apartments andAccommodation, bedrooms only onApartmentComplex(multi-family), and none onPlace(land and commercial). -
getListingParamsdocuments what it returns in live mode. It asks for up to 1,000 listings, and gets them in db mode, but a live-mode request returns only the first page (at most 25). That's by design, since every pre-built listing page is an MLS request during the build; keepdynamicParamson and the rest render on their first visit. No code change. -
Docs. The kit has a full docs section on sonor.dev: a quickstart, search and filters, listing pages, cards, hot properties, buildings, the market snapshot, inquiry forms, IDX compliance, MCP tools, and reference pages for helpers, types and every export.
docs.json, the pages and this changelog ship in the package, and the publish fails if a listed page is missing from it. -
Smaller install. The package no longer ships source maps. Stepping into the kit from your browser's devtools shows the built code instead of the original source.
-
Reworded the example values in the
search_listingstool'skeywordsandcitydescriptions, and itssortdescription now says what happens when you leave it out: results come most recently updated first (it said "newest"). Text only; the tool behaves the same. -
MCP:
listingPathreceives the listing'ssource_url, alongsideslugandsource_listing_id. A site with one listings page and no page per listing can now returnlisting.source_url, so a buyer's assistant links each listing to a real page instead of the listings index:realEstateMcpTools({ ...options, listingPath: (listing) => listing.source_url }) -
The
statusesoption's documentation spells out when to addsold: where your MLS allows sold data in IDX displays, or the listings really are your brokerage's own. A hand-imported copy of another brokerage's feed doesn't count, even when it's stored as a manual listing.
0.5.0
MCP tools for a buyer's AI assistant (new)
@sonordev/re-site-kit/mcp, a new entry point.realEstateMcpTools(options)defines four tools for site-kit's MCP module to serve:search_listings,get_listing,list_communities(with thecommunitiesoption) andrequest_showing.realEstateMcpServerInfo(options)names the server after your host, e.g.com.example/listings.request_showingfiles a request, not an appointment. Someone at the office confirms with the buyer, and the result saysbooked: false. It requires the buyer's confirmation and the assistant's name, uses the same site scope as the reads, and turns Sonor's refusals into plain messages the assistant can relay, with the office's phone and email.- Search returns active and pending listings unless you add more
statuses, a page holds at most 20, and every argument is checked and cleaned before it reaches Sonor. - There are no tools that change or remove a listing, and no tool takes a project id.
- The
@sonordev/site-kitpeer range is now>=4.3.0(was>=4.0.0). Serving the tools behind site-kit's rate-limited relay needs site-kit 6.4.0 or later.
Search box
qsearches the way people type, in both serve modes. An MLS number finds that listing; otherwise every word must appear in the address, city, ZIP or neighborhood, and common street abbreviations match either way. It used to work in db mode only.ListingFilters' search box is labeled "Search" with the placeholder "Address, MLS #, city or neighborhood" (it was "Keyword" and "Pool, garage, cul-de-sac"). NewkeywordLabelandkeywordPlaceholderprops change them. The field's label also carriesre-listing-filters__field--keyword, and the input turns off autocomplete and shows a search key on mobile keyboards.
0.4.0
summarizeListings(listings): a market snapshot for a building, a neighborhood or a search. It returns the count, price range, median price, price per square foot, square footage, monthly HOA, days on market, bedroom range and pet-friendly share, skipping listings that lack each value. New typeListingStats.monthlyHoa(listing): a listing's HOA fee per month, with quarterly, semiannual and annual fees converted.
0.3.0
Buildings (new)
- Listings carry
listing.building({ slug, name, url }) when Sonor has matched them to one of your buildings. getBuildingListings(slug, options?, fetchOptions?)returns a building's listings with the same filters, sort and paging assearchListings, which also takes a newbuildingoption.getBuildingSummaries()returns every building with its active listing count and price range, for a building index.buildingRegistry(entries)builds the JSON your site publishes so Sonor can match listings to your building pages. It trims, lowercases slugs, and drops blanks and duplicates, so you can map your rows straight in.- New types
ListingBuildingRef,BuildingSummaryandBuildingRegistryEntry.
0.2.1
ListingCardcredits the listing brokerage. Cards show "Courtesy of" the listing office by default, so search results and grids name it the way MLS IDX rules generally require, not just the detail page. Turn it off withshowAttribution={false}only where your own layout already credits the office. Style it with.re-listing-card__courtesy. If your site shows other brokerages' listings in grids, take this update.
0.2.0
First public release.
- Search:
searchListingswith filters, sort and paging;ListingFilters, a search form that works without JavaScript; andListingPagination, crawlable previous and next links. - Listing pages:
getListing(with open houses in live serve mode),getListingParamsforgenerateStaticParams,listingMetadata,ListingDetail, andListingSchemawithbuildListingJsonLdandsafeJsonLdStringfor schema.orgRealEstateListingmarkup that's safe to embed. - IDX:
IdxAttribution, the courtesy line and data-freshness timestamp. - Hot properties:
getHotListings, ranked from thelisting_vieweventsListingViewTrackersends through site-kit analytics. - Client components under
@sonordev/re-site-kit/client:ListingGallery,ListingInquiryForm(a managed form that carries the listing into the CRM and records alisting_inquiryconversion) andListingViewTracker. - Helpers:
formatPrice,formatSpecs,formatLocationandformatStreet. ListingCard,ListingGridand the simplegetListingslist.