Skip to content

shadcn.io is an independent project built on shadcn/ui

Concert Ticket Product Card Block for Radix UI

A concert seating chart drawn as nested bands around a stage, where each zone is a radio that fills a side cell with price and seats left, and a ticket stepper adds a 15 percent fee.

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

Let fans pick where they sit before they pay with this concert ticket card for React with Radix UI. A hairline frame holds a seating chart at the start: a stage, then the floor, the lower bowl and the upper bowl as widening bands, each a native radio showing its name, price and seats left. The chosen zone fills the side cell with a large price, a plain description ("Standing, closest to the stage") and a "Few seats left" badge when twenty or fewer remain. A stepper takes up to 8 tickets, capped by the seats left, and a description list adds a 15 percent fee, rounded to whole cents, to the total. One Shine Button holds the tickets and turns into "Held" with an Undo. For concert halls, theatres, stadium tours and any venue with priced zones.

FAQ

How do I change the zones and prices?

Edit the ZONES array at the top of the file: each zone has an id, a name, a price in integer cents, the seats open, a detail line and a width class for its band. The fee is FEE_PERCENT, and the fee in cents is rounded once in feeOf, so the lines always add up to the total.

Is the chart an image?

No. It is HTML: the stage is a shaped block and each zone is a label around a native radio, so every zone has a real name, a real focus ring and works with arrow keys. There is nothing to map from pixels to seats.

Can people pick exact seats?

No, this card sells by zone. To choose seats, replace the side cell with your seat map once a zone is chosen and keep the zone radios as the first step.

What stays local, and how do I wire it for real?

The prices, the seats and the hold are typed or page state, and nothing is stored, charged or sent. Replace ZONES with your inventory and the body of hold with a call that reserves the seats.

How does it look on a phone?

The chart stays whole: the three bands go full width and stack under the stage, and the side cell sits under the chart with its own top rule.

Is it accessible?

The chart is a fieldset named "Seating chart" with one radio per zone, whose text carries the name, price and seats left. The totals are a description list and a polite status line announces each change.