Skip to content
GetUrUI

Date pickers

4 variantsNewPro
.md

Four hand-built date pickers for real jobs — a stay range with nights and price, a deadline with quick picks, a recurring schedule and an appointment slot finder — with months that slide and selections that spring.

date pickercalendarrangebookingdeadlinerecurringscheduleappointmenttime slotsform

Booking range

booking-range.tsx

Check-in and check-out on one calendar with a hover preview, booked nights blocked, a minimum stay and a total that rolls as the range changes.

$npx shadcn@latest add @geturui-pro/date-pickers-booking-range
PropTypeDefaultDescription
todayDateOct 2, 2026Days before this are disabled. Pass new Date() in your app.
pricePerNight / cleaningFeenumber184 / 45Used for the running total.
currencystring"USD"ISO currency for formatting.
minNightsnumber2Shortest allowed stay; shorter picks shake with a message.
bookedstring[]—Unavailable nights as YYYY-MM-DD.
defaultCheckIn / defaultCheckOutDate | null—Initial range.
onChange / onReserve(range: BookingRange) => void—Fires with { checkIn, checkOut, nights, total }.
classNamestring—Extra classes on the root element.

Deadline

deadline.tsx

Quick picks such as tomorrow, end of week and next week beside a calendar, with a sliding preset pill and a relative due label.

$npx shadcn@latest add @geturui-pro/date-pickers-deadline
PropTypeDefaultDescription
todayDateOct 2, 2026Anchor for presets and the relative label.
defaultValueDate | null—Initially selected deadline.
presets{ label: string; days: number }[]—Quick picks as days from today.
onChange(date: Date | null) => void—Fires on every pick or clear.
onConfirm(date: Date | null) => void—Set deadline button.
classNamestring—Extra classes on the root element.

Recurring schedule

recurring.tsx

Weekday toggles, an every-N-weeks stepper and time chips, previewed live as dots on a calendar with the next three dates spelled out.

$npx shadcn@latest add @geturui-pro/date-pickers-recurring
PropTypeDefaultDescription
todayDateOct 2, 2026Earliest selectable start date.
defaultDaysnumber[][0, 2]Weekdays, 0 = Monday.
times / defaultTimestring[] / string—Time chips and the initial one.
defaultIntervalnumber1Repeat every N weeks (1–4).
defaultStartDate—First possible occurrence.
onChange / onSave(s: RecurringSchedule) => void—Fires with { days, time, interval, start }.
classNamestring—Extra classes on the root element.

Appointment slots

appointment.tsx

A seven-day strip with a sliding selection, a time grid that crossfades per day and a booking bar that springs up with a confirmed state.

$npx shadcn@latest add @geturui-pro/date-pickers-appointment
PropTypeDefaultDescription
todayDateOct 2, 2026First day of the strip.
host / titlestring—Who the call is with and what it is.
durationMinutesnumber30Shown in the header and booking bar.
timezonestring—Label under the time grid.
getSlots(date: Date) => string[]—Open times for a day; empty days are dimmed.
defaultTimestring | nullnullPreselect a time on the first open day.
onBook(slot: { date: Date; time: string }) => void | Promise<void>—Resolve to show the booked state.
classNamestring—Extra classes on the root element.

Install the whole set

Installs every date pickers variant at once. Each section above has its own command for a single variant.

Pro installs use your private registry token. Add the @geturui-pro registry once — setup guide. The command works after you get Pro.

$npx shadcn@latest add @geturui-pro/date-pickers

Accessibility

  • Calendars are ARIA grids with one tab stop: arrows move by day and week, Home and End jump to the week's edges, PageUp and PageDown change month (Shift for year).
  • Disabled and booked days are real disabled buttons with a spoken reason, and month changes are announced through a live region.
  • Month slides, number rolls and pops collapse to fades when reduced motion is requested.

Related