docs
    re-site-kit: Changelog
    v0.6.0.md

    @sonordev/re-site-kit Changelog

    0.6.0

    • ListingPagination offers a next page when the total is unknown. Some live-mode responses come back with total_pages: null, and on page 1 the component rendered nothing, even with more pages to go. Pass the new listingCount prop (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" />
    • IdxAttribution takes a timeZone. 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. With showTimestamp={false} and no brokerage or agent to credit, it now renders nothing instead of an empty <div>.

    • ListingGallery keeps 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-visible ring (keyboard focus only, not mouse clicks), which you can restyle with .re-gallery:focus-visible and no !important. Thumbnails draw their ring inside the thumbnail, where the scrolling strip can't clip it.

    • ListingDetail has a showPhotos prop. Pass showPhotos={false} when the page also renders ListingGallery, so the photos don't appear twice. It replaces passing the listing with images: null, which still works.

    • Correct schema.org types in buildListingJsonLd and ListingSchema. Land was typed LandmarksOrHistoricalBuildings (a historical landmark); it's now a Place. A listing with no property type, or other, is now an Accommodation (it was Residence). Townhouses stay a House. Bedrooms, full bathrooms, year built and floor size now appear only on the types schema.org defines them for: all four on houses, apartments and Accommodation, bedrooms only on ApartmentComplex (multi-family), and none on Place (land and commercial).

    • getListingParams documents 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; keep dynamicParams on 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_listings tool's keywords and city descriptions, and its sort description 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: listingPath receives the listing's source_url, alongside slug and source_listing_id. A site with one listings page and no page per listing can now return listing.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 statuses option's documentation spells out when to add sold: 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 the communities option) and request_showing. realEstateMcpServerInfo(options) names the server after your host, e.g. com.example/listings.
    • request_showing files a request, not an appointment. Someone at the office confirms with the buyer, and the result says booked: 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-kit peer 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.
    • q searches 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"). New keywordLabel and keywordPlaceholder props change them. The field's label also carries re-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 type ListingStats.
    • 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 as searchListings, which also takes a new building option.
    • 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, BuildingSummary and BuildingRegistryEntry.

    0.2.1

    • ListingCard credits 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 with showAttribution={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: searchListings with filters, sort and paging; ListingFilters, a search form that works without JavaScript; and ListingPagination, crawlable previous and next links.
    • Listing pages: getListing (with open houses in live serve mode), getListingParams for generateStaticParams, listingMetadata, ListingDetail, and ListingSchema with buildListingJsonLd and safeJsonLdString for schema.org RealEstateListing markup that's safe to embed.
    • IDX: IdxAttribution, the courtesy line and data-freshness timestamp.
    • Hot properties: getHotListings, ranked from the listing_view events ListingViewTracker sends 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 a listing_inquiry conversion) and ListingViewTracker.
    • Helpers: formatPrice, formatSpecs, formatLocation and formatStreet.
    • ListingCard, ListingGrid and the simple getListings list.