A booking chooser: a serif heading that settles in word by word and an intro, then a ruled list of session types on the left that swaps, with a soft blur, the muted detail card on the right showing a serif title, a description, a fact row and a sliding-marker pill.
A session picker built as a ruled list beside a panel: choosing a name on the left blurs a new card into place on the right with its own title, description, three facts and booking action.
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.
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/booking33?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/booking33?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/booking33.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports booking33Demo alongside the block: the exact props behind the preview above. Spread it to get a working session picker in one line.
import { Booking33, booking33Demo } from "@/components/beste/block/booking33";
export default function Page() {
return <Booking33 {...booking33Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Booking33 } from "@/components/beste/block/booking33";
export default function Page() {
return (
<Booking33
eyebrow="Choose a session"
heading="Pick the kind of hour you need."
description="You can change your mind after the first one. Most people do."
types={[
{
name: "First conversation",
title: "Twenty free minutes, on the phone",
description: "A short call to hear what brings you here.",
facts: [
{ label: "Length", value: "20 minutes" },
{ label: "Price", value: "Free" },
{ label: "Where", value: "Phone or video" },
],
button: { label: "Reserve the call", href: "/call", tone: "dark" },
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the heading |
heading | string | – | Section heading, rendered as an h2 through Text1 |
description | string | – | Intro paragraph under the heading |
types | SessionType[] | [] | Session options; the first is selected on mount |
className | string | – | Extra classes for the outer <section> |
type SessionType = {
name: string;
title: string;
description: string;
facts: { label: string; value: string }[];
button: ActionButton;
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};aria-pressed, not tabs. Each one swaps the panel beside it rather than revealing a hidden region, so a pressed toggle is the honest description of what happens.AnimatePresence with mode="wait", so the outgoing card finishes leaving before the next one blurs in and the two never overlap mid-swap.min-h-[20rem], which reserves the height so a short option following a long one does not make the page jump under the reader's cursor.opacity-0, so the row's width does not change when the selection moves.text-foreground/50 and lift to full on hover, so the list reads as a set of choices rather than as a paragraph of headings.h3 with its own facts and its own action, so different session types can point at different booking flows.booking30
A booking section: a serif heading that settles in word by word over the intro, a ruled contact sheet and a practitioner avatar line, beside a calm request form with name and email fields, pill choices for session type and preferred time, a message box and a sliding-marker pill to send.
booking24
An interactive appointment picker: a hairline panel pairing a selectable service list with a scrollable day strip and a time slot grid that marks unavailable times, beside a full-height provider photo with a gradient name card, closing on a live summary bar and confirm action.
booking27
A clinician picker whose hairline list of practitioners, each showing their next opening, swaps an image tile floating a live availability card alongside their focus, background, and sites.
booking1
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.