Glin UI
Blockbeta

Pricing Section

Tier cards with monthly or yearly switch, highlighted plan, check lists and a comparison table layout.

Edit on GitHub

Simple pricing

Switch to yearly and keep two months.

MonthlyYearlySave 20%
  • Solo

    For side projects.

    $12/ month

    Start free
    • 1 workspace
    • Community support
    • Basic analytics
  • Team

    Most popular

    For growing teams.

    $32/ month

    Start trial
    • Unlimited workspaces
    • Priority support
    • Advanced analytics
    • Audit log
  • Scale

    Security and scale.

    Custom

    Talk to sales
    • Single sign-on
    • Dedicated support
    • Uptime SLA

Installation

Install from
pnpm dlx @glinui/cli@latest add pricing-section

Prefer the package?

Usage

Own design from Card, Switch, Badge, Button, Table and ShineBorder. Prices are numbers formatted with `Intl.NumberFormat`, so currency and locale are props, never hardcoded.

Billing is controlled (`billing`) or uncontrolled (`defaultBilling`), with `onBillingChange` in both cases.

Tier prices are per month for each period. Pass a string such as "Custom" for contact-sales tiers.

States

Yearly default with euro formatting, and the comparison table layout.

Yearly, euro, no shine

MonthlyYearly
  • Solo

    For side projects.

    9 €/ month

    Start free
    • 1 workspace
    • Community support
    • Basic analytics
  • Team

    Most popular

    For growing teams.

    26 €/ month

    Start trial
    • Unlimited workspaces
    • Priority support
    • Advanced analytics
    • Audit log

Comparison table

MonthlyYearly
FeatureSolo$12Team$32ScaleCustom
Workspaces1UnlimitedUnlimited
Audit logNot includedIncludedIncluded
Single sign-onNot includedNot includedIncluded
Start freeStart trialTalk to sales
<PricingSection tiers={tiers} defaultBilling="yearly" currency="EUR" locale="de-DE" highlightEffect="none" />
<PricingSection tiers={tiers} layout="table" comparison={[{ label: "Audit log", values: [false, true, true] }]} />

Accessibility

  • The price is an aria-live polite region, so a toggle is announced.
  • The switch has the name Bill yearly; the visible Monthly and Yearly labels show the state.
  • Features are lists with decorative check icons; the table uses column and row headers and text for included or not included.

Keyboard Interactions

KeyAction
Space / EnterToggle billing period on the switch

ARIA Attributes

  • `aria-live="polite"` on prices
  • `role="switch"` from Switch

Reduced Motion

Entrance reveals and the highlighted shine follow the Glin motion level. At level none or prefers-reduced-motion everything renders in its final static state.

API Reference

PropTypeRequiredDefaultDescription
tiersPricingTier[]Yes-id, name, description, price ({ monthly, yearly } or string), period, features, cta, highlighted, badge.
layout"cards" | "table"Nocards`table` renders `comparison` rows in a Table.
billing / defaultBilling / onBillingChangeBillingPeriod-monthlyControlled and uncontrolled period.
currency / localestring-USD / runtimePassed to Intl.NumberFormat.
highlightEffect"shine" | "none"NoshineShineBorder on the highlighted tier.
yearlyNotestringNo-Badge beside the toggle, for example Save 20%.
hideTogglebooleanNofalseHide the switch for single-period pricing.
variantBlockLook | "default" | nullNoambientOmit `variant` to follow the ambient style: glinr (open canvas), plain under minimal, glass panel when opted in.
billingBillingPeriodNo-Controlled billing period.
comparisonPricingComparisonRow[]No-Auto-generated from TypeScript source.
currencystringNo"USD"ISO 4217 code for `Intl.NumberFormat`. Default USD.
defaultBillingBillingPeriodNo"monthly"Initial billing period when uncontrolled. Default `monthly`.
descriptionReact.ReactNodeNo-Auto-generated from TypeScript source.
headingLevel2 | 3No2Auto-generated from TypeScript source.
localestringNo-BCP 47 locale for formatting. Default is the runtime locale.
onBillingChange(billing: BillingPeriod) => voidNo-Auto-generated from TypeScript source.
titleReact.ReactNodeNo-Auto-generated from TypeScript source.

Source

Import directly from the package or browse the source on GitHub. Click any file to view it.

Import

import { PricingSection } from "@glinui/ui"

Dependencies

@glinui/ui@phosphor-icons/react

Generated API Snapshot

Beta

Auto-extracted from TypeScript source in packages/ui/src/components/pricing-section.tsx. This section is in beta and may lag behind hand-curated docs. Regenerate with pnpm --filter @glinui/docs api:generate.

Generated: 2026-10-08T01:41:21.546Z · Full index: /docs/api-metadata

Primary Props Type

PricingSectionProps

PricingSectionProps

PropTypeRequiredDefaultDescription
billingBillingPeriodNo-Controlled billing period.
comparisonPricingComparisonRow[]No--
currencystringNo"USD"ISO 4217 code for `Intl.NumberFormat`. Default USD.
defaultBillingBillingPeriodNo"monthly"Initial billing period when uncontrolled. Default `monthly`.
descriptionReact.ReactNodeNo--
headingLevel2 | 3No2-
hideTogglebooleanNofalseHide the toggle (single period).
highlightEffect"shine" | "none"No"shine"Edge effect on the highlighted card. Default `shine`.
layout"cards" | "table"No"cards"`cards` shows tier cards, `table` a comparison table built from `comparison`.
localestringNo-BCP 47 locale for formatting. Default is the runtime locale.
onBillingChange(billing: BillingPeriod) => voidNo--
tiersPricingTier[]Yes--
titleReact.ReactNodeNo--
variantBlockLook | "default" | nullNo--
yearlyNotestringNo-Text on the yearly side of the toggle, for example "Save 20%".