Built around the property page
The property page has to hold a gallery, the price and facts, a description, room sizes, a floor
plan and a map, a spec table, similar homes, and an agent with a viewing form — and still read
as one page. Harbor puts the agent card and the form in a sticky column on desktop so the phone
number never scrolls away, and stacks it under the content on a phone.
Filters are links
The listings sidebar is a list of <a> elements, not a JavaScript state. Every combination
of area, price and bedrooms is an address a search engine can index and a person can share.
Wire the hrefs to your backend’s query strings and the page needs no other changes.
Connecting a feed
The listing card is one partial with a stable set of class names. Render it from your CRM or
feed and drop the assembler; nothing on the page depends on JavaScript.
What you will need to replace
Every .ph block is a photo placeholder with its subject written on it. The two
<script type="application/ld+json"> blocks — RealEstateAgent on the home page and
RealEstateListing on the property page — carry example addresses, prices and URLs.