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

Storefront Page

Templates

Storefront Page React template for Tailwind CSS v4

Status PageSwitch Page
Live props
Content
currency
locale
freeShippingThreshold
shipping
State
defaultCollection
defaultSort
defaultCartOpen
Layout
columns4
showAnnouncement
showCollections
showFeatured
showReviews
showPerks
showNewsletter
header
footer
Appearance
tone
ctaTone
favoriteTone
saleTone
radius
background
backgroundColor
bandBackground
bandColor
Behavior
stickyAddToCart
animateIn
Code
import StorefrontPage from "@/components/templates/storefront-page"

<StorefrontPage />
  1. Home
  2. Templates
  3. Storefront Page
Pro

Storefront Page React template for Tailwind CSS v4

v1.0.0·Added in 1.14.0

A React ecommerce store template: free shipping bar, hero, collections, a filterable product grid with quick add, a cart drawer and reviews.

A small brand's store home page. The strip on top states the free shipping threshold and can be closed. Shop the collection glides down to the grid; a collection tile filters the grid to that collection. In the grid, the collection chips (a swipeable row on phones) filter live and the count is announced; from 1024px On sale, In stock, a price select and a sort select sit beside them, below 1024px Filters opens a sheet (a bottom sheet on phones) with sort, price and availability chips and Show products. Products are two per row on phones. Every card is one link that lifts on hover; its swatches (arrow keys inside the group) recolor the drawn photo, the heart saves it, and Add to cart puts that color in the cart and opens the cart drawer, a side panel on desktop and a bottom drawer on phones, with quantity steppers, swipe or undo to remove, a free shipping progress bar and checkout. The featured product band has a gallery (thumbnails, swipe, a full-screen viewer), color swatches that redraw the photos, a size select, a quantity stepper and Add to cart; on phones a bar with Add to cart slides up from the bottom while that button is off screen. Reviews filter by star and sort; the newsletter form validates the email and confirms.

Storefront 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 storefront-page, together with Marketing Section, Marketing Header, Marketing Footer, Newsletter Section, Banner 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
  • Newsletter Sectionnewsletter-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 storefront-page

Storefront 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 StorefrontPage from @/components/templates/storefront-page.

// app/page.tsx
"use client"

import Link from "next/link"
import { StorefrontPage, type StorefrontAddToCart } from "@/components/templates/storefront-page"
import type { CartItem } from "@/components/ui/cart-drawer"

async function addToCart(item: StorefrontAddToCart) {
  await fetch("/api/cart", { method: "POST", body: JSON.stringify({ line: item.lineId, quantity: item.quantity }) })
}

async function checkout(items: CartItem[]) {
  const response = await fetch("/api/checkout", { method: "POST", body: JSON.stringify(items) })
  const { url } = await response.json()
  window.location.assign(url)
}

export default function HomeRoute() {
  return <StorefrontPage linkComponent={Link} freeShippingThreshold={50} onAddToCart={addToCart} onCheckout={checkout} />
}

Props

  • productsdefault "STOREFRONT_PRODUCTS"
    StorefrontProduct[]

    { id, title, collection, price, compareAtPrice?, colors: { name, value }[], kind, images?, sizes?, rating?, reviewCount?, badge?, addedAt?, rank?, description?, maxQuantity?, soldOut?, href?, favorite? }. kind picks the drawn photo (notebook, pocket, planner, pen, mug, pouch) in the chosen color; images (one per color) replace it. Quick add uses the first size.

  • collectionsdefault "STOREFRONT_COLLECTIONS"
    StorefrontCollection[]

    { id, title, description?, kind, color, image?, href? } tiles and grid chips; a product joins one by its collection id. An empty array hides the tiles.

  • featureddefault "STOREFRONT_FEATURED"
    StorefrontFeatured | null

    A product (the StorefrontProduct shape) plus eyebrow and highlights, shown in the band with the gallery, swatches, size select and Add to cart. null hides it.

  • perksdefault "STOREFRONT_PERKS"
    StorefrontPerk[]

    { icon?, title, description } tiles: shipping, returns, guarantee. An empty array hides them.

  • reviewsdefault "STOREFRONT_REVIEWS"
    ReviewData[]

    The reviews of the featured product, in the Reviews shape. An empty array hides the section.

  • reviewsSummarydefault "STOREFRONT_REVIEWS_SUMMARY"
    ReviewsSummaryData

    { average, count, distribution, aspects? } when reviews is one page of many.

  • priceRangesdefault "STOREFRONT_PRICE_RANGES"
    StorefrontPriceRange[]

    The price filter choices as [min, max) pairs in major units; null is an open end. Any price is always first.

  • labels
    Partial<StorefrontPageLabels>

    Every string on the page: brand, announcement, hero, section headings, filters, card and cart copy, newsletter, footer. Some are functions (announcement, productCount, quickAddLabel, featuredNote, photo).

  • currencydefault "USD"
    string

    ISO currency of every price, the threshold and the cart.

  • localedefault ""
    string

    Intl locale for prices and counts; empty uses the UIProvider's, else en-US.

  • freeShippingThresholddefault 50
    number

    The order total for free shipping: the announcement strip, the note under Add to cart and the cart's progress bar. 0 hides all three.

  • shippingdefault 6
    number | null

    The flat delivery price under the threshold, in the note under Add to cart and the cart summary; null prints Calculated at checkout.

  • defaultCollectiondefault ""
    string

    The collection id the grid starts on; empty is All.

  • defaultSortdefault "featured"
    "featured" | "newest" | "price-asc" | "price-desc" | "rating"

    The grid's starting order. featured follows rank with sold out items last.

  • cartItems
    CartItem[]

    The cart, controlled. Quick add and Add to cart append or bump a line (id product:color:size).

  • defaultCartItems
    CartItem[]

    The starting cart when it is not controlled; empty by default.

  • onCartItemsChange
    (items: CartItem[]) => void

    Every cart change: adds, quantity steps and removals.

  • cartOpen
    boolean

    The cart drawer, controlled.

  • defaultCartOpendefault false
    boolean

    Starts with the cart drawer open.

  • onCartOpenChange
    (open: boolean) => void

    The drawer opened or closed.

  • onAddToCart
    (item: StorefrontAddToCart) => void | Promise<unknown>

    { product, color?, size?, quantity, lineId }. A returned promise keeps the button loading; a rejection adds nothing and announces labels.addFailed.

  • onCheckout
    (items: CartItem[]) => void | Promise<unknown>

    The cart's checkout button; a promise keeps it loading. Without it the button links to cartProps.checkoutHref (default /checkout).

  • onFavoriteChange
    (product: StorefrontProduct, favorite: boolean) => void | Promise<unknown>

    A heart was toggled; a rejection rolls it back.

  • onSubscribe
    (email: string) => void | Promise<unknown>

    The newsletter form; without it a 900 ms pretend, then the success line.

  • columnsdefault 4
    3 | 4

    Products per row from 1024px; three from 768px, two on phones.

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

    Accents: the rating stars, the review bars and filters.

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

    Shop the collection, Add to cart, the sticky bar, checkout and the newsletter button.

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

    The heart on a saved product; neutral is white on the photo.

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

    Sale prices, the discount chip and the Sale tag on the photo (a markdown is a status).

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

    Corners of the product, collection, buy box and perk cards: 0 / 12 / 16 / 24px; photos inside follow.

  • backgrounddefault "soft"
    "plain" | "soft" | "glow" | "aurora" | "grid" | "dots"

    The main background: plain is the bare page color; the others tint the page and add a wash, a glow, an aurora, a grid or dots over the first screen.

  • backgroundColordefault "oklch(0.72 0.07 70)"
    string

    The tint of the main background, a warm sand by default.

  • bandBackgrounddefault "muted"
    "muted" | "tinted" | "gradient" | "dots"

    The secondary background of every second section (collections, the featured product, perks). Cards inside are lifted above it.

  • bandColordefault "oklch(0.72 0.07 70)"
    string

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

  • showAnnouncementdefault true
    boolean

    The free shipping strip above the header (needs freeShippingThreshold above 0).

  • showCollectionsdefault true
    boolean

    The collection tiles.

  • showFeatureddefault true
    boolean

    The featured product band.

  • showReviewsdefault true
    boolean

    The reviews with the rating summary.

  • showPerksdefault true
    boolean

    The shipping, returns and guarantee tiles.

  • showNewsletterdefault true
    boolean

    The newsletter signup.

  • stickyAddToCartdefault true
    boolean

    Below 768px, a bar with Add to cart slides up while the featured product is on screen and its own button is not.

  • headerdefault true
    boolean

    The sticky header with the brand, section links, account and the cart button. Off, the cart button moves to the grid's toolbar.

  • footerdefault true
    boolean

    The footer with Shop, Help and Company links.

  • 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...).

  • bannerProps
    Partial<BannerProps>

    Anything for the announcement Banner (tone, variant, persistKey, action...).

  • galleryProps
    Partial<ProductGalleryProps>

    Anything for the featured ProductGallery (thumbnails, zoom, aspect...).

  • reviewsProps
    Partial<ReviewsProps>

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

  • newsletterProps
    Partial<NewsletterSectionProps>

    Anything for the NewsletterSection (layout, bullets, subscribers...).

  • cartProps
    Partial<CartDrawerProps>

    Anything for the CartDrawer (showCoupon, couponProps, taxRate, note, size, checkoutHref...); items and open stay with the page, and onCheckout wins over checkoutHref.

  • animateIndefault true
    boolean

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

  • className
    string

    Classes for the root.

  • classNames
    Partial<Record<StorefrontPageSlot, string>>

    Classes for announcement, header, hero, collections, collection, shop, toolbar, filters, grid, product, photo, featured, gallery, buyBox, stickyBar, reviews, perks, newsletter, cart and footer.

Parts

  • STOREFRONT_PAGE_SAMPLE

    constant

    All the sample content in one object: products, collections, featured, perks, reviews and the summary.

  • STOREFRONT_PRODUCTS

    constant

    Eight Fieldnote products: notebooks, a pocket set, a planner, pens, a mug and a pouch, two on sale and one sold out.

  • STOREFRONT_COLLECTIONS

    constant

    Notebooks, Planners, Writing and Desk goods.

  • STOREFRONT_FEATURED

    constant

    The Field Notebook with three sizes, four colors and three highlights.

  • STOREFRONT_PERKS

    constant

    Free shipping, 60-day returns, a binding guarantee and plastic-free packaging.

  • STOREFRONT_REVIEWS

    constant

    Six Field Notebook reviews, one with a reply from the shop.

  • STOREFRONT_REVIEWS_SUMMARY

    constant

    4.8 from 1,284 reviews with the star counts and three topics.

  • STOREFRONT_PRICE_RANGES

    constant

    Under $20, $20 to $40 and $40 and up.

  • DEFAULT_STOREFRONT_PAGE_LABELS

    constant

    The English strings.

  • drawStorefrontProduct

    function

    (kind, color, view?) returns an svg data url of a drawn product shot (views front, open, angle, detail), for an img, a gallery or a cart line image.

  • StorefrontPageProps

    type

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

  • StorefrontPageLabels

    type

    Every string of the page.

  • StorefrontPageSlot

    type

    The keys of classNames.

  • StorefrontPageRadius

    type

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

  • StorefrontPageSort

    type

    "featured" | "newest" | "price-asc" | "price-desc" | "rating".

  • StorefrontPageColumns

    type

    3 | 4.

  • StorefrontPriceRange

    type

    [min, max) in major units; null is an open end.

  • StorefrontArtView

    type

    "front" | "open" | "angle" | "detail".

  • StorefrontAddToCart

    type

    What onAddToCart receives: { product, color?, size?, quantity, lineId }.

  • StorefrontProduct

    type

    One product of the grid.

  • StorefrontProductKind

    type

    "notebook" | "pocket" | "planner" | "pen" | "mug" | "pouch": the drawn shots.

  • StorefrontColor

    type

    { name, value }: a swatch and the color of the drawn shot.

  • StorefrontSize

    type

    { value, label, description?, price? }: a size option, its own price if it differs.

  • StorefrontCollection

    type

    One collection tile.

  • StorefrontFeatured

    type

    A StorefrontProduct plus eyebrow and highlights.

  • StorefrontPerk

    type

    { icon?, title, description }.

Examples

Open

Brand accents

ctaTone and favoriteTone on an aurora page with tinted bands: orange Add to cart, checkout and newsletter buttons, red hearts.

Open

A returning shopper

defaultCartItems with two lines and the drawer open: the free shipping bar, steppers and the summary.

Open

A lean catalog

Three columns, square-ish cards, starting on Notebooks sorted by price, without collections, reviews or perks.

Open

When the cart fails

onAddToCart rejects: the button spins, nothing lands in the cart and the failure is announced.

Open

Inside a site layout

No header, footer or announcement, on a plain page with dotted bands: the cart button moves to the grid's toolbar.

Dependencies

lucide-reactmotionmarketing-sectionmarketing-headermarketing-footernewsletter-sectionbannerbuttoncart-drawerfavorite-buttonpriceproduct-galleryquantity-stepperratingreviewsselectsheetuse-controllable-statenavigationmotiontonesui-config

Files

  • components/templates/storefront-page.tsx
  • components/templates/storefront-page-data.ts

FAQ

Is the React Storefront Page template free?

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

How do I install Storefront Page?

Run npx wingo-ui@latest add storefront-page. It also adds the Wingo UI items it builds on (Marketing Section, Marketing Header, Marketing Footer, Newsletter Section, Banner 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/storefront-page.

How does Storefront Page behave on phones?

In the grid, the collection chips (a swipeable row on phones) filter live and the count is announced; from 1024px On sale, In stock, a price select and a sort select sit beside them, below 1024px Filters opens a sheet (a bottom sheet on phones) with sort, price and availability chips and Show products.

See also

Cart drawerProduct galleryReviewsCheckout PageLanding Page

Related guides

  • Nextjs Restaurant Template: Open Now, Menu, Book a Table

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

PreviousStatus PageNext Switch Page