Search for a command to run...
Drop-in slot booking system with calendar picker, server-enforced availability, conflict detection, and cancellation — pure Prisma and Server Actions, no external scheduling service.
Add these to your .env before installing. The CLI runs Prisma generate and migrate using these values during install — add them first, or the install will fail partway through.
DATABASE_URLrequiredPostgreSQL connection string.
e.g. postgresql://user:pass@localhost:5432/mydbnpx feature101@latest add bookingimport { BookingWidget, BookingList } from '@/features/booking'<BookingWidget resourceId="room-42" resourceName="Conference Room" availableFrom="09:00" availableTo="17:00" slotDurationMinutes={60} /><BookingList onCancelConfirmed={(id) => console.log(id)} />/booking after install to see both components composed on a real page — delete app/booking/page.tsx once you're done evaluating| Prop | Type | Default | Description |
|---|---|---|---|
resourceId* | string | — | Opaque ID for the thing being booked — a userId, roomId, serviceId, or any stable string from your app. |
resourceName* | string | — | Display name shown in the booking card header. |
availableFrom* | string | — | Start of bookable window in "HH:mm" UTC format (e.g. "09:00"). Enforced server-side — not just a UI hint. |
availableTo* | string | — | End of bookable window in "HH:mm" UTC format (e.g. "17:00"). Enforced server-side — not just a UI hint. |
slotDurationMinutes* | number | — | Slot length in minutes (e.g. 30, 60). Server validates that booked slots match this duration exactly. |
onBookingConfirmed | (booking: Booking) => void | — | Callback fired with real server result on confirm only. Never fires optimistically. |
className | string | — | Custom CSS classes for the card wrapper (BookingWidget). |