Skip to content
shadcn.io

shadcn.io is not affiliated with official shadcn/ui

Audience Tabs Pricing Block for React

Three large audience tiles in the header row (freelancer, studio, agency) that open their own plans: cells that share hairlines on desktop, one plan at a time behind a segment group on a phone.

Framework
UI library

Preview

Preview width

Installation

Part of Pro
Pro unlocks the code and one-line install of every Pro button and text effect, plus the MCP for your AI editor.
Have Pro already? Sign in to open it.Opens here as soon as you're Pro.

Overview

Show the right plans to the right audience with this tabbed pricing section, shown here for Framewell, a design review tool. The audiences lead: three tiles (Freelancer, Studio and Agency, each with an icon and a line on who it's for) sit in the header row beside the headline as Tabs on shared hairlines, the chosen tile tinted and capped by a line. Each tile opens its own three plans in a ruled band between the page's rails, with + marks on its corners: cells that share hairlines, each with its name, a one-line description, a per-editor price (or Free, or Custom), a Shine Button call to action and a feature list that builds on the plan before it. The most chosen plan in each audience is tinted, carries an outline badge and the only filled button. On a phone the tiles shrink to icons and names, and the three plans become one: a Segment Group switches between them, opening on the most chosen. Built with Tabs, Segment Group, Badge, Guides, Shine Button and Lucide icons, with CSS transitions only. For multi-product SaaS, tools that sell to freelancers and companies alike, and any pricing that depends on who is buying.

FAQ

How do I change the audiences and their plans?

Edit the AUDIENCES array at the top of the file. Each audience has an id, the tile's label and who line, a Lucide icon and its plans. A plan has its name, description, price per editor a month, featureHeading and features, the call to action's cta and href, and popular for the tinted plan. A price of 0 shows "Free" and null shows "Custom". Keep three plans per audience so the cells fill the row, and three audiences so the tiles fill the header.

How do I connect the plan buttons to checkout or sales?

Each call to action is a real link to its plan's href: send self-serve plans to checkout with the audience and plan in the address (/checkout?audience=studio&plan=studio) and the custom one to your contact form. It's a ShineButton with render set to an a element and nativeButton={false}. Every button names its plan for screen readers, as in "Start 14-day trial, Studio plan".

Are the audience tiles accessible?

Yes. They're real tabs: a tab list named "Audience" whose tabs each control a panel, so a screen reader announces the tab, its position and the panel it opens. Tab reaches the selected audience, the arrow keys move between audiences, and Tab moves on into the open panel. The chosen tile is marked by its tint and the line across its top, not by colour alone. In each panel the plans are h3 headings under the section's h2, prices are read with their unit ("$29 per editor per month"), and the most chosen plan's badge is text.

How do the plans fit a phone?

Below the md breakpoint the three plan cells become one. A segment group named after the audience ("Studio plans") sits above the panel: a radio group, so the arrow keys move and choose, and the chosen plan's cell is the only one visible, all three stacked in the same space so switching never moves the page, with its call to action a short scroll from the header. It opens on the most chosen plan, and each audience remembers the plan its visitor picked while they look at the others. The tiles keep their icon and name and drop the line under it, so the three fit a 320px screen.

How do I open another audience first, or link to one?

Change defaultValue="freelancer" on Tabs to another audience's id.To open a tab from a link, such as /pricing?audience=agency, read the parameter and make the tabs controlled: pass the selected audience and update it when the visitor picks another, so the address and the tab stay in step. Only the open panel is rendered.

When should I use audience tabs instead of one row of tiers?

Use audience tabs when your customers are distinct groups whose plans differ in price model, limits and features, such as a freelancer paying for one seat and an agency paying per editor with client portals: each group sees only the plans meant for it, and picking the tile is the first step of choosing. If everyone follows the same upgrade path, one row of tiers or a comparison table is simpler and lets visitors see every plan at once.

  • Pro

    Seat-type pricing with a stepper for each type: Full, Collaborator and Viewer seats at different prices, a stacked bar of the seat mix, a live monthly total and, on a phone, a sticky total bar.

  • Pro

    The canonical three-column pricing section for a team knowledge base: Personal, Team and Company cells under a monthly and yearly switch, each outlined by hairlines that overshoot its corners, the recommended plan raised, one plan at a time on phones.

  • Pro

    A needs checklist for picking a plan: tick what you need and the cheapest plan that covers every need lights up with its price, while each need says which plan it starts at.

  • Pro

    Comparison Table Pricing

    Comparison tables

    Four plans compared feature by feature in one table whose hairlines meet the page rails, with a billing switch, a tinted popular column and, on a phone, a plan switch that keeps the feature column beside one plan.

  • Pro

    Three plan rows for an email API, each its own band with its price and call to action in view, opening in place to list its features, with a monthly and annual switch in the header row.

  • Pro

    Billing Toggle Pricing

    Billing switches

    Three plan cards under a monthly and yearly switch that wears its saving in the header row, with prices that roll to their new amount and each plan a card in a card.