A time picker that combines a trigger field with a scrollable wheel popup for selecting an hour, minute, and optional AM/PM period.
TimePicker uses @internationalized/date for time manipulation (Time, locale-aware formatting). The wheel exchanges a Time value internally, while the selected option stores an ISO time string. For full context on the time type exposed through formatTime, read the @internationalized/date docs alongside this page.
TimePicker: Root container that manages time selection state, open state, label formatting, and form field context (for Label, Description, FieldError). Supports controlled and uncontrolled modes.
TimePicker.Select: Pre-wired Select root connected to the TimePicker context. State props (value, isOpen, onValueChange, onOpenChange) are managed by the root. Always single selection mode.
TimePicker.Trigger: Pressable trigger button that opens the wheel overlay. Inherits invalid border styling from the root.
TimePicker.Value: Text display for the selected time label. Shows a placeholder when no time is selected.
TimePicker.TriggerIndicator: Indicator icon inside the trigger. Defaults to a clock icon instead of a chevron.
TimePicker.Portal: Portal wrapper that re-provides TimePicker context across the portal boundary.
TimePicker.Overlay: Backdrop overlay behind the wheel content.
TimePicker.Content: Content container for the wheel popup. Supports "popover", "dialog", and "bottom-sheet" presentations. Dialog swipe-to-dismiss is always disabled, and the bottom sheet defaults to no pan-down-to-close.
TimePicker.Wheel: Pre-wired wheel time selector that commits the selected time live on scroll and updates the trigger label while the surface stays open. Renders the default wheel parts when no children are passed.
TimePicker.WheelHour: Hour column.
TimePicker.WheelMinute: Minute column.
TimePicker.WheelPeriod: AM/PM column. Rendered by default only in 12-hour mode.
TimePicker.WheelIndicator: Shared selection band spanning every column.
TimePicker.WheelMask: Top / bottom fade overlays. Defaults its gradient color to the overlay surface so it blends with the popup background.
The TimePicker uses a popover presentation by default. Pass TimePicker.Wheel with no children to render the default hour, minute, period, indicator, and mask parts.
Use hourFormat to switch between 12-hour and 24-hour mode, and minuteInterval to control the step between minute options. In 24-hour mode the AM/PM column is omitted.
Use root props for required, invalid, and disabled states. Combine isInvalid with FieldError to display validation messages; the trigger shows a danger border.
<TimePicker isInvalid> <Label>Cutoff</Label> <TimePicker.Select> <TimePicker.Trigger> <TimePicker.Value /> <TimePicker.TriggerIndicator /> </TimePicker.Trigger> <TimePicker.Portal> <TimePicker.Overlay /> <TimePicker.Content presentation="popover" width="trigger"> <TimePicker.Wheel /> </TimePicker.Content> </TimePicker.Portal> </TimePicker.Select> <Description hideOnInvalid>Must be during business hours.</Description> <FieldError>Please select a valid cutoff time.</FieldError></TimePicker>
The content component is a union type based on the presentation prop. The dialog isSwipeable prop is removed — TimePicker always disables dialog swipe-to-dismiss, and the bottom sheet defaults to no pan-down-to-close.
Wired from TimePicker context; value, defaultValue, and onValueChange are managed by the root. Each scroll commits the selected option (formatted label + select value) live while the surface stays open. When children are omitted, the default wheel parts are rendered (period column only in 12-hour mode).
prop
type
default
description
children
React.ReactNode
-
Wheel parts; defaults to Hour, Minute, Period (12h), Indicator, and Mask
hourFormat
WheelTimePickerHourFormat
root value
Overrides the root hour display mode for the wheel
minuteInterval
number
root value
Overrides the root step between minute options
itemHeight
number
44
Pixel height of a single row, shared by all columns
visibleCount
number
5
Number of visible rows, shared by all columns. Must be odd
isDisabled
boolean
false
Disables interaction for the whole wheel
locale
string
root value
Overrides the root locale for the wheel's AM/PM labels
className
string
-
Additional CSS classes for the wheel container
animation
WheelTimePickerRootAnimation
-
Animation configuration; cascades disable-all to the columns
...ViewProps
Omit<ViewProps, 'children'>
-
All standard React Native View props are supported