Activity Experience Booking

Tours and experiences booking card with hero image overlay, rating, duration, difficulty badge, date picker, traveler counter, language selector, highlights list, and reserve CTA. Perfect for guided tours, classes, and local experiences.

PRO

Booking14: Activity Experience Booking

A single-column experience booking card rendering a hero image with a dark overlay, floating rating badge, and title/location caption, a three-column duration/difficulty/group-size info strip, a horizontally scrollable 14-day date picker that greys out unavailable slots, traveler-count and language Select dropdowns, an optional highlights checklist, and a sticky footer that totals price per person against the traveler count and gates a reserve button on date selection.

Upgrade to Pro

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.

Installation

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

bash
npx shadcn add "https://ui.beste.co/r/booking14?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/booking14?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/booking14.tsx, plus the badge, button, and select shadcn/ui primitives it uses for the rating/eyebrow badges, the reserve button, and the traveler and language dropdowns.

Quick start

The installed file exports booking14Demo alongside the block: the exact props behind the preview above. Spread it to get a working experience booking card in one line.

tsx
import { Booking14, booking14Demo } from "@/components/beste/block/booking14";

export default function ExperiencePage() {
  return <Booking14 {...booking14Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Booking14 } from "@/components/beste/block/booking14";

export default function ExperiencePage() {
  return (
    <Booking14
      badge={{ label: "Experiences", variant: "secondary" }}
      heading="Book your <strong>next adventure</strong>"
      experienceTitle="Sunrise Hot Air Balloon Ride"
      experienceLocation="Cappadocia, Türkiye"
      experienceImage="/experiences/balloon.jpg"
      rating={4.9}
      reviewCount={1847}
      duration="3 hours"
      difficulty="Easy"
      groupSize="Up to 20"
      currency="$"
      pricePerPerson={189}
      languages={["English", "Spanish", "French"]}
      highlights={["Professional pilot", "Panoramic views", "Hotel pickup"]}
      unavailableDates={["2026-07-15", "2026-07-18"]}
      labels={{ pickDateLabel: "Pick a date", reserveButton: "Reserve experience" }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Optional eyebrow badge above the heading
headingstringSection heading, supports inline <strong>
descriptionstringLead paragraph under the heading
experienceTitlestringTitle shown over the hero image and used as the image alt
experienceLocationstringLocation line with pin icon over the hero
experienceImagestringHero image URL; the whole hero block is omitted when absent
ratingnumberNumeric rating in the floating hero badge
reviewCountnumberParenthetical review count next to the rating
durationstringFirst info pill value (clock icon)
difficultystringSecond info pill value (mountain icon)
groupSizestringThird info pill value (users icon)
currencystring"$"Currency symbol prefixed to prices
pricePerPersonnumber0Per-person price, multiplied by traveler count for the total
languagesstring[][]Options for the language Select
highlightsstring[][]Checklist items; section hidden when empty
unavailableDatesstring[][]ISO date keys ("2026-07-15") that disable matching date buttons
labelsBooking14Labels{}All static UI strings (see type below)
classNamestringExtra classes for the outer <section>
ts
type Booking14Labels = {
  todayLabel?: string;
  durationLabel?: string;
  difficultyLabel?: string;
  groupSizeLabel?: string;
  pickDateLabel?: string;
  travelersLabel?: string;
  languageLabel?: string;
  highlightsLabel?: string;
  perPersonLabel?: string;
  totalLabel?: string;
  reserveButton?: string;
  travelerSingular?: string;
  travelerPlural?: string;
};

Behavior notes

Wiring the form up

This block ships the form markup only; state, validation, and submit are yours to add. Our guide wires the shadcn Field primitives to React Hook Form, TanStack Form, and Formisch on one field system.

More Booking blocks

View all Booking
PRO

booking12

Search Bar Hero

Airbnb/Booking.com-style search bar with location autocomplete, date range picker, guest counter dropdown, and search CTA. Responsive — inline on desktop, stacked on mobile. The universal booking hero section.

PRO

booking2

Reservation Summary

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.

FREE

booking5

Provider Picker

Staff/provider selection cards with avatar, name, specialty, star rating, review count, availability badge, experience years, and selected state. Grid layout with "Any Provider" option.

PRO

booking7

Hotel Room Booking

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.

PRO

booking17

Ride Booking

Ride-share style booking with pickup/dropoff address inputs, schedule now/later toggle, ride class selector (economy/comfort/xl) with ETA and fare, payment method row, and confirm ride CTA. Perfect for taxi, transfer, and shuttle apps.

PRO

booking9

Event Ticket Booking

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.