Availability Picker is a scheduling widget that combines InlineCalendar with a time-slot grid to let users select one or more date-and-time combinations for availability or appointment scheduling. It produces a structured payload of selected slots that consumers can submit to a booking API. The existing InlineCalendar and ScheduleCalendar provide the date-selection foundation; this widget adds the time-slot grid, multi-day selection, and structured output.
Goals
Deliver an <AvailabilityPicker> component that pairs a calendar with a time-slot grid.
Support multi-day selection for indicating availability across multiple dates.
Produce a structured payload of selected date/time slots.
Compose existing InlineCalendar for date selection.
Ship Storybook stories with realistic scheduling scenarios.
Non-Goals
Backend booking API integration or availability checking.
Timezone conversion (consumer provides slots in the desired timezone).
Integration with external calendar services (Google Calendar, Outlook, etc.).
Drag-to-select across multiple time slots (click-to-toggle only).
Scope
In Scope
Area
Description
Component
<AvailabilityPicker> combining calendar and time-slot grid
Date Selection
InlineCalendar composition for selecting dates
Time-Slot Grid
Grid of time slots (configurable interval) for each selected date
Multi-Day
Users can select slots across multiple days
Structured Payload
onChange fires with { date: string; time: string }[]
States
Loading time slots, no available slots, error
Stories
Storybook stories for single-day, multi-day, and edge cases
Out of Scope
Area
Reason
Backend availability checking
Consumer provides available slots; widget handles selection
Timezone conversion
Consumer responsibility
Recurring availability
One-off selection; recurring patterns are ScheduleCalendar territory
Drag-to-select
Click-to-toggle is simpler and more accessible
External calendar sync
Application-layer concern
Users and Pain Points
User Groups
User
Description
Needs
Developers
Engineers building scheduling features
A composable date+time picker using DS components
Designers
Design-system consumers
Consistent scheduling UX aligned with DS tokens
End Users
People selecting availability or booking times
Intuitive date and time selection across multiple days
Pain Points
User
Pain Point
Impact
Developers
Building date+time selection requires wiring calendar, time grid, and state management from scratch
Complex implementation, inconsistent UX
End Users
Many scheduling UIs require selecting one day at a time, requiring multiple round-trips
Frustrating multi-day availability indication
Definitions
Term
Definition
Availability Picker
A widget combining a calendar and time-slot grid for selecting date/time combinations
Time Slot
A selectable time option within a day (e.g., “9:00 AM”, “9:30 AM”)
Slot Interval
The time gap between consecutive slots (e.g., 15 min, 30 min, 60 min)
Selected Slots
The structured list of date/time combinations the user has chosen
Current State
Existing Behavior
InlineCalendar provides an always-visible month calendar with day selection and event dots. ScheduleCalendar provides a custody/assignment calendar with party-based day coloring. Neither component includes a time-slot selection layer or multi-day availability indication.
Current Limitations
No time-slot grid component exists in the design system.
Introduce <AvailabilityPicker> that renders an InlineCalendar on the left (or top on mobile) and a time-slot grid on the right (or bottom). When a user selects a date on the calendar, the time-slot grid shows available slots for that date. Users toggle slots on/off by clicking. Selected slots across all dates are tracked and emitted via onChange. A summary section below shows all selected date/time pairs.
Key Capabilities
Calendar-driven date selection via InlineCalendar.
Configurable time-slot grid (interval, start hour, end hour).
Multi-day selection: slots selected on one date persist when navigating to another date.
Structured onChange payload with all selected slots.
Summary display of selected slots with remove capability.
Available vs. unavailable slot states (consumer marks which slots are available).
User Experience
Users see a calendar alongside a time-slot grid. They click a date on the calendar, and the grid shows time slots for that day. Available slots are clickable; unavailable slots are greyed out. Clicking a slot toggles it. A summary below lists all selected slots across all dates. Users can remove a slot from the summary by clicking its remove button.