A date rail bound to a grid of time slots that reloads for the day you pick.
An appointment booking screen: a date rail where each day shows how much is left, a grid of time slots that restaggers when the day changes, taken slots genuinely disabled, a selection that survives the day change when the time still exists, and a sticky confirm bar.
$199 once, every piece included. See how installing works · Sign in
SwiftUI source you own, built on Apple frameworks only.
How it behaves, what it handles, and the decisions behind it.
Each day cell on the rail carries how many slots are still open, and a fully booked day is struck through and cannot be tapped. Picking a day reloads the grid below it: the times cross-fade and stagger back in, taken times stay in place struck through and disabled, and the chosen time survives the change whenever the new day offers it. When it does not, the selection clears itself, so the sticky confirm bar can never send a booking for a slot that no longer exists.
SlotPickerSlot.date(on:calendar:) turns it back into the date you send.isAvailable rather than dropping them, so a busy day still reads as a day with times on it.disabled, not just struck through, and VoiceOver reads "2:00 PM, unavailable". Day cells report the date and the number of slots left, and both the rail and the grid are containers with 44pt targets.SlotPickerExample at the end of SlotPicker.swift is the screen shown in the preview; copy it as a starting point.Pieces that work well next to this one.