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

Home Services Page

Templates

Home Services Page React template for Tailwind CSS v4

Design
Help Center PageImpact Page
Design
Live props
Appearance
design
tone
ctaTone
radius
background
backgroundColor
bandBackground
bandColor
Content
heroImage
defaultService
financingHref
currency
locale
Behavior
zipPattern
animateIn
Layout
serviceColumns3
showServices
showEstimator
showProjects
showProcess
showPromises
showAreas
showReviews
showEmergency
showFaq
stickyBar
header
footer
Code
import HomeServicesPage from "@/components/templates/home-services-page"

<HomeServicesPage />
  1. Home
  2. Templates
  3. Home Services Page
Pro

Home Services Page React template for Tailwind CSS v4

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

  • Marketing Sectionmarketing-section
  • Marketing Headermarketing-header
  • Marketing Footermarketing-footer
  • CTA Sectioncta-section
  • FAQ Sectionfaq-section
  • Steps Sectionsteps-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 home-services-page

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

    A photo url for the hero; empty draws a re-roofed house.

  • defaultServicedefault ""
    string

    A service id picked when the estimator opens (it then starts on the size question); empty starts with no service.

  • zipPatterndefault "^[0-9]{5}$"
    string

    A regular expression a ZIP code must match, in the area check and the contact step.

  • financingHrefdefault "/financing"
    string

    Where the financing tile and the footer link go.

  • currencydefault "USD"
    string

    ISO 4217 currency of the starting prices, the estimate range and project budgets.

  • localedefault ""
    string

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

  • serviceColumnsdefault 3
    2 | 3

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

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

    The tint of tinted and gradient bands; defaults to backgroundColor.

  • showServicesdefault true
    boolean

    The service cards with starting prices.

  • showEstimatordefault true
    boolean

    The quote estimator. Off, the quote buttons and the sticky bar call instead.

  • showProjectsdefault true
    boolean

    The before and after projects.

  • showProcessdefault true
    boolean

    The How it works steps.

  • showPromisesdefault true
    boolean

    The financing and guarantee tiles.

  • showAreasdefault true
    boolean

    The service area list and its ZIP check, plus the ZIP check in the hero.

  • showReviewsdefault true
    boolean

    The reviews with the rating summary.

  • showEmergencydefault true
    boolean

    The 24/7 emergency band with tap-to-call.

  • showFaqdefault true
    boolean

    The FAQ with a call card.

  • stickyBardefault true
    boolean

    On phones, a bar with Call and Get a free quote sticks to the bottom while the estimator is off screen.

  • headerdefault true
    boolean

    The sticky header with the brand, section links, the phone number and Get a free quote.

  • footerdefault true
    boolean

    The footer with Services, Company and Help links.

  • headerProps
    Partial<MarketingHeaderProps>

    Anything for MarketingHeader (layout, variant, items...).

  • footerProps
    Partial<MarketingFooterProps>

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

  • compareProps
    Partial<ImageCompareProps>

    Anything for every project's ImageCompare (handle, aspectRatio, mode...).

  • processProps
    Partial<StepsSectionProps>

    Anything for the How it works StepsSection (layout, marker...).

  • reviewsProps
    Partial<ReviewsProps>

    Anything for Reviews (layout, sortable, onWriteReview, hasMore...).

  • faqProps
    Partial<FaqSectionProps>

    Anything for the FaqSection (layout, searchable, categories...).

  • emergencyProps
    Partial<CtaSectionProps>

    Anything for the emergency CtaSection (variant, title, actions...).

  • stickyBarProps
    Partial<StickyCtaBarProps>

    Anything for the phone StickyCtaBar (variant, showOn, hideOnScroll...).

  • animateIndefault true
    boolean

    The hero copy rises 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 header, footer, financing and FAQ links (next/link in an app).

  • labels
    Partial<HomeServicesPageLabels>

    Every string of the page (DEFAULT_HOME_SERVICES_PAGE_LABELS), in English by default; some are functions (callNumber, zipFound, estimateRange...).

  • className
    string

    Classes for the root.

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

    constant

    All the sample content of Keystone Home Services in one object: business, services, estimator, projects, steps, promises, reviews, reviewsSummary and faqs.

  • HOME_SERVICES_BUSINESS

    constant

    Keystone Home Services, Columbus, Ohio: phone lines, license, hours, rating and ten served towns with their ZIP codes.

  • HOME_SERVICES

    constant

    Plumbing, heating and cooling, water heaters, roofing, kitchen and bath remodeling, and electrical, with prices and estimate ranges.

  • HOME_SERVICES_ESTIMATOR

    constant

    Small / Medium / Large sizes and Within 48 hours / This month / Flexible timelines with their factors.

  • HOME_SERVICES_PROJECTS

    constant

    A Dublin kitchen, a Bexley bathroom and a Westerville roof, drawn before and after.

  • HOME_SERVICES_STEPS

    constant

    The four How it works steps.

  • HOME_SERVICES_PROMISES

    constant

    Financing, the two-year guarantee, flat pricing and background-checked pros.

  • HOME_SERVICES_REVIEWS

    constant

    Five verified homeowner reviews.

  • HOME_SERVICES_REVIEWS_SUMMARY

    constant

    4.9 from 1,268 reviews with the star distribution and three aspects.

  • HOME_SERVICES_FAQS

    constant

    Six questions about estimates, licenses, fees, financing, the guarantee and the service area.

  • HOME_SERVICES_PAGE_DESIGNS

    constant

    The design names: ["classic", "bold", "minimal"].

  • DEFAULT_HOME_SERVICES_PAGE_LABELS

    constant

    The 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

    type

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

  • HomeServicesPageLabels

    type

    Every string of the page.

  • HomeServicesPageSlot

    type

    The keys of classNames.

  • HomeServicesPageDesign

    type

    "classic" | "bold" | "minimal".

  • HomeServicesPageRadius

    type

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

  • HomeServicesPageServiceColumns

    type

    2 | 3.

  • HomeServicesQuoteRequest

    type

    What onQuote receives.

  • HomeServicesQuoteResult

    type

    What onQuote may resolve with: { reference? }.

  • HomeServicesAreaCheckResult

    type

    What onAreaCheck may return: boolean, an area, its name, null or undefined.

  • HomeServicesBusiness

    type

    The business: name, phones, license, address, hours, rating and areas.

  • HomeServicesArea

    type

    { name, zips, note? }: one served town.

  • HomeService

    type

    One service card and estimator option.

  • HomeServicesEstimator

    type

    The price rules: sizes, timelines, defaults and rounding.

  • HomeServicesEstimateOption

    type

    { id, label, description?, factor }: one size or timeline.

  • HomeServicesProject

    type

    One before and after project.

  • HomeServicesStep

    type

    { icon?, title, description, meta? }: one How it works step.

  • HomeServicesPromise

    type

    One financing or guarantee tile.

  • HomeServicesIcon

    type

    The names of the drawn glyphs for services, steps and promises.

  • HomeServicesScene

    type

    "kitchen" | "bathroom" | "exterior".

Examples

Open

Bold design

Bigger, heavier type on an aurora page with tinted bands, and the process as numbered cards.

Open

Minimal design

A plain page with no bands, border-only cards and a vertical process rail.

Open

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.

Open

A cleaning company

Other services, prices and copy through props: the same page fits plumbing, HVAC, roofing, remodeling or cleaning.

Open

Same team every visit

Open

Got the full deposit back

Open

Pick a plan

Choose a one-time or recurring clean online in two minutes.

Open

Meet your team

The same two cleaners arrive on time with everything they need.

Open

Check the result

Missed a spot? Tell us within 24 hours and we come back free.

Open

When the request fails

onQuote rejects: the button spins, the answers stay and the form says the request could not be sent.

Dependencies

lucide-reactmotionmarketing-sectionmarketing-headermarketing-footercta-sectionfaq-sectionsteps-sectionbadgebuttonimage-compareinputphone-inputradio-groupreviewsstepssticky-cta-bartextareanavigationmotiontonesui-config

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.

See also

Restaurant PageLanding PageImage compareForm WizardReviews
PreviousHelp Center PageNext Impact Page