Real Estate Page React template for Tailwind CSS v4
v1.0.0Added in 1.14.0
A React real estate template: buy or rent search, listing cards, a price pin map, neighborhoods, a mortgage estimate and a valuation form.
The Buy / Rent switch in the hero swaps the homes, the price choices and the map; typing a neighborhood, street or ZIP, picking a price band or a minimum of beds filters the featured homes and the map live, with the count announced. Search glides down to the homes. On phones the search is a stacked card: Filters opens a bottom sheet with a price slider over a price histogram, preset chips and a beds switch, and Show homes closes it on the results; the homes become a swipeable snap rail. Every listing card is one link that lifts on hover; its heart saves the home with a little burst. On the map, a pin or a row in the list beside it (above it on phones) opens a preview card with View home and Estimate payment, which fills the calculator with that price; Escape or the close button closes it and focus returns to the pin. A neighborhood tile searches that neighborhood. The mortgage sliders (arrow keys, Page Up / Down), the rate field and the term switch update the monthly payment and its breakdown bar live. The valuation form checks the address, name and email, focuses the first problem, spins on submit and then confirms.
Real Estate Page is a Pro React template in the React website templates category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add real-estate-page, together with Marketing Section, Marketing Header, Marketing Footer, Testimonials Section, Avatar and 13 more and the npm packages lucide-react and motion.
Built with
The sections this page is made of. In the full-screen preview, hold Alt to outline each one on the page.
Add to a project
Requirements: React 19 and Tailwind CSS v4, in Next.js (App Router or Pages), Vite or React Router. Installation guide · Next.js setup · Vite setup
npx wingo-ui@latest add real-estate-pageReal Estate Page is part of Pro, with 298 more Pro items: $8 a month or $150 once. 14-day refund before you download any Pro item. See plans
Usage
Import RealEstatePage from @/components/templates/real-estate-page.
// app/page.tsx
"use client"
import Link from "next/link"
import { RealEstatePage, type RealEstateValuationValues } from "@/components/templates/real-estate-page"
async function requestValuation(values: RealEstateValuationValues) {
await fetch("/api/valuations", { method: "POST", body: JSON.stringify(values) })
}
export default function HomeRoute() {
return <RealEstatePage linkComponent={Link} defaultMode="buy" onValuation={requestValuation} />
}Props
listingsdefault"REAL_ESTATE_LISTINGS"RealEstateListing[]{ id, mode, price, previousPrice?, address, neighborhood, city, beds, baths, sqft, kind, color, image?, lat, lng, badge?, href?, favorite? }. mode buy or rent (rent prices are per month); kind picks the drawn photo (brownstone, condo, loft, house, townhouse) tinted with color, image replaces it; lat / lng place the map pin.
neighborhoodsdefault"REAL_ESTATE_NEIGHBORHOODS"RealEstateNeighborhood[]{ name, medianPrice, medianRent?, homes, trend?, description?, color } tiles; the rent median shows in rent mode, trend is a yearly percent. An empty array hides the section.
agentsdefault"REAL_ESTATE_AGENTS"RealEstateAgent[]{ name, role, phone, email, avatar?, sales?, rating?, areas?, languages? } cards with Call and Email links.
testimonialsdefault"REAL_ESTATE_TESTIMONIALS"Testimonial[]Client quotes for the testimonials grid (the TestimonialsSection shape).
statsdefault"REAL_ESTATE_STATS"RealEstateStat[]{ value, label } numbers under the search; an empty array hides them.
phonedefault"(718) 555-0100"stringThe office number in the header, the phone menu and the valuation band (a tel: link); empty hides it.
labelsPartial<RealEstatePageLabels>Every string on the page: the brand, the hero, the search, the section headings, the calculator, the form and its errors. Some are functions (matches, listingsTitle, bedCount, showHomes, successDescription).
currencydefault"USD"stringISO currency of every price, pin, median and payment.
localedefault""stringIntl locale for prices and numbers; empty uses the UIProvider's, else en-US.
mode"buy" | "rent"Buy or rent (controlled): the search, the featured homes, the map and the neighborhood medians follow it.
defaultModedefault"buy""buy" | "rent"The mode on first render (uncontrolled). Switching resets the price filter, since sale and rent bands differ.
onModeChange(mode: "buy" | "rent") => voidFires when the Buy / Rent switch changes.
onSearch(search: RealEstateSearch) => voidRuns on Search, on Show homes in the filters sheet and on a neighborhood tile with { mode, location, price: [min, max], minBeds }. The listings filter live either way; use it to fetch or to sync the URL.
onValuation(values: RealEstateValuationValues) => void | Promise<unknown>Runs on Request my valuation with { address, propertyType, beds, timeline, name, email, phone }. A returned promise keeps the button loading; a rejection keeps the form and shows labels.failed. Without it the page pretends for 900 ms, then confirms.
onFavoriteChange(listing: RealEstateListing, favorite: boolean) => void | Promise<unknown>Runs when a heart is pressed. A returned promise keeps the heart on while pending; a rejection rolls it back.
pricePresetsdefault"REAL_ESTATE_PRICE_PRESETS"Record<"buy" | "rent", PriceRangeValue[]>The price bands of the search and the filters sheet, per mode, as [min, max] pairs (null is an open end).
mortgagedefault"DEFAULT_REAL_ESTATE_MORTGAGE"Partial<RealEstateMortgage>{ price, downPayment (percent), rate (yearly percent), term (15, 20 or 30 years), taxRate (yearly percent of the price), insurance and hoa (per month) }: the calculator's starting numbers and the averages behind the breakdown.
mapBoundsdefault"REAL_ESTATE_MAP_BOUNDS"RealEstateMapBounds{ north, south, west, east } of the drawn map; pins are placed by lat / lng inside it and pulled in at the edges.
featuredCountdefault6numberListing cards shown from 768px before Show all; phones get every match in the rail.
tonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"Accents: the selected map pin, the price slider and histogram, the mortgage sliders and payment bar, the agent stars and the testimonial metrics.
ctaTonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"Search, Free valuation, Show homes and Request my valuation.
favoriteTonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"The heart on a saved home; neutral is white on the photo.
radiusdefault"lg""none" | "sm" | "md" | "lg"Corners of the listing, map, neighborhood, calculator, agent and form cards: 0 / 12 / 16 / 24px; the photos inside follow.
backgrounddefault"glow""plain" | "soft" | "glow" | "aurora" | "grid" | "dots"The main background: plain is the bare page color; the others tint the page and add a glow, an aurora, a grid or dots over the first screen.
backgroundColordefault"oklch(0.62 0.14 275)"stringThe tint and glow color of the main background.
bandBackgrounddefault"muted""muted" | "tinted" | "gradient" | "dots"The secondary background of every second section (the map, the mortgage and the testimonials with all sections on). Cards and fields inside are lifted one step above it.
bandColordefault"oklch(0.62 0.14 275)"stringThe tint of tinted and gradient bands; left equal to backgroundColor it follows it.
showMapdefaulttruebooleanThe map band with the price pins and the list beside it (and its header link).
showNeighborhoodsdefaulttruebooleanThe neighborhood tiles with medians and trends.
showMortgagedefaulttruebooleanThe mortgage estimate; off also removes Estimate payment from the map preview.
showAgentsdefaulttruebooleanThe agent cards with Call and Email links.
showTestimonialsdefaulttruebooleanThe testimonials section.
showValuationdefaulttruebooleanThe Request a valuation band. Off, Free valuation in the header calls the office instead.
headerdefaulttruebooleanThe sticky header with the brand, the section links, the phone number and Free valuation.
footerdefaulttruebooleanThe footer with Buy, Rent, Sell and Company links and the broker's legal line.
headerPropsPartial<MarketingHeaderProps>Anything for MarketingHeader (layout, variant, items...); wins over the page's own values.
footerPropsPartial<MarketingFooterProps>Anything for MarketingFooter (variant, columns, socials, newsletter...).
testimonialsPropsPartial<TestimonialsSectionProps>Anything for the TestimonialsSection (layout, columns, card...).
animateIndefaulttruebooleanThe hero and the search rise in once when the page mounts on the client; never during hydration, under reduced motion or in thumbnails.
linkComponent(props: LinkComponentProps) => ReactNodeThe router link for the listing, header and footer links (next/link in an app).
classNamestringClasses for the root.
classNamesPartial<Record<RealEstatePageSlot, string>>Classes for header, hero, search, filters, listings, listing, photo, map, mapList, neighborhoods, neighborhood, mortgage, agents, agent, testimonials, valuation, form and footer.
Parts
REAL_ESTATE_PAGE_SAMPLE
constantAll the sample content in one object: listings, neighborhoods, agents and testimonials.
REAL_ESTATE_LISTINGS
constantEight Brooklyn homes for sale and six rentals from Greenpoint to Park Slope, with map coordinates.
REAL_ESTATE_NEIGHBORHOODS
constantPark Slope, Williamsburg, DUMBO, Fort Greene, Bed-Stuy and Greenpoint.
REAL_ESTATE_AGENTS
constantFour Harbor & Pine agents with phone, email, sales, rating and areas.
REAL_ESTATE_TESTIMONIALS
constantThree quotes from a buyer, a seller and a renter.
REAL_ESTATE_STATS
constantThe three numbers under the search.
REAL_ESTATE_PRICE_PRESETS
constantFour price bands for buying and four for renting.
REAL_ESTATE_MAP_BOUNDS
constantThe corners of the drawn Brooklyn map.
DEFAULT_REAL_ESTATE_MORTGAGE
constant$1,250,000, 20% down, 6.5% over 30 years, 0.9% tax, $150 insurance.
DEFAULT_REAL_ESTATE_PAGE_LABELS
constantThe English strings.
RealEstatePageProps
typeProps of RealEstatePage, including the attributes of the root element.
RealEstatePageLabels
typeEvery string of the page.
RealEstatePageRadius
type"none" | "sm" | "md" | "lg".
RealEstatePageSlot
typeThe keys of classNames.
RealEstateMode
type"buy" | "rent".
RealEstateListing
typeOne home: price, address, facts, the drawn photo and the map position.
RealEstateHomeKind
type"brownstone" | "condo" | "loft" | "house" | "townhouse": the drawn photos.
RealEstateNeighborhood
typeOne neighborhood tile with its medians and trend.
RealEstateAgent
typeOne agent card.
RealEstateStat
type{ value, label }.
RealEstateSearch
typeWhat onSearch receives: { mode, location, price, minBeds }.
RealEstateMortgage
typeThe calculator's numbers: price, downPayment, rate, term, taxRate, insurance, hoa.
RealEstateMapBounds
type{ north, south, west, east }.
RealEstateValuationValues
typeWhat onValuation receives.
RealEstatePropertyType
type"house" | "townhouse" | "condo" | "coop" | "multi".
RealEstateTimeline
type"now" | "soon" | "later": when the owner plans to sell.
Examples
Rentals
defaultMode="rent": monthly prices, rent price bands, rent medians on the neighborhood tiles and the rentals on the map.
Brand accents
tone, ctaTone and a red favoriteTone on an aurora page with tinted bands: orange pins, sliders and buttons, red hearts.
A listings site, search first
Listings, map and mortgage only, square-ish cards, eight featured homes and a soft background: a lean portal for a single office.
When the request fails
onValuation rejects: after the spinner the form keeps everything and shows the error above the button.
Inside a site layout
No header or footer, on a plain page with dotted bands: the sections alone.
Dependencies
Files
- components/templates/real-estate-page.tsx
- components/templates/real-estate-page-data.ts
FAQ
Is the React Real Estate Page template free?
The preview, props and docs are free; copying the source needs a Pro plan. See plans.
How do I install Real Estate Page?
Run npx wingo-ui@latest add real-estate-page. It also adds the Wingo UI items it builds on (Marketing Section, Marketing Header, Marketing Footer, Testimonials Section, Avatar and 13 more) and the npm packages lucide-react and motion. With shadcn, add the @wingo-ui registry with your API key, then run npx shadcn@latest add @wingo-ui/real-estate-page.
How does Real Estate Page behave on phones?
On phones the search is a stacked card: Filters opens a bottom sheet with a price slider over a price histogram, preset chips and a beds switch, and Show homes closes it on the results; the homes become a swipeable snap rail.
See also
Related guides
- Nextjs Real Estate Template: Search, Map and Mortgage
Build it: screens and apps10 min read