Car Rental Booking

Vehicle rental flow with pickup and return location fields, date range picker, car class grid (compact/suv/luxury) with image and specs, insurance tier selector, optional add-ons, and live price breakdown.

PRO

Booking20: Car Rental Booking

A single-card vehicle rental configurator that stacks pickup and return location selects (with a "same location" checkbox that mirrors and disables the return field), a range calendar in a popover, a selectable list of car-class cards showing image, seat and bag counts, transmission, fuel, and per-day price, a tabbed insurance tier selector, a checkbox grid of add-ons, and a live subtotal-plus-total breakdown that recomputes from the selected day count on every change.

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/booking20?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/booking20.tsx, plus the badge, button, calendar, checkbox, popover, select, and tabs shadcn/ui primitives it uses for the popular/day badges, the reserve button, the date-range picker, the location and add-on toggles, the dates popover, the location dropdowns, and the insurance tier tabs.

Quick start

The installed file exports booking20Demo alongside the block: the exact props behind the preview above. Spread it to get a working car rental configurator in one line.

tsx
import { Booking20, booking20Demo } from "@/components/beste/block/booking20";

export default function Page() {
  return <Booking20 {...booking20Demo} />;
}

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

tsx
import { Booking20 } from "@/components/beste/block/booking20";

export default function Page() {
  return (
    <Booking20
      badge={{ label: "Car rental", variant: "secondary" }}
      heading="Rent the <strong>right ride</strong>"
      currency="$"
      locations={[
        { value: "sfo", label: "San Francisco Airport (SFO)" },
        { value: "lax", label: "Los Angeles Airport (LAX)" },
      ]}
      defaultPickupLocation="sfo"
      defaultReturnLocation="sfo"
      carClasses={[
        {
          value: "suv",
          label: "Mid-size SUV",
          example: "Honda CR-V or similar",
          image: "/cars/crv.jpg",
          seats: 5,
          bags: 4,
          transmission: "Automatic",
          fuel: "Hybrid",
          pricePerDay: 68,
          popular: true,
        },
      ]}
      insuranceTiers={[
        { value: "basic", label: "Basic", description: "Liability only", pricePerDay: 0 },
      ]}
      addOns={[{ value: "gps", label: "GPS navigation", pricePerDay: 6 }]}
      labels={{ bookButton: "Reserve car", perDayLabel: "/ day", totalLabel: "Total" }}
    />
  );
}

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
currencystring"$"Symbol prefixed to every price
locationsRentalLocation[][]Options for the pickup and return selects
defaultPickupLocationstring""Initial pickup location value
defaultReturnLocationstring""Initial return location value (used only when "same location" is off)
carClassesCarClass[][]Selectable vehicle cards
insuranceTiersInsuranceTier[][]Tabs for the insurance selector
addOnsRentalAddOn[][]Optional per-day extras in the checkbox grid
labelsBooking20Labels{}All field labels, placeholders, and button copy
classNamestringExtra classes for the outer <section>
ts
type RentalLocation = {
  value: string;
  label: string;
};

type CarClass = {
  value: string;
  label: string;
  example: string;
  image: string;
  seats: number;
  bags: number;
  transmission: string;
  fuel: string;
  pricePerDay: number;
  popular?: boolean;
};

type InsuranceTier = {
  value: string;
  label: string;
  description: string;
  pricePerDay: number;
};

type RentalAddOn = {
  value: string;
  label: string;
  pricePerDay: number;
};

type Booking20Labels = {
  pickupLocationLabel?: string;
  pickupLocationPlaceholder?: string;
  returnLocationLabel?: string;
  sameLocationLabel?: string;
  datesLabel?: string;
  datesPlaceholder?: string;
  carClassLabel?: string;
  insuranceLabel?: string;
  addOnsLabel?: string;
  popularBadge?: string;
  daysLabel?: string;
  perDayLabel?: string;
  totalLabel?: string;
  bookButton?: 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

booking18

Cinema Seat Picker

Interactive seat selection grid for cinemas, theaters, and events. Row/column layout with an aisle gap, tier-based pricing (standard/premium/VIP), occupied seats, a live selection summary, and a legend. Includes screen indicator at the top.

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

booking8

Flight Booking

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.

PRO

booking23

Cancellation Flow

Booking cancellation screen with the original booking summary, cancellation reason picker (radio list with optional notes), live refund breakdown based on cancellation policy, confirmation checkbox, and destructive cancel action.

FREE

booking4

Service Selector

Service selection grid with category filter tabs, service cards showing icon, name, description, duration, price, and selected state. Ideal for spa, salon, clinic, and fitness booking flows.

PRO

booking1

Date & Time Picker

Split-panel booking interface with interactive monthly calendar on the left and time slot grid on the right. Features today highlight, disabled dates, selected state, morning/afternoon grouping, and booking summary footer.