Home Services Page React template for Tailwind CSS v4
v1.0.0Added in 1.14.0
A React home services and contractor website template: ZIP check, priced services, a quote estimator, before and after projects.
A local contractor's home page. The hero shows Licensed and insured, the star rating, Get a free quote (glides down to the estimator and focuses its question), a tap-to-call button and a ZIP code check: type a ZIP and press Check or Enter, and it says whether the area is served (a returned promise shows a spinner), and the matching town lights up in the service area list. Service cards show starting prices and features; their Get a free quote button picks that service in the estimator and opens its next step. The estimator asks one question per screen: service, project size and timeline (card radio groups, arrow keys move inside each), then name, phone (with a country picker, a bottom sheet on phones), email, ZIP (prefilled from the area check) and notes. A stepper on top shows progress and jumps back to finished steps; Continue and Back move between steps and focus lands on each new question. The price range updates live in a side panel from 1024px and in a strip under the question on smaller screens, announced to screen readers. Contact fields are validated on submit with focus on the first problem; the button spins while onQuote runs, then a confirmation shows the service, range, timeline and a request number with Start another quote. Before and after pictures compare by dragging the handle, tapping, or with arrow keys; on phones the projects form a swipeable snap rail. The process steps, financing and guarantee tiles, service area list, reviews (filter by stars), an emergency band with a call button and Request urgent service (which picks the fastest timeline), and an FAQ with a call card follow. On phones a bar with Call and Get a free quote sticks to the bottom while the estimator is off screen.
Home Services 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 home-services-page, together with Marketing Section, Marketing Header, Marketing Footer, CTA Section, FAQ Section and 15 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 home-services-pageHome Services 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 HomeServicesPage from @/components/templates/home-services-page.
// app/page.tsx
"use client"
import Link from "next/link"
import { HomeServicesPage, type HomeServicesQuoteRequest } from "@/components/templates/home-services-page"
async function requestQuote(request: HomeServicesQuoteRequest) {
const response = await fetch("/api/quotes", { method: "POST", body: JSON.stringify(request) })
if (!response.ok) throw new Error("Quote request failed")
return (await response.json()) as { reference: string }
}
export default function HomeRoute() {
return <HomeServicesPage linkComponent={Link} onQuote={requestQuote} />
}Props
designdefault"classic""classic" | "bold" | "minimal"The whole page's look. classic: a blue blueprint grid page with muted bands and raised cards; bold: bigger heavier type, an aurora page with tinted bands and cards for the process; minimal: a plain page with no bands, border-only cards and a vertical process. Each design picks its own backgrounds unless you set them.
businessdefault"HOME_SERVICES_BUSINESS"HomeServicesBusiness{ name, tagline?, phone, emergencyPhone?, email, license, street, city, hours, rating?, reviewCount?, yearsInBusiness?, nextAvailable?, areas: { name, zips, note? }[] }: the brand, hero badges, phone links, the license line and the served areas the ZIP check looks up.
servicesdefault"HOME_SERVICES"HomeService[]{ id, name, description, icon?, startingAt, unit?, estimate: { min, max }, features?, popular? }: the service cards and the estimator's first question. icon is a drawn glyph by name ("plumbing", "hvac", "roofing", "remodeling", "electrical", "cleaning", "painting", "water-heater"); estimate is a typical medium job before the size and timeline factors.
estimatordefault"HOME_SERVICES_ESTIMATOR"HomeServicesEstimator{ sizes, timelines, defaultSize?, defaultTimeline?, round? }: the price rules. sizes and timelines are { id, label, description?, factor } options; the range is the service's estimate times both factors, rounded to round currency units (default 50).
projectsdefault"HOME_SERVICES_PROJECTS"HomeServicesProject[]{ id, title, location, service, duration, budget?, description, scene?, before?, after? }: the before and after cards. before / after take image urls; without them the scene is drawn ("kitchen", "bathroom", "exterior").
stepsdefault"HOME_SERVICES_STEPS"HomeServicesStep[]{ icon?, title, description, meta? }: the How it works steps.
promisesdefault"HOME_SERVICES_PROMISES"HomeServicesPromise[]{ id, icon?, title, description, href?, linkLabel? }: the financing and guarantee tiles. The promise with id financing links to financingHref.
reviewsdefault"HOME_SERVICES_REVIEWS"ReviewData[]The homeowner reviews in the Reviews shape.
reviewsSummarydefault"HOME_SERVICES_REVIEWS_SUMMARY"ReviewsSummaryData{ average, count, distribution, aspects? }: the rating summary beside the reviews.
faqsdefault"HOME_SERVICES_FAQS"FaqItem[]{ question, answer }: the FAQ. An empty array hides the section.
heroImagedefault""stringA photo url for the hero; empty draws a re-roofed house.
defaultServicedefault""stringA service id picked when the estimator opens (it then starts on the size question); empty starts with no service.
zipPatterndefault"^[0-9]{5}$"stringA regular expression a ZIP code must match, in the area check and the contact step.
financingHrefdefault"/financing"stringWhere the financing tile and the footer link go.
currencydefault"USD"stringISO 4217 currency of the starting prices, the estimate range and project budgets.
localedefault""stringIntl locale for prices and numbers; empty uses the UIProvider's, else en-US.
onQuote(request: HomeServicesQuoteRequest) => void | HomeServicesQuoteResult | Promise<HomeServicesQuoteResult | void>Gets { service, size, timeline, name, phone (E.164), email, zip, notes, estimate: { min, max } }. A returned promise keeps the button loading; resolve with { reference } to show your own request number; a rejection keeps the form filled and shows labels.quoteFailed. Without it the page pretends for 900ms.
onAreaCheck(zip: string) => HomeServicesAreaCheckResult | Promise<HomeServicesAreaCheckResult>Decides whether a ZIP is served: return true / false, the matching area or its name, or a promise of one (the button spins). Default: the ZIP is looked up in business.areas.
tonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"Accents: icon tiles, chosen estimator cards, the stepper, the matched area and the review stars.
ctaTonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"Get a free quote buttons, the estimator's submit, the sticky bar and the emergency call button.
radiusdefault"lg""none" | "sm" | "md" | "lg"Corners of cards, panels and pictures (0 / 12 / 16 / 24px), with matching inner tiles.
serviceColumnsdefault32 | 3Service card columns from 1024px; phones get one, tablets two.
backgrounddefault"grid""plain" | "soft" | "glow" | "aurora" | "grid" | "dots"The main background. A design picks its own unless you set one (classic: grid, bold: aurora, minimal: plain).
backgroundColordefault"oklch(0.58 0.12 245)"stringThe tint of the main background; each design has its own (blueprint blue, green, slate).
bandBackgrounddefault"muted""muted" | "tinted" | "gradient" | "dots"The look of the alternating bands (classic: muted, bold: tinted; minimal has no bands). Cards inside a band are lifted above it.
bandColordefault"oklch(0.58 0.12 245)"stringThe tint of tinted and gradient bands; defaults to backgroundColor.
showServicesdefaulttruebooleanThe service cards with starting prices.
showEstimatordefaulttruebooleanThe quote estimator. Off, the quote buttons and the sticky bar call instead.
showProjectsdefaulttruebooleanThe before and after projects.
showProcessdefaulttruebooleanThe How it works steps.
showPromisesdefaulttruebooleanThe financing and guarantee tiles.
showAreasdefaulttruebooleanThe service area list and its ZIP check, plus the ZIP check in the hero.
showReviewsdefaulttruebooleanThe reviews with the rating summary.
showEmergencydefaulttruebooleanThe 24/7 emergency band with tap-to-call.
showFaqdefaulttruebooleanThe FAQ with a call card.
stickyBardefaulttruebooleanOn phones, a bar with Call and Get a free quote sticks to the bottom while the estimator is off screen.
headerdefaulttruebooleanThe sticky header with the brand, section links, the phone number and Get a free quote.
footerdefaulttruebooleanThe footer with Services, Company and Help links.
headerPropsPartial<MarketingHeaderProps>Anything for MarketingHeader (layout, variant, items...).
footerPropsPartial<MarketingFooterProps>Anything for MarketingFooter (variant, columns, socials...).
comparePropsPartial<ImageCompareProps>Anything for every project's ImageCompare (handle, aspectRatio, mode...).
processPropsPartial<StepsSectionProps>Anything for the How it works StepsSection (layout, marker...).
reviewsPropsPartial<ReviewsProps>Anything for Reviews (layout, sortable, onWriteReview, hasMore...).
faqPropsPartial<FaqSectionProps>Anything for the FaqSection (layout, searchable, categories...).
emergencyPropsPartial<CtaSectionProps>Anything for the emergency CtaSection (variant, title, actions...).
stickyBarPropsPartial<StickyCtaBarProps>Anything for the phone StickyCtaBar (variant, showOn, hideOnScroll...).
animateIndefaulttruebooleanThe hero copy rises 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 header, footer, financing and FAQ links (next/link in an app).
labelsPartial<HomeServicesPageLabels>Every string of the page (DEFAULT_HOME_SERVICES_PAGE_LABELS), in English by default; some are functions (callNumber, zipFound, estimateRange...).
classNamestringClasses for the root.
classNamesPartial<Record<HomeServicesPageSlot, string>>Classes for header, hero, heroMedia, areaCheck, services, serviceCard, estimator, estimate, confirmation, projects, projectCard, process, promises, areas, reviews, emergency, faq, footer and stickyBar.
Parts
HOME_SERVICES_PAGE_SAMPLE
constantAll the sample content of Keystone Home Services in one object: business, services, estimator, projects, steps, promises, reviews, reviewsSummary and faqs.
HOME_SERVICES_BUSINESS
constantKeystone Home Services, Columbus, Ohio: phone lines, license, hours, rating and ten served towns with their ZIP codes.
HOME_SERVICES
constantPlumbing, heating and cooling, water heaters, roofing, kitchen and bath remodeling, and electrical, with prices and estimate ranges.
HOME_SERVICES_ESTIMATOR
constantSmall / Medium / Large sizes and Within 48 hours / This month / Flexible timelines with their factors.
HOME_SERVICES_PROJECTS
constantA Dublin kitchen, a Bexley bathroom and a Westerville roof, drawn before and after.
HOME_SERVICES_STEPS
constantThe four How it works steps.
HOME_SERVICES_PROMISES
constantFinancing, the two-year guarantee, flat pricing and background-checked pros.
HOME_SERVICES_REVIEWS
constantFive verified homeowner reviews.
HOME_SERVICES_REVIEWS_SUMMARY
constant4.9 from 1,268 reviews with the star distribution and three aspects.
HOME_SERVICES_FAQS
constantSix questions about estimates, licenses, fees, financing, the guarantee and the service area.
HOME_SERVICES_PAGE_DESIGNS
constantThe design names: ["classic", "bold", "minimal"].
DEFAULT_HOME_SERVICES_PAGE_LABELS
constantThe English strings.
drawHomeServicesScene
function(kind, "before" | "after") returns an svg data url of a drawn kitchen, bathroom or house exterior, for an img or an ImageCompare layer.
HomeServicesPageProps
typeProps of HomeServicesPage, including the attributes of the root element.
HomeServicesPageLabels
typeEvery string of the page.
HomeServicesPageSlot
typeThe keys of classNames.
HomeServicesPageDesign
type"classic" | "bold" | "minimal".
HomeServicesPageRadius
type"none" | "sm" | "md" | "lg".
HomeServicesPageServiceColumns
type2 | 3.
HomeServicesQuoteRequest
typeWhat onQuote receives.
HomeServicesQuoteResult
typeWhat onQuote may resolve with: { reference? }.
HomeServicesAreaCheckResult
typeWhat onAreaCheck may return: boolean, an area, its name, null or undefined.
HomeServicesBusiness
typeThe business: name, phones, license, address, hours, rating and areas.
HomeServicesArea
type{ name, zips, note? }: one served town.
HomeService
typeOne service card and estimator option.
HomeServicesEstimator
typeThe price rules: sizes, timelines, defaults and rounding.
HomeServicesEstimateOption
type{ id, label, description?, factor }: one size or timeline.
HomeServicesProject
typeOne before and after project.
HomeServicesStep
type{ icon?, title, description, meta? }: one How it works step.
HomeServicesPromise
typeOne financing or guarantee tile.
HomeServicesIcon
typeThe names of the drawn glyphs for services, steps and promises.
HomeServicesScene
type"kitchen" | "bathroom" | "exterior".
Examples
Bold design
Bigger, heavier type on an aurora page with tinted bands, and the process as numbered cards.
Minimal design
A plain page with no bands, border-only cards and a vertical process rail.
Brand accents and a picked service
ctaTone and tone set to brand, and defaultService="hvac": the estimator opens on the size question with a live range.
A cleaning company
Other services, prices and copy through props: the same page fits plumbing, HVAC, roofing, remodeling or cleaning.
Same team every visit
Got the full deposit back
Pick a plan
Choose a one-time or recurring clean online in two minutes.
Meet your team
The same two cleaners arrive on time with everything they need.
Check the result
Missed a spot? Tell us within 24 hours and we come back free.
When the request fails
onQuote rejects: the button spins, the answers stay and the form says the request could not be sent.
Dependencies
Files
- components/templates/home-services-page.tsx
- components/templates/home-services-page-data.ts
FAQ
Is the React Home Services Page template free?
The preview, props and docs are free; copying the source needs a Pro plan. See plans.
How do I install Home Services Page?
Run npx wingo-ui@latest add home-services-page. It also adds the Wingo UI items it builds on (Marketing Section, Marketing Header, Marketing Footer, CTA Section, FAQ Section and 15 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/home-services-page.
How does Home Services Page behave on phones?
The estimator asks one question per screen: service, project size and timeline (card radio groups, arrow keys move inside each), then name, phone (with a country picker, a bottom sheet on phones), email, ZIP (prefilled from the area check) and notes.