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.
A single-card ride-share booking form that stacks pickup and drop-off text inputs joined by a vertical route indicator, a "now" / "later" schedule tab pair with a contextual hint line, a divided list of selectable ride classes each showing an icon, label, optional popular badge, ETA, seat capacity and fare, an optional payment method row, and a sticky footer that echoes the selected ride's fare next to a confirm 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/booking17?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/booking17?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/booking17.tsx, plus the badge, button, and tabs shadcn/ui primitives it uses for the section eyebrow and ride popular badge, the confirm button, and the schedule now/later toggle.
The installed file exports booking17Demo alongside the block: the exact props behind the preview above. Spread it to get a working ride booking card in one line.
import { Booking17, booking17Demo } from "@/components/beste/block/booking17";
export default function Page() {
return <Booking17 {...booking17Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Car, CarFront, Truck } from "lucide-react";
import { Booking17 } from "@/components/beste/block/booking17";
export default function Page() {
return (
<Booking17
badge={{ label: "Transfer", variant: "secondary" }}
heading="Book your <strong>ride</strong>"
currency="$"
defaultPickup="Atatürk Airport, Terminal 2"
defaultDropoff="Hilton Istanbul Bosphorus"
rideClasses={[
{ value: "economy", label: "Economy", description: "Affordable rides for up to 4", capacity: 4, eta: "3 min", price: 18, icon: CarFront },
{ value: "comfort", label: "Comfort", description: "Newer cars with more legroom", capacity: 4, eta: "5 min", price: 26, icon: Car, popular: true },
{ value: "xl", label: "XL", description: "Extra space for groups & luggage", capacity: 6, eta: "7 min", price: 38, icon: Truck },
]}
paymentMethod={{ label: "Visa •••• 4242", description: "Default card" }}
labels={{ scheduleNowLabel: "Now", scheduleLaterLabel: "Later", bookButton: "Confirm ride" }}
/>
);
}| 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 | – | Muted paragraph under the heading |
currency | string | "$" | Symbol prefixed to every ride price and the footer total |
defaultPickup | string | "" | Initial value of the pickup input |
defaultDropoff | string | "" | Initial value of the drop-off input |
rideClasses | RideClass[] | [] | Selectable ride rows |
paymentMethod | { label: string; description: string } | – | Optional payment row; omit to hide it |
labels | Booking17Labels | {} | All inline copy strings (see type below) |
className | string | – | Extra classes for the outer <section> |
type RideClass = {
value: string;
label: string;
description: string;
capacity: number;
eta: string;
price: number;
icon: LucideIcon;
popular?: boolean;
};
type Booking17Labels = {
pickupLabel?: string;
pickupPlaceholder?: string;
dropoffLabel?: string;
dropoffPlaceholder?: string;
scheduleLabel?: string;
scheduleNowLabel?: string;
scheduleLaterLabel?: string;
scheduleHintNow?: string;
scheduleHintLater?: string;
popularBadge?: string;
paymentLabel?: string;
etaPrefix?: string;
capacitySuffix?: string;
totalLabel?: string;
bookButton?: string;
};"now" / "later"), and the selected ride class are all held in internal useState and are never surfaced through props or callbacks, so the parent cannot read or control the current selection.popular is true, otherwise the first ride in rideClasses, otherwise an empty string when the list is empty.heading is rendered through dangerouslySetInnerHTML, so inline <strong> markup is honored and picks up the primary-color bold styling; any other supplied HTML is injected verbatim.console.log(...) with the booking payload, so wiring an actual submit is left to the integrator.paymentMethod is absent.scheduleHintNow and scheduleHintLater based on the active tab, but the choice has no other effect: no date or time picker is rendered for the "later" option.activeRide?.price ?? 0, so it falls back to 0 (prefixed by currency) whenever no ride is selected, and the per-row and footer fares are static numbers with no quantity or distance math applied.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.
booking20
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.
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.
booking15
Post-booking success screen with animated check icon, confirmation number, booking summary (service, date/time, location, total), scannable QR code ticket, action buttons (calendar, receipt, directions), and email confirmation note.
booking14
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.
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.
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.