Event ticket selection with event banner, date/venue info, ticket tier cards (General/VIP/Backstage) with perks list, quantity selector, and order total. Concert and conference ticket flow.
A single-column ticket picker for one event: an optional banner image with a live-event badge, a date/time/venue info bar, a stack of selectable ticket-tier cards each listing perks and a per-ticket price, with a quantity stepper that appears on the selected tier and a sticky footer summarizing the running order total behind a book button.
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/booking9?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/booking9?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/booking9.tsx, plus the badge and button shadcn/ui primitives it uses for the event and tier badges and the footer book button.
The installed file exports booking9Demo alongside the block: the exact props behind the preview above. Spread it to get a working ticket picker in one line.
import { Booking9, booking9Demo } from "@/components/beste/block/booking9";
export default function Page() {
return <Booking9 {...booking9Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Booking9 } from "@/components/beste/block/booking9";
export default function Page() {
return (
<Booking9
badge={{ label: "Tickets on sale", variant: "secondary" }}
heading="Grab your <strong>tickets</strong>"
description="Pick a tier and choose how many tickets you need."
eventName="Neon Horizons Music Festival"
eventImage="https://example.com/event.jpg"
date="June 21, 2026"
time="6:00 PM"
venue="Skyline Arena"
location="Los Angeles, CA"
currency="$"
tiers={[
{
name: "General Admission",
price: 79,
description: "Access to main stage and food court areas.",
perks: [{ text: "Main stage access" }, { text: "Food & drink vendors" }],
maxQty: 10,
remaining: 142,
},
{
name: "VIP Experience",
price: 199,
description: "Premium viewing area with complimentary drinks.",
perks: [{ text: "VIP lounge & viewing deck" }, { text: "Fast-track entry" }],
maxQty: 6,
remaining: 38,
highlight: true,
},
]}
labels={{ noSelection: "Select tickets to continue", bookButton: "Get Tickets" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string; variant?: "default" | "secondary" | "outline" } | – | Section eyebrow badge above the heading |
heading | string | – | Section heading, supports inline <strong> |
description | string | – | Paragraph rendered under the heading |
eventName | string | – | Title overlaid on the banner and passed to the book log |
eventImage | string | – | Banner image URL; the whole banner block is omitted when unset |
date | string | – | Displayed in the info bar with a calendar icon |
time | string | – | Displayed in the info bar with a clock icon |
venue | string | – | Displayed in the info bar with a map-pin icon |
location | string | – | Appended after venue as , location; only shown when venue is set |
currency | string | "$" | Prefix for every price and the order total |
tiers | TicketTier[] | [] | Selectable ticket-tier cards |
labels | Booking9Labels | {} | Text overrides for badges, price suffix, and button copy |
className | string | – | Extra classes for the outer <section> |
type TicketPerk = {
text: string;
};
type TicketTier = {
name: string;
price: number;
description: string;
perks: TicketPerk[];
maxQty: number;
remaining?: number;
highlight?: boolean;
};
type Booking9Labels = {
liveEventBadge?: string;
popularBadge?: string;
perTicketLabel?: string;
remainingSuffix?: string;
noSelection?: string;
bookButton?: string;
};tier.name as a string key in internal useState, not an index or id, so two tiers sharing a name would both be treated as selected; this state is never lifted out, so the active pick is unobservable from the parent.Record<string, number> state keyed by tier name and default to 0; the stepper only renders inside the currently selected card, so switching tiers hides the previous stepper but retains its count.<button> elements that clamp between 0 and tier.maxQty and call stopPropagation so tapping them does not re-trigger the card's select handler.heading supports inline <strong> markup rendered via dangerouslySetInnerHTML, styled bold and in the primary color.0; clicking it only calls console.log("Ticket purchase:", ...), so wiring an actual checkout is left to the integrator.liveEventBadge, eventName, each info-bar field, the popularBadge (shown only when a tier has highlight), and the remaining count are each conditionally rendered and drop out silently when their value is missing.remaining count turns red and bold when it is <= 10, otherwise it reads in muted text; the whole info line is hidden when remaining is null or undefined.noSelection label until a tier and quantity are chosen.booking7
Hotel room selection with room type cards showing images, amenity icons, guest capacity, price per night, check-in/check-out date picker, guest counter, and total price summary.
booking8
Flight search results with airline logos, departure/arrival times, duration, stops, class selector (economy/business/first), baggage info, and price comparison. Airline ticket booking flow.
booking6
Restaurant table reservation with guest count selector, date/time picker, seating preference (indoor/outdoor/bar), special requests textarea, and booking summary. Fine dining reservation flow.
booking2
Booking confirmation card with service details, date/time, provider info with avatar, price breakdown with subtotal/tax/discount/total, promo code input, cancellation policy, and confirm CTA.
booking10
Coworking meeting room reservation with room cards showing capacity, equipment icons, hourly pricing, time range selector, attendee count, and total cost. Office and coworking space booking flow.
booking11
Google Flights-style price calendar with per-day pricing, cheapest day highlights, expensive day indicators, date range selection, and best deal summary banner. Universal for hotels, flights, car rentals, and vacation bookings.