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

Blocks

Marketplace Home Page

Blocks

Marketplace Home Page React block for Tailwind CSS v4

Login PageMarketplace Search Page
Live props
State
defaultLocation
loading
Appearance
heroVariant
cardSize
tone
radius
Layout
showPromoted
showRecent
showTrust
showApp
Content
recentCount12
appUrl
appStoreHref
googlePlayHref
categoriesHref
deliveryFrom
locale
currency
Behavior
animateIn
Code
import { MarketplaceHomePage } from "@/components/blocks/marketplace-home-page"

<MarketplaceHomePage />
  1. Home
  2. Components
  3. Blocks
  4. Marketplace Home Page
Pro

Marketplace Home Page React block for Tailwind CSS v4

v1.0.1·Updated in 1.9.0

A React marketplace home page with a what and where search, category tiles, a promoted rail, new listings near you and an app band.

Type what you look for in the hero search, pick the place in the location field (it filters the towns of lib/ro-locations, accents optional, and offers All locations) and press Enter or Search: onSearch gets the text and the city id, by default the page navigates to /search?q=…&loc=…. Below 768px the two fields and the button stack and the location opens a full height sheet. The popular searches under it are links (a sideways scroll on phones). The category tiles are links to /search?cat=…; arrow keys move between them, phones show the first nine and All categories below. Promoted listings is a swipeable rail (1.3 cards on a phone, 4 on a laptop) with arrow buttons in its header on fine pointers and arrow keys when it has focus; the Promoted badge opens an explanation (a popover, a bottom sheet on phones). New listings in Cluj-Napoca: the city chip opens a searchable list of places (a sheet on phones) and the grid shows the newest listings there; a city with nothing yet shows No listings in Sibiu yet with Search every location. Hearts save a listing at once, in the rail and in the grid together; a rejected onFavoriteChange rolls the heart back. See all listings opens the results. The trust tiles and the app band (bullets, App Store and Google Play buttons, a QR code to scan on desktop) close the page. Sections rise in once when the page mounts on the client; reduced motion skips it.

Marketplace Home Page is a Pro React block in the React blocks category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add marketplace-home-page, together with Badge, Button, Carousel, Category picker, Combobox and 19 more and the npm packages motion and lucide-react.

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

Marketplace Home 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 MarketplaceHomePage from @/components/blocks/marketplace-home-page.

// app/(market)/page.tsx (the shell lives in app/(market)/layout.tsx)
"use client"

import { useRouter } from "next/navigation"
import { MarketplaceHomePage } from "@/components/blocks/marketplace-home-page"

export default function HomePage() {
  const router = useRouter()
  return (
    <MarketplaceHomePage
      defaultLocation="cluj-napoca"
      onSearch={({ query, location }) => router.push(`/search?q=${encodeURIComponent(query)}&loc=${location}`)}
      onFavoriteChange={(id, favorite) => fetch(`/api/favorites/${id}`, { method: favorite ? "PUT" : "DELETE" })}
    />
  )
}

Props

  • categories
    MarketplaceHomeCategory[]

    The category tiles (MARKETPLACE_HOME_SAMPLE.categories: the 12 Northwind Market categories with lucide icons and counts). Each links to /search?cat=<id> unless it has its own href.

  • promoted
    ListingData[]

    The promoted rail (MARKETPLACE_HOME_SAMPLE.promoted: l02, l04 and six generated promoted ads). Empty hides the section.

  • recent
    ListingData[]

    The newest listings, newest first (MARKETPLACE_HOME_SAMPLE.recent: l01 to l08 plus 16 generated, mostly in Cluj-Napoca). The grid keeps the listings whose location starts with the chosen city.

  • popularSearches
    string[]

    The quick searches under the hero search (MARKETPLACE_HOME_SAMPLE.popularSearches: iPhone 14, Bike, 2-bedroom apartment...).

  • stats
    { listings: number; sellers: number; cities: number }

    The hero subline (MARKETPLACE_HOME_SAMPLE.stats: 1,284,310 listings in 3,180 towns and villages), through labels.stats.

  • location
    string

    The chosen city, a ro-locations id; controlled with onLocationChange. "" is every location, an unknown id reads as All locations.

  • defaultLocationdefault "cluj-napoca"
    string

    The starting city of the recent section and the hero search while uncontrolled.

  • onLocationChange
    (location: string) => void

    Every city change, from the hero field, the chip or the empty state.

  • onSearch
    (query: { query: string; location: string; category: string }) => void

    The hero search. Default: navigates to /search?q=…&loc=… through the link provider's navigate.

  • heroVariantdefault "panel"
    "panel" | "plain"

    panel: a tinted rounded hero with a photo mosaic from 768px (flat on phones); plain: the hero sits on the page background.

  • showPromoteddefault true
    boolean

    The promoted rail.

  • showRecentdefault true
    boolean

    The new ads grid with the city chip.

  • showTrustdefault true
    boolean

    The three trust tiles.

  • showAppdefault true
    boolean

    The app band with the store buttons and the QR code.

  • recentCountdefault 12
    number

    Ads in the recent grid (fewer when the city has fewer).

  • cardSizedefault "md"
    "sm" | "md"

    Listing card size from 640px; phones always use the compact look in two columns.

  • onFavoriteChange
    (id: string, favorite: boolean) => (void | Promise<unknown>)

    A heart was toggled. The change shows at once in the rail and the grid; a rejected promise rolls it back and the card announces the error.

  • appUrldefault "https://northwind.market/app"
    string

    The QR code's value in the app band.

  • appStoreHrefdefault "#app-store"
    string

    The App Store button's link.

  • googlePlayHrefdefault "#google-play"
    string

    The Google Play button's link.

  • categoriesHrefdefault "/categories"
    string

    Where All categories points.

  • deliveryFromdefault 9.99
    number

    The lowest courier price in the Courier delivery tile, in currency.

  • labels
    Partial<MarketplaceHomePageLabels>

    Every visible string (DEFAULT_MARKETPLACE_HOME_PAGE_LABELS, English), counted ones as functions; nested listingCard, carousel, categoryPicker, searchInput, listbox and qrCode labels for the composed items. MARKETPLACE_HOME_PAGE_LABELS_EN is the same set under its older name.

  • localedefault "en-US"
    string

    Intl locale for the counts, prices and dates.

  • currencydefault "USD"
    string

    The currency of listings without their own, and of deliveryFrom.

  • now
    Date | number

    The clock for the relative dates on the cards. Default: useNow() (a stable placeholder while hydrating); the demo passes MARKETPLACE_HOME_NOW.

  • tonedefault "neutral"
    "neutral" | "brand" | "success" | "warning" | "danger" | "info"

    The search button, the hero glow, the selected place, the hearts and the trust icons.

  • radiusdefault "md"
    "sm" | "md" | "lg"

    The surfaces: cards and tiles 12 / 16 / 24px, the hero and the app band 16 / 24 / 32px.

  • loadingdefault false
    boolean

    The hero stays; the category tiles, the promoted rail and the grid become skeletons of their real shape.

  • animateIndefault true
    boolean

    Sections rise in once when the page mounts on the client (never over server HTML, never with reduced motion).

  • linkComponent
    (props: LinkComponentProps) => ReactNode

    The router link for every link on the page. Default: the provider's (the shell's), then <a>.

  • className
    string

    Classes for the root.

  • classNames
    Partial<Record<"hero" | "search" | "categories" | "promoted" | "recent" | "grid" | "trust" | "app", string>>

    Classes for the sections.

Parts

  • DEFAULT_MARKETPLACE_HOME_PAGE_LABELS

    constant

    The English strings for every visible label, the default of labels. Type: MarketplaceHomePageLabels.

  • MARKETPLACE_HOME_PAGE_LABELS_EN

    constant

    The same English strings under their older name, kept for existing imports.

  • MARKETPLACE_HOME_SAMPLE

    constant

    The demo data in USD: 12 categories, 8 promoted and 24 recent listings, popular searches and the hero stats.

  • MARKETPLACE_HOME_SAMPLE_EN

    constant

    The same sample priced in EUR, converted at USD_PER_EUR (the currency example).

  • createMarketplaceHomeSample

    function

    Builds the sample: ({ currency?: "USD" | "EUR" }) => MarketplaceHomeSample, with seeded generated listings.

  • MARKETPLACE_HOME_NOW

    constant

    The demo clock (Sep 24, 2026, 4:40 PM) as a timestamp, passed as now so relative dates stay stable.

  • USD_PER_EUR

    constant

    The rounded dollars per euro rate (1.09) used to convert the EUR sample.

  • mulberry32

    function

    A tiny seeded random generator, (seed: number) => () => number, so the generated sample listings stay the same on every render.

  • MarketplaceHomePageProps

    type

    Props of MarketplaceHomePage, including the div attributes of the root.

  • MarketplaceHomeCategory

    type

    A category tile: id, label, icon, listing count, search keywords and an optional href.

  • MarketplaceHomeSearchQuery

    type

    What onSearch receives: { query: string; location: string; category: string }.

Examples

Open

Plain hero, brand actions

The hero sits on the page background; the shell's Post a listing and the search button use the brand tone.

Open

Loading

Category tiles, the promoted rail and the grid as skeletons of their real shape.

Open

A city with no listings yet

Sibiu has nothing new: the empty state offers every location.

Open

Euro prices

en-GB formatting and the same listings priced in euro.

Open

Compact, every location

Small cards, 8 listings from every location, large radius, info tone and no trust tiles.

Dependencies

motionlucide-reactbadgebuttoncarouselcategory-pickercomboboxempty-statelistboxlisting-cardpopoverqr-codesearch-inputseparatorskeletontaguse-controllable-stateuse-media-querycommercemotionnavigationnumber-formatrelative-timero-locationstonesui-config

Files

  • components/blocks/marketplace-home-page.tsx
  • components/blocks/marketplace-home-page-data.ts

FAQ

Is the React Marketplace Home Page block free?

The preview, props and docs are free; copying the source needs a Pro plan. See plans.

How do I install Marketplace Home Page?

Run npx wingo-ui@latest add marketplace-home-page. It also adds the Wingo UI items it builds on (Badge, Button, Carousel, Category picker, Combobox and 19 more) and the npm packages motion and lucide-react. With shadcn, add the @wingo-ui registry with your API key, then run npx shadcn@latest add @wingo-ui/marketplace-home-page.

How does Marketplace Home Page behave on phones?

Below 768px the two fields and the button stack and the location opens a full height sheet. The popular searches under it are links (a sideways scroll on phones).

See also

Marketplace ShellMarketplace Search PageListing Detail PagePost Listing WizardCategory pickerListing card

More React blocks

Mobile App HomeAdmin Dashboard PageAdmin ShellAI Chat PageAPI Keys PageAutomation Builder Page
All 26 React blocks

Articles using this component

  • Shadcn Ecommerce Template: Five Screens That Work on Phones

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

  • React Marketplace Template That Works Like an App

    Build it: screens and apps · Oct 16, 2026 · 15 min read

PreviousLogin PageNext Marketplace Search Page