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

Pricing Page

Blocks

Pricing Page React block for Tailwind CSS v4

Design
Post Listing WizardProfile Page
Design
Live props
State
defaultPeriod
currency
loading
Behavior
eurRate
animateIn
locale
Appearance
design
featuredStyle
background
backgroundColor
bandBackground
bandColor
ctaTone
tone
radius
Layout
mobileLayout
showComparison
showLogos
showTestimonials
showFaq
showCta
header
footer
Code
import { PricingPage } from "@/components/blocks/pricing-page"

<PricingPage />
  1. Home
  2. Components
  3. Blocks
  4. Pricing Page
Pro

Pricing Page React block for Tailwind CSS v4

v1.2.0·Updated in 1.9.0

A React SaaS pricing page: plans with monthly or yearly and USD or EUR switches, a comparison table, quotes, an FAQ and a closing call.

Switch the billing period between Monthly and Yearly (the yearly option carries a "2 months free" badge) and every price rolls to its new value; switch the currency between dollars and euros and the prices convert at eurRate, rounded to whole euros. Each plan has one action: it spins while onSelectPlan runs, and without a handler a toast confirms the choice ("Pro plan, yearly"). Hover, focus or tap the (i) next to a feature or comparison row to read its hint. Below the plans the comparison is a table with a sticky row of plans on desktop and a plan picker with one list on phones. The FAQ is an accordion: Enter or Space opens a question, arrow keys move between them. On phones the header keeps the logo, Try for free and a menu button that opens a bottom sheet with the links (drag the handle, tap outside or press Escape to close); the plans become a swipeable carousel that starts on the featured plan (or a plain stack), the quotes a snap rail, the FAQ one column and the closing buttons stack. Tab starts with a skip link to the content. Sections rise in once on mount and the closing band as it scrolls into view; reduced motion keeps everything still.

Pricing 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 pricing-page, together with Marketing Section, Accordion, Avatar, Badge, Button and 11 more and the npm packages motion and lucide-react.

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

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

Pricing 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 PricingPage from @/components/blocks/pricing-page.

// app/(marketing)/pricing/page.tsx
"use client"

import Link from "next/link"
import { useRouter } from "next/navigation"
import { PricingPage } from "@/components/blocks/pricing-page"

export default function PricingRoute() {
  const router = useRouter()
  return (
    <PricingPage
      linkComponent={Link}
      defaultPeriod="yearly"
      onSelectPlan={(planId, period, currency) =>
        router.push(`/sign-up?plan=${planId}&period=${period}&currency=${currency}`)
      }
    />
  )
}

Props

  • plans
    PricingPlan[]

    The plans, priced in USD per user per month; defaults to PRICING_PAGE_SAMPLE.plans (Free, Start, Pro featured, Business).

  • comparison
    PricingComparisonGroup[]

    The comparison table below the plans; defaults to PRICING_PAGE_SAMPLE.comparison (5 groups, 24 rows).

  • faqs
    PricingFaq[]

    { question, answer } pairs for the FAQ accordion; links inside answers are underlined. Defaults to PRICING_PAGE_SAMPLE.faqs (8 questions).

  • testimonials
    PricingTestimonial[]

    { quote, name, role, company, avatar? } cards; defaults to PRICING_PAGE_SAMPLE.testimonials (3 quotes).

  • logos
    string[]

    Customer wordmarks under the plans; defaults to PRICING_PAGE_SAMPLE.logos.

  • labels
    Partial<PricingPageLabels>

    Every visible string (English by default, DEFAULT_PRICING_PAGE_LABELS). labels.pricingTable passes strings to the plans table.

  • hrefs
    Partial<PricingPageHrefs>

    Where the header, the closing band and the FAQ link go: home, current (the nav link marked current), signIn, signUp, demo, contact.

  • period
    "monthly" | "yearly"

    Controlled billing period; pair it with onPeriodChange.

  • defaultPerioddefault "yearly"
    "monthly" | "yearly"

    The billing period the page opens on while uncontrolled.

  • onPeriodChange
    (period: BillingPeriod) => void

    Called when the period switch changes.

  • currencydefault "USD"
    string

    The currency the page opens on; the switch changes it afterwards.

  • currenciesdefault "["USD", "EUR"]"
    string[]

    The options of the currency switch; a single entry hides it.

  • eurRatedefault 1.08
    number

    Units of the base currency per euro for the conversion; euro prices round to whole euros per plan.

  • designdefault "classic"
    "classic" | "bold"

    The page's look. classic is the original page; bold has heavy display type over a grid page background with a tinted logo band, an inverted featured plan with a strong ring, 28px cards, larger prices, FAQ cards and a full-width closing band.

  • featuredStyledefault "raised"
    "raised" | "outline" | "inverted"

    How the featured plan stands out, passed to PricingTable. Applies to the classic design; bold always inverts it.

  • 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. A design picks its own unless you set one (classic: glow; bold: grid).

  • 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 the logo band (classic: muted; bold: tinted). Cards, fields and tiles inside a band are lifted one step above it, so they never share its color.

  • bandColordefault "oklch(0.62 0.14 275)"
    string

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

  • mobileLayoutdefault "carousel"
    "carousel" | "stack"

    Plans on phones: a swipeable carousel that starts on the featured plan, or a plain stack.

  • showComparisondefault true
    boolean

    The full comparison under the plans.

  • showLogosdefault true
    boolean

    The customer wordmarks band.

  • showTestimonialsdefault true
    boolean

    The three customer quotes.

  • showFaqdefault true
    boolean

    The FAQ section.

  • showCtadefault true
    boolean

    The closing call to action band.

  • headerdefault true
    boolean

    The sticky marketing header with its phone menu; turn it off when the page sits in a site layout.

  • footerdefault true
    boolean

    The marketing footer with link columns.

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

    The featured plan, its button, the hero glow and the closing band's main action. brand is the marketing orange.

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

    The switches' thumbs and the FAQ's open state.

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

    Surface radius of the plan cards, quote cards and the closing band.

  • loadingdefault false
    boolean

    Skeleton plan cards and quotes in the real layout; the switches wait.

  • animateIndefault true
    boolean

    Sections rise in once on mount and the closing band as it scrolls into view; off in thumbnails.

  • localedefault "en-US"
    string

    Intl locale for the prices.

  • onSelectPlan
    (planId: string, period: BillingPeriod, currency: string) => (void | Promise<unknown>)

    A plan's action; a returned promise keeps its button loading. Without it the page waits 900 ms and toasts "Pro plan, yearly". A plan's own cta.onClick wins.

  • linkComponentdefault "<a>"
    (props: LinkComponentProps) => ReactNode

    The router link used by the header, nav, buttons and footer (next/link in an app).

  • className
    string

    Classes for the root.

  • classNames
    Partial<Record<PricingPageSlot, string>>

    Classes for header, hero, switches, plans, logos, testimonials, faq, cta and footer.

Parts

  • PRICING_PAGE_DESIGNS

    constant

    The design names in order: ["classic", "bold"].

  • PricingPageDesign

    type

    "classic" | "bold", the values of the design prop.

  • DEFAULT_PRICING_PAGE_LABELS

    constant

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

  • PRICING_PAGE_LABELS_EN

    constant

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

  • PRICING_PAGE_SAMPLE

    constant

    The demo data: plans, the comparison table, FAQs, testimonials, customer logos and the EUR rate (1.08).

  • PRICING_PAGE_SAMPLE_EN

    constant

    The same sample under its older name, kept for existing imports.

  • PricingPageProps

    type

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

Examples

Open

Brand call to action

ctaTone brand with the inverted featured plan: the one orange action of a marketing page.

Open

Monthly, in euro

Starts on monthly billing with euro prices, each plan rounded to whole euros.

Open

Plans only

Every section, the header and the footer off: the plans inside an existing site layout.

Open

Loading

Skeleton plan cards and quotes in the real layout while prices load.

Open

British English, euro

The same page with locale en-GB and euro prices.

Open

Stacked on phones

mobileLayout stack, outlined featured plan and larger surfaces: every plan in one column below 768px.

Open

Bold design

design bold: heavy start-aligned type over a grid, an inverted featured plan with a ring, FAQ cards and a full-width closing band.

Dependencies

motionlucide-reactmarketing-sectionaccordionavatarbadgebuttoncarddrawerpricing-tablesegmented-controlseparatortoastuse-controllable-statemotionnavigationtonesui-config

Files

  • components/blocks/pricing-page.tsx
  • components/blocks/pricing-page-data.ts

FAQ

Is the React Pricing Page block free?

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

How do I install Pricing Page?

Run npx wingo-ui@latest add pricing-page. It also adds the Wingo UI items it builds on (Marketing Section, Accordion, Avatar, Badge, Button and 11 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/pricing-page.

How does Pricing Page behave on phones?

Below the plans the comparison is a table with a sticky row of plans on desktop and a plan picker with one list on phones.

See also

Pricing tableAccordionSegmented ControlDrawerLogin Page

More React blocks

Profile PageRegister PageSettings PageUsers Admin PageOnboarding FlowMarketplace Home Page
All 26 React blocks

Articles using this component

  • Best shadcn Templates in 2026: Free and Paid, Tested

    Comparisons and alternatives · Nov 6, 2026 · 11 min read

  • SaaS Website Template: The 7 Pages Beyond the Home Page

    Build it: screens and apps · Nov 5, 2026 · 20 min read

  • Shadcn Blocks vs Components: When to Start From Which

    Comparisons and alternatives · Oct 16, 2026 · 11 min read

  • Shadcn Pricing Page: Yearly Toggle, Table, Phone Layout

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

PreviousPost Listing WizardNext Profile Page