shadcn.io is not affiliated with official shadcn/ui
Vertical Tabs Panels Pricing Block for React
Plans as vertical tabs: a rail of tiers with price previews, and a detail panel per plan that opens with its price and call to action, then three highlights and every feature. Three tabs across on a phone.
Installation
Overview
Swap the classic row of plan cards for this vertical tabs pricing section, shown here for Ledgerline Sign, an e-signature product with Personal, Business and Enterprise plans. A left-aligned headline sits over a rail of Tabs that lists every tier with its tagline and a per-user price preview, the selected tier marked by a bar on its leading edge and lifted onto the page's background, and a Best badge on the most chosen plan. The rail and the panel form one band between the page's rails, its hairlines overshooting the corners with a plus mark on each, and a rule along the section's top edge with a plus mark on each crossing. Each tab opens its own detail panel: the plan's name and what it's for, then its price beside the Shine Button call to action, so the decision sits at the top, then three highlights in one ruled strip and the full feature list with checkmarks. On a phone the rail becomes a row of three tabs above the panel, marked by a line under the selected one. Built with Guides, Tabs, Badge, Shine Button and Lucide icons, with CSS transitions only. For pricing pages with dense plan details, SaaS marketing sites and any product where buyers dwell on one plan at a time rather than skim them all side by side.
FAQ
How do I change the plans, highlights and features?
Edit the PLANS array at the top of the file. Each plan has an id, its name, tagline, description, monthly price per user (null shows "Custom"), three highlights (a Lucide icon, a label and a value, drawn as cells of one strip), its features, the call to action's cta and href, and popular, which adds the Best badge to its tab and a Most chosen badge to its panel. CURRENCY is the symbol written before every price. On a phone the tabs share one row in three equal columns, so keep to three plans or change grid-cols-3.
How do I open another plan first, or link to one?
defaultValue="business" on Tabs to another plan's id.To open a plan from a link, such as /pricing?plan=enterprise, read the parameter and make the tabs controlled: pass the selected plan and update it when the visitor picks another. Only the open panel is rendered.How do I connect the call to action to checkout?
The button in each panel is a real link to its plan's href, so point it at your checkout or sign-up route with the plan in the address (/checkout?plan=business) and let your server map the plan to your payment provider's price, or at your contact form for Enterprise, which is priced on request. It's a ShineButton with render set to an a element and nativeButton={false}. Choosing a tab only switches the panel, so visitors can explore every plan freely.
Are the vertical tabs accessible?
Yes. They're real tabs: a vertical tab list named "Plans" whose tabs each control a panel, so a screen reader announces the tab, its position and the panel it opens. Tab reaches the selected plan, Arrow Up and Arrow Down move between plans (Home and End jump to the first and last), and Tab moves on into the open panel. Each tab reads its name, badge, tagline and price ("$25 per user per month"); in the panel the plan is an h3 under the section's h2, the highlights are a description list, and the call to action names its plan, as in "Start 14-day trial, Business plan". The selected tab is marked by its bar and surface, not by colour alone.
How does the layout adapt to small screens?
From the md breakpoint the tabs are a sidebar beside the panel. Below it the same tab list becomes a row of three tabs above the panel, each with its name and price, the taglines and the Best badge hidden to keep them short, and the selected one marked by a line under it; the highlights and feature list stack in one column, and it reads at 320px. The list stays a vertical tab list throughout, so Arrow Up and Down still move between plans on a keyboard, whatever the layout. The highlight moves to the new tab at once.
When should I use vertical tabs instead of a row of plan cards?
Use vertical tabs when each plan has more detail than a card can hold, such as highlights, long feature lists or a description per tier: the plan names stay in view while the detail beside them changes. Use a row of cards or a comparison table when plans differ in a few key features and seeing them side by side matters more than depth per plan.
Related
- Pro
Audience Tabs Pricing
Plan cardsThree 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.
- Pro
Accordion Plans Pricing
Plan rowsThree 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.
- 123123Pro
Split Layout Pricing
Single planA product-led split: a mock of the app built from our own components with numbered callouts on it, matching a 'what you get' list, beside the one plan as a card in a card with a monthly and yearly switch.
- Pro
Featured Plan Pricing
Single planOne plan in the spotlight: an oversized card under a monochrome cone of light with the price as the largest type on the page, a monthly and yearly switch, and a short pitch beside it.
- Pro
Three Columns Pricing
Plan cardsThe 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
Popular Choice Pricing
Proof and guaranteesWhat customers chose: a full-width segmented bar sized by the share of teams that picked each plan (18, 64 and 18 percent), where each segment is a tab that opens its plan, with its price, call to action and features, right under the bar.