Skip to content
shadcn.io

shadcn.io is not affiliated with official shadcn/ui

Split Panel Pricing Card Visual CTA Block for React

A reverse split call to action for a team workspace: a membership card that tilts toward the pointer on a tinted panel flush to the rails, beside the Team plan's pitch and a Shine Button.

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 a plan as an object with this reverse split pricing card section. At the start, a tinted panel runs flush to the page's solid rails and holds a credit-card-shaped membership card: the plan's name pressed into its face with Emboss Text, a chip, a member number and the per-seat price printed on it, on a raised card that follows the theme. Moving the pointer over the card tilts it toward that side in perspective, with a soft highlight that follows, and it settles flat when the pointer leaves. The tilt is CSS only, with no script. Past a solid divider that meets the top rule sit a Badge, a headline, a short paragraph, four ticked team features, the Shine Button (the only primary control) and a line that works out the price for five seats. The copy comes first in the DOM and on phones, so the button lands on the first screen; the panel follows under a ruled line. Built with Badge, Emboss Text, Shine Button, Guides, Lucide icons and Tailwind CSS. For team and membership plans, per-seat pricing pages and upgrade prompts.

FAQ

How do I change the plan, the price and the seats?

Edit the constants at the top of the file. PRICE_PER_SEAT and SEATS set the price printed on the card and the total in the sentence under the features, which is computed, and DISCOUNT_SEATS and DISCOUNT feed the discount it mentions. FEATURES is the list of four. The card's name is the text of its Emboss Text, and the member number is plain text in the card: change both to your own.

How does the card tilt without JavaScript?

Nine invisible zones lie over the card in a three by three grid. Each zone says which row and which column it is in, and the wrapper reads whichever one the pointer is over with CSS :has(): it sets one lean for the row and one for the column, from minus one to one. The card turns by those leans in perspective, with a transition, and the highlight on its face moves with them. When the pointer leaves, both leans fall back to zero and the card settles. There is no event handler, so it works the same on the server and on every framework.

What changes with reduced motion?

The card doesn't tilt: its transform is switched off and the highlight stays put, so it reads as a flat card. The block's entrance is skipped too.

What happens on a touch screen or with a keyboard?

The tilt is decoration, so nothing depends on it. On a touch screen the card tilts toward the last place tapped, as hover does, and a keyboard can't reach it because the card is hidden from assistive technology and has nothing to focus. Everything a visitor needs, the plan, the price per seat and the call to action, is in the text beside the card.

Does the card follow my light and dark theme?

Yes. The card has no dark scope: it is a bg-card card with a ring and a shadow on a bg-muted/40 panel, so it is light on a light page and dark on a dark one, in whichever preset is active. The chip and the rings are drawn in foreground tones, so the Shine Button stays the only primary element.

How do I connect the button to checkout?

The button is a real link: point its href at your Team checkout, for example /checkout?plan=team&seats=5. It's a ShineButton with render set to an a element and nativeButton={false}.

  • Pro

    A split call to action for a product analytics tool: the pitch, a payment-method pill and the Shine Button at the start, one plan card in a hairline frame at the end, between solid rails.

  • Pro

    A reverse split call to action for a partner program: a referral dial in a hairline frame at the start, beside the tiers as ruled rows and a Shine Button that names your tier.

  • Pro

    A centred sponsorship call to action for an open-source project: a band of five amount cells on shared hairlines, a Shine Button that names the chosen monthly amount, a Custom cell that opens a number field in the same space, and a closing band that counts the sponsors.

  • Pro

    A slim upgrade band between solid rails, split by a divider: the headline with a rolling price at the start, a billing segment and a Shine Button on the end.

  • 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

    A 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.