Appointment List

My schedule

Your appointments

Manage your upcoming and past bookings in one place.

Today — April 14, 2026

Deep Tissue Massage

Dr. Emily Carter

Confirmed
14:00 · 60 minSerenity Spa
Tomorrow — April 15, 2026

Dental Checkup

Dr. James Wilson

Pending
09:30 · 30 minCity Dental Clinic

Personal Training

Marcus Johnson

Confirmed
17:00 · 45 minFitZone Gym
Saturday — April 18, 2026

Hair Styling

Sofia Martinez

Confirmed
11:00 · 90 minGlow Studio
About this block

Appointment ListPRO

Upcoming and past appointments list grouped by date, with service name, provider avatar, time, duration, status badges (confirmed/pending/cancelled), and reschedule/cancel action buttons.

Booking3: Appointment List

A tabbed appointment manager rendering a bordered card whose tabs (e.g. Upcoming/Past) each hold date-grouped rows, every row showing a provider avatar, service name, provider name, a colored status badge, a time-and-duration line with optional location, and reschedule/cancel buttons, closed by a sticky footer "Book New Appointment" button.

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.

Upgrade Now

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

Base UI flavor

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

This installs the block to components/beste/block/booking3.tsx, plus the avatar, badge, button, and tabs shadcn/ui primitives it uses for the provider images, status badges, action buttons, and tab switcher.

Quick start

The installed file exports booking3Demo alongside the block: the exact props behind the preview above. Spread it to get a working appointment list in one line.

tsx
import { Booking3, booking3Demo } from "@/components/beste/block/booking3";

export default function AppointmentsPage() {
  return <Booking3 {...booking3Demo} />;
}

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

tsx
import { Booking3 } from "@/components/beste/block/booking3";

export default function AppointmentsPage() {
  return (
    <Booking3
      badge={{ label: "My schedule", variant: "secondary" }}
      heading="Your <strong>appointments</strong>"
      description="Manage your upcoming and past bookings in one place."
      tabs={[
        {
          label: "Upcoming",
          groups: [
            {
              label: "Today",
              appointments: [
                {
                  service: "Deep Tissue Massage",
                  provider: { name: "Dr. Emily Carter", avatar: "/emily.jpg" },
                  time: "14:00",
                  duration: "60 min",
                  location: "Serenity Spa",
                  status: "confirmed",
                },
              ],
            },
          ],
        },
      ]}
      labels={{
        statusConfirmed: "Confirmed",
        rescheduleButton: "Reschedule",
        cancelButton: "Cancel",
        footerButton: "Book New Appointment",
      }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Optional eyebrow badge above the heading
headingstringSection heading, supports inline <strong>
descriptionstringOptional supporting line under the heading
tabsBooking3Tab[][]Tab entries, each holding date-grouped appointments
labelsBooking3Labels{}Status label and button text overrides
classNamestringExtra classes for the outer <section>
ts
type AppointmentStatus = "confirmed" | "pending" | "cancelled";

type Appointment = {
  service: string;
  provider: { name: string; avatar?: string };
  time: string;
  duration: string;
  location?: string;
  status: AppointmentStatus;
};

type DateGroup = {
  label: string;
  appointments: Appointment[];
};

type Booking3Tab = {
  label: string;
  groups: DateGroup[];
};

type Booking3Labels = {
  statusConfirmed?: string;
  statusPending?: string;
  statusCancelled?: string;
  rescheduleButton?: string;
  cancelButton?: string;
  footerButton?: string;
};

Behavior notes

  • The tab switcher is the shadcn Tabs component with defaultValue set to tabs[0]?.label; each tab's label doubles as its value, so two tabs sharing a label would collide and neither the active tab nor selection is exposed via any callback.
  • heading is injected with dangerouslySetInnerHTML, and the [&>strong] styles bold plus tint any inline <strong> in the primary color; only pass trusted markup.
  • Status rendering is driven by apt.status: confirmed is emerald and prefixed with a Check icon, pending is amber, and cancelled is rose. The visible badge text comes from the matching labels.status* value, so an unset label renders an empty badge.
  • A cancelled appointment dims its whole row to opacity-60, strikes through the service name, and hides the reschedule/cancel button pair entirely; only non-cancelled rows show those two buttons.
  • The reschedule, cancel, and footer "Book New Appointment" buttons are decorative: they carry no onClick handler at all, so wiring real actions is left to the integrator.
  • The header block (badge, heading, description) only renders when at least one of those three props is set; the whole card is capped at max-w-lg and the card body has no internal scroll limit, so long appointment lists grow the page.
  • location is optional per appointment: when absent, the MapPin line is omitted and only the Clock time-and-duration span shows.

More Booking blocks

View all Booking
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.

PRO

booking24

Service And Slot Picker

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.

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.

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

booking25

Booking Confirmed

A confirmation screen with an accent eyebrow, a two-column hairline table of the appointment details, a checked list of what to bring, and a sticky tile floating the live phone view the member also receives.

FREE

booking15

Booking Confirmation Receipt

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.