Pricing Section
Tier cards with monthly or yearly switch, highlighted plan, check lists and a comparison table layout.
pnpm dlx @glinui/cli@latest add pricing-sectionSimple pricing
Switch to yearly and keep two months.
Team
Most popularFor growing teams.
$32/ month
Start trial- Unlimited workspaces
- Priority support
- Advanced analytics
- Audit log
Installation
pnpm dlx @glinui/cli@latest add pricing-sectionPrefer 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
Team
Most popularFor growing teams.
26 €/ month
Start trial- Unlimited workspaces
- Priority support
- Advanced analytics
- Audit log
Comparison table
| Feature | Solo$12 | Team$32 | ScaleCustom |
|---|---|---|---|
| Workspaces | 1 | Unlimited | Unlimited |
| Audit log | Not included | Included | Included |
| Single sign-on | Not included | Not included | Included |
| Start free | Start trial | Talk 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
| Key | Action |
|---|---|
| Space / Enter | Toggle 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
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
tiers | PricingTier[] | Yes | - | id, name, description, price ({ monthly, yearly } or string), period, features, cta, highlighted, badge. |
layout | "cards" | "table" | No | cards | `table` renders `comparison` rows in a Table. |
billing / defaultBilling / onBillingChange | BillingPeriod | - | monthly | Controlled and uncontrolled period. |
currency / locale | string | - | USD / runtime | Passed to Intl.NumberFormat. |
highlightEffect | "shine" | "none" | No | shine | ShineBorder on the highlighted tier. |
yearlyNote | string | No | - | Badge beside the toggle, for example Save 20%. |
hideToggle | boolean | No | false | Hide the switch for single-period pricing. |
variant | BlockLook | "default" | null | No | ambient | Omit `variant` to follow the ambient style: glinr (open canvas), plain under minimal, glass panel when opted in. |
billing | BillingPeriod | No | - | Controlled billing period. |
comparison | PricingComparisonRow[] | No | - | Auto-generated from TypeScript source. |
currency | string | No | "USD" | ISO 4217 code for `Intl.NumberFormat`. Default USD. |
defaultBilling | BillingPeriod | No | "monthly" | Initial billing period when uncontrolled. Default `monthly`. |
description | React.ReactNode | No | - | Auto-generated from TypeScript source. |
headingLevel | 2 | 3 | No | 2 | Auto-generated from TypeScript source. |
locale | string | No | - | BCP 47 locale for formatting. Default is the runtime locale. |
onBillingChange | (billing: BillingPeriod) => void | No | - | Auto-generated from TypeScript source. |
title | React.ReactNode | No | - | 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/reactGenerated API Snapshot
Beta
Generated API Snapshot
BetaAuto-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
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
billing | BillingPeriod | No | - | Controlled billing period. |
comparison | PricingComparisonRow[] | No | - | - |
currency | string | No | "USD" | ISO 4217 code for `Intl.NumberFormat`. Default USD. |
defaultBilling | BillingPeriod | No | "monthly" | Initial billing period when uncontrolled. Default `monthly`. |
description | React.ReactNode | No | - | - |
headingLevel | 2 | 3 | No | 2 | - |
hideToggle | boolean | No | false | Hide 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`. |
locale | string | No | - | BCP 47 locale for formatting. Default is the runtime locale. |
onBillingChange | (billing: BillingPeriod) => void | No | - | - |
tiers | PricingTier[] | Yes | - | - |
title | React.ReactNode | No | - | - |
variant | BlockLook | "default" | null | No | - | - |
yearlyNote | string | No | - | Text on the yearly side of the toggle, for example "Save 20%". |