Skip to content
WingoUI
ComponentsTemplatesDocsPricingAI agentsBlogChangelogContact
Components
Buttons & Actions
ButtonButton GroupCopy ButtonDelete ButtonTheme ToggleToggleToggle Group
Inputs
Avatar UploadCalendarCheckboxColor PickerComboboxCountry SelectCron PickerCurrency InputDate PickerDate Range PickerDate Time PickerDuration PickerEmail InputEmoji PickerFile UploadFilter BuilderInputInput GroupListboxMasked InputMention InputMonth PickerMulti SelectNumber InputOTP InputPassword InputPhone InputRadio GroupRatingSearch InputSegmented ControlSelectSignature PadSliderSwitchTag InputTextareaTime PickerTimezone SelectTree Select
Forms
Address InputBooking WidgetCSV ImportFieldForm WizardInline EditInvoice line itemsRich Text EditorSchema Builder
Navigation
Back To TopBounce SidebarBreadcrumbCommand MenuGlobal SearchGooey NavHook SidebarNav MenuNav TabsPaginationProximity SidebarScroll ProgressSidebarStepsTable Of ContentsTabsTopbarUser MenuWorkspace Switcher
Overlays
Alert DialogContext MenuDialogDrawerDropdown MenuFamily DrawerHover CardPopoverShare DialogSheetShortcuts DialogTooltipTour
Feedback
AlertBannerCookie ConsentEmoji ReactionEmpty StateNotification BellNotification CenterProgressRoute ProgressSetup ChecklistSkeletonSpinnerToast
Data Display
Approval FlowAvatarBadgeCalendar ViewCode BlockComment ThreadContact cardCountdownDescription ListDiff ViewerFile ListFile managerFolderGanttJSON ViewerKbdLog ViewerMarkdownPresenceSchedulerTagTimelineTree View
Tables & Lists
Audit LogData TableDeal PipelineEditable GridKanbanListMembers tablePermissions MatrixTableTask ListVirtual List
Charts & Stats
Animated CounterArea chartBar chartDonut chartFunnel chartGaugeGitHub ActivityHeatmap calendarLeaderboardLine chartRadar chartRadial barSparklineStat CardTrackerTrend badge
Layout
AccordionApp ShellCardCollapsibleDetail LayoutEntity HeaderPage HeaderScroll AreaSeparatorSettings LayoutSplit ViewToolbar
Media
Audio PlayerCarouselCSV ViewerDOCX EditorDOCX ViewerExcel ViewerFile SystemImage compareImage CropperImage GalleryImage LightboxLocation MapPDF ViewerPowerPoint ViewerQR CodeStep PlayerVideo Player
AI Kit
Agent Status CardChat MessageChat ThreadChat WidgetConversation ListFluid OrbGrid RevealMatrix OrbModel PickerPrompt InputReasoning IndicatorRule BuilderSuggestion ChipsTool Call TimelineUsage MeterVoice InputWorkflow Canvas
Text & Effects
Background PatternGravity LettersMarqueeTerminalText AnimateText Rotate
Mobile
Action SheetBottom Tab BarFABHaptic ButtonHero HeaderInstall PromptLarge Title HeaderNotification BannerOnboarding CarouselPicker WheelPull To RefreshSlide To ConfirmSticky CTA BarSwipe DeckSwipeable Tabs
Commerce
Cart drawerCategory pickerCheckout stepsCoupon inputFavorite buttonFilter panelListing cardListing gridOrder trackerPricePrice rangePricing tableProduct galleryQuantity stepperReviewsSeller card
Marketing Sections
App Download SectionBlog Cards SectionCTA SectionFAQ SectionFeature GridFeature ShowcaseHero SectionIntegrations SectionLogo CloudMarketing FooterMarketing HeaderMarketing SectionNewsletter SectionPricing SectionStats SectionSteps SectionTeam SectionTestimonials SectionTimeline SectionVideo Section
Blocks
Admin Dashboard PageAdmin ShellAI Chat PageAPI Keys PageAutomation Builder PageCheckout PageCRM Contact PageCRM Pipeline PageError PagesInbox PageInvoice PageKPI DashboardListing Detail PageLogin PageMarketplace Home PageMarketplace Search PageMarketplace ShellMobile App HomeOnboarding FlowOrder History PagePost Listing WizardPricing PageProfile PageRegister PageSettings PageUsers Admin Page
Templates
About PageAcademy PageAccessibility PageAffiliate PageAgency PageAI Product PageAppointment Booking PageBlog PageBlog Post PageBug Bounty PageCareers PageChangelog PageCommunity PageCompare PageContact PageCustomer Story PageCustomers PageDemo Booking PageDevelopers PageDocs Home PageDownload PageEnterprise PageEvents PageExperts PageFAQ PageFeature PageGlossary PageHelp Article PageHelp Center PageHome Services PageImpact PageIntegration Detail PageIntegrations PageJob Detail PageLanding PageLaunch PageLegal PageManifesto PagePortfolio PagePress PageProduct Tour PagePromo PageReal Estate PageReferral PageResearch Report PageRestaurant PageRoadmap PageROI Calculator PageSecurity PageSolutions PageStartups PageStatus PageStorefront PageSwitch PageTemplate Gallery PageTravel PageWaitlist PageYear in Review Page
Hooks & Utilities
AI ChatChart kitCommerceDate utilsFile exportFile typesFiltersForm validationHapticsInvoicingMotion presetsNavigationNumber formatRelative timeRomanian locationsSpreadsheetText matchTonesUIProvideruseClipboarduseConsentuseControllableStateuseCooldownuseDebounceuseKeyboardInsetuseLocaleuseLongPressuseMediaControlsuseMediaQueryuseOverflowItemsusePersistedStateuseScrollEdgesuseScrollStateuseSelectionuseShortcutuseStickToBottom
GalleryTheme

Templates

Real Estate Page

Templates

Real Estate Page React template for Tailwind CSS v4

Promo PageReferral Page
Live props
Content
phone
currency
locale
State
defaultMode
Layout
featuredCount
showMap
showNeighborhoods
showMortgage
showAgents
showTestimonials
showValuation
header
footer
Appearance
tone
ctaTone
favoriteTone
radius
background
backgroundColor
bandBackground
bandColor
Behavior
animateIn
Code
import { RealEstatePage } from "@/components/templates/real-estate-page"

<RealEstatePage />
  1. Home
  2. Templates
  3. Real Estate Page
Pro

Real Estate Page React template for Tailwind CSS v4

v1.0.0·Added 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.

  • Marketing Sectionmarketing-section
  • Marketing Headermarketing-header
  • Marketing Footermarketing-footer
  • Testimonials Sectiontestimonials-section

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-page

Real 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"
    string

    The office number in the header, the phone menu and the valuation band (a tel: link); empty hides it.

  • labels
    Partial<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"
    string

    ISO currency of every price, pin, median and payment.

  • localedefault ""
    string

    Intl 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") => void

    Fires when the Buy / Rent switch changes.

  • onSearch
    (search: RealEstateSearch) => void

    Runs 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.

  • featuredCountdefault 6
    number

    Listing 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)"
    string

    The 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)"
    string

    The tint of tinted and gradient bands; left equal to backgroundColor it follows it.

  • showMapdefault true
    boolean

    The map band with the price pins and the list beside it (and its header link).

  • showNeighborhoodsdefault true
    boolean

    The neighborhood tiles with medians and trends.

  • showMortgagedefault true
    boolean

    The mortgage estimate; off also removes Estimate payment from the map preview.

  • showAgentsdefault true
    boolean

    The agent cards with Call and Email links.

  • showTestimonialsdefault true
    boolean

    The testimonials section.

  • showValuationdefault true
    boolean

    The Request a valuation band. Off, Free valuation in the header calls the office instead.

  • headerdefault true
    boolean

    The sticky header with the brand, the section links, the phone number and Free valuation.

  • footerdefault true
    boolean

    The footer with Buy, Rent, Sell and Company links and the broker's legal line.

  • headerProps
    Partial<MarketingHeaderProps>

    Anything for MarketingHeader (layout, variant, items...); wins over the page's own values.

  • footerProps
    Partial<MarketingFooterProps>

    Anything for MarketingFooter (variant, columns, socials, newsletter...).

  • testimonialsProps
    Partial<TestimonialsSectionProps>

    Anything for the TestimonialsSection (layout, columns, card...).

  • animateIndefault true
    boolean

    The 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) => ReactNode

    The router link for the listing, header and footer links (next/link in an app).

  • className
    string

    Classes for the root.

  • classNames
    Partial<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

    constant

    All the sample content in one object: listings, neighborhoods, agents and testimonials.

  • REAL_ESTATE_LISTINGS

    constant

    Eight Brooklyn homes for sale and six rentals from Greenpoint to Park Slope, with map coordinates.

  • REAL_ESTATE_NEIGHBORHOODS

    constant

    Park Slope, Williamsburg, DUMBO, Fort Greene, Bed-Stuy and Greenpoint.

  • REAL_ESTATE_AGENTS

    constant

    Four Harbor & Pine agents with phone, email, sales, rating and areas.

  • REAL_ESTATE_TESTIMONIALS

    constant

    Three quotes from a buyer, a seller and a renter.

  • REAL_ESTATE_STATS

    constant

    The three numbers under the search.

  • REAL_ESTATE_PRICE_PRESETS

    constant

    Four price bands for buying and four for renting.

  • REAL_ESTATE_MAP_BOUNDS

    constant

    The 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

    constant

    The English strings.

  • RealEstatePageProps

    type

    Props of RealEstatePage, including the attributes of the root element.

  • RealEstatePageLabels

    type

    Every string of the page.

  • RealEstatePageRadius

    type

    "none" | "sm" | "md" | "lg".

  • RealEstatePageSlot

    type

    The keys of classNames.

  • RealEstateMode

    type

    "buy" | "rent".

  • RealEstateListing

    type

    One home: price, address, facts, the drawn photo and the map position.

  • RealEstateHomeKind

    type

    "brownstone" | "condo" | "loft" | "house" | "townhouse": the drawn photos.

  • RealEstateNeighborhood

    type

    One neighborhood tile with its medians and trend.

  • RealEstateAgent

    type

    One agent card.

  • RealEstateStat

    type

    { value, label }.

  • RealEstateSearch

    type

    What onSearch receives: { mode, location, price, minBeds }.

  • RealEstateMortgage

    type

    The calculator's numbers: price, downPayment, rate, term, taxRate, insurance, hoa.

  • RealEstateMapBounds

    type

    { north, south, west, east }.

  • RealEstateValuationValues

    type

    What onValuation receives.

  • RealEstatePropertyType

    type

    "house" | "townhouse" | "condo" | "coop" | "multi".

  • RealEstateTimeline

    type

    "now" | "soon" | "later": when the owner plans to sell.

Examples

Open

Rentals

defaultMode="rent": monthly prices, rent price bands, rent medians on the neighborhood tiles and the rentals on the map.

Open

Brand accents

tone, ctaTone and a red favoriteTone on an aurora page with tinted bands: orange pins, sliders and buttons, red hearts.

Open

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.

Open

When the request fails

onValuation rejects: after the spinner the form keeps everything and shows the error above the button.

Open

Inside a site layout

No header or footer, on a plain page with dotted bands: the sections alone.

Dependencies

lucide-reactmotionmarketing-sectionmarketing-headermarketing-footertestimonials-sectionavatarbuttonfavorite-buttoninputprice-rangesegmented-controlselectsheetslideruse-controllable-statenavigationmotiontonesui-config

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

Listing cardListing gridLocation MapPrice rangeLanding Page

Related guides

  • Nextjs Real Estate Template: Search, Map and Mortgage

    Build it: screens and apps · Nov 6, 2026 · 10 min read

PreviousPromo PageNext Referral Page