AppPricingCard
A pricing tier — name, price, pitch, feature list and call to action.
<app-pricing-card name="Pro" price="₹1,499" unit="/month">…</app-pricing-card><app-pricing-card> presents one tier: what it is called, what it costs, who it is for, what it includes, and the button that takes it. Used on a marketing pricing page and on the in-app plan/upgrade screen.
The “Most popular” flag is a real element with real text, not a content: string welded into CSS — so it can be reworded, translated, and read by a screen reader.
Playground
Every attribute, live. Each change re-renders the real tag helper on the server, so the markup underneath is the exact call that produced the card above it.
Basic
A name, a formatted price, an optional unit, a one-line pitch, the features, and a CTA. The price is pre-formatted — the tag helper does not know your currency.
<app-button> inside <app-plan-cta>; it is pushed to the bottom edge so buttons line up across a row.- Unlimited reports
- 25 sites
- Report revisions
- Single sign-on
Show code
<app-pricing-card name="Pro" price="₹1,499" unit="/month" tagline="For growing teams.">
<app-plan-feature text="Unlimited reports" />
<app-plan-feature text="Single sign-on" included="false" />
<app-plan-cta><app-button variant="primary" block="true">Choose Pro</app-button></app-plan-cta>
</app-pricing-card>
A row of tiers
Wrap the cards in .plan-grid: one column on a phone, two from md, three from lg — with vertical room for the featured card's 2% lift, so it never clips against its neighbours.
- 3 reports per month
- 1 site
- Report revisions
- Single sign-on
- Unlimited reports
- 25 sites
- Report revisions
- Single sign-on
- Unlimited reports
- Unlimited sites
- Report revisions
- Single sign-on
Show code
<div class="plan-grid">
<app-pricing-card name="Free" price="₹0" … />
<app-pricing-card name="Pro" price="₹1,499" unit="/month" featured="true" … />
<app-pricing-card name="Enterprise" price="Talk to us" … />
</div>
included="false" instead. A shorter list just looks like a shorter card; rows that line up are the only thing that makes the tiers comparable at a glance.Featured and current
featured is the tier you are recommending — brand border, a 2% lift, and the badge. current is the tier the customer is already on — a brand ring, no lift, so it reads as “yours” without competing for attention.
current while a different one is featured — the two treatments are deliberately distinguishable.- 3 reports per month
- 1 site
- Report revisions
- Single sign-on
- Unlimited reports
- 25 sites
- Report revisions
- Single sign-on
Show code
<app-pricing-card name="Free" price="₹0" current="true" … /> <app-pricing-card name="Pro" price="₹1,499" featured="true" badge="Recommended" … />
When to use
Use it when
- You are presenting purchasable tiers with prices and actions.
- The reader is choosing which one to take.
- Each tier has a short feature list that fits on a card.
Reach for something else when
- You need the full capability matrix. → app-compare-table, below the cards
- It is a selectable option in a form, not a purchase. → app-choice-card
- It is a link to a doc or template. → app-resource-card
Best practices
- Unlimited reports
- SSO
- Unlimited reports
Every option
The whole surface of the component, one cell per value — every featured/current combination, the badge edge cases, included vs excluded features, and where React and Razor genuinely differ.
featured / current — all four combinations
(default) — neither- Core features
featured- Everything in Basic
current- Your plan today
featured + current- Already on this tier
badge
featured (default badge text)featured badge="Recommended"featured badge="" — badge hiddenbadge="Best value" but not featured — badge hiddenprice / unit
price + unitprice only — no unitprice="Talk to us" — non-numeric textprice is a plain string here (Razor: no ReactNode)price is typed as ReactNode, so a caller can compose it (e.g. a smaller "incl. GST" suffix inline). Razor's price attribute is a plain string — pre-format the whole thing before passing it in.features — included, excluded, mixed, empty
all included- Unlimited reports
- 25 sites
- SSO
all excluded- Unlimited reports
- 25 sites
- SSO
mixed included / excluded- Unlimited reports
- 25 sites
- SSO
no app-plan-feature children — no list renderedcta
app-plan-cta presentapp-plan-cta omitted — no plan-cta wrapperclass passthrough
class="analytics-card" — appended alongside base classeslong content overflow
long name, tagline, and feature text stay inside the card
- Unlimited reports, revisions, and export formats across every workspace
- Single sign-on with SCIM provisioning and custom identity providers
Attributes
| Attribute | Type | Default | Description |
|---|---|---|---|
| name * | string | — | Tier name. |
| price * | string | — | Formatted amount, or text like “Talk to us”. React's price accepts a ReactNode; here it is a plain string — pre-format it. |
| unit | string | — | Period suffix, e.g. /month. |
| tagline | string | — | One line on who the tier is for. |
| featured | bool | false | The recommended tier: brand border, lifted, badged. Use on one card. |
| current | bool | false | The tier the customer is already on — a ring, no lift. |
| badge | string | Most popular | Text of the featured flag. |
<app-plan-feature> takes text and included. <app-plan-cta> wraps the action.