Quick start
Each block below is a complete, runnable component. Edit it, and copy it straight into your app when you're done.
Wheel​
Pass primitives or { label, value } objects.
<WheelPicker items={['XS', 'S', 'M', 'L', 'XL', 'XXL']} value={size} onChange={setSize} />
Time​
The 12h / 24h format comes from the locale automatically.
<TimePicker value={time} onChange={setTime} minuteInterval={5} />
Date (calendar)​
<DatePicker value={date} onChange={setDate} minDate={new Date()} />
Date range​
<> <DatePicker mode="range" value={range} onChange={setRange} minDate={new Date()} /> <Text style={{ textAlign: 'center', color: '#6E685E' }}> {range.start ? formatDate(range.start) : '—'} →{' '} {range.end ? formatDate(range.end) : '—'} </Text> </>
Date (wheel)​
<DatePicker display="wheel" value={birthday} onChange={setBirthday} maxDate={new Date()} />
Select​
Tap the field to open a searchable bottom sheet.
<SelectPicker label="Language" placeholder="Choose a language" options={languages} value={lang} onChange={setLang} />
Emoji​
<> <Text style={{ fontSize: 28, minHeight: 40 }}>{text}</Text> <EmojiPicker height={320} onSelect={(emoji) => setText((t) => t + emoji)} /> </>
In a bottom sheet​
Every picker also ships as a sheet. The sheet keeps a draft and only calls onConfirm when the user taps Done; Cancel, a backdrop tap or a swipe down discards it.
<> <Pressable onPress={() => setOpen(true)} style={{ backgroundColor: '#C8460D', padding: 14, borderRadius: 12 }} > <Text style={{ color: 'white', fontWeight: '600', textAlign: 'center' }} > {range.start && range.end ? `${formatDate(range.start)} → ${formatDate(range.end)}` : 'Pick dates'} </Text> </Pressable> <DatePickerSheet visible={open} onClose={() => setOpen(false)} title="Check-in / Check-out" mode="range" value={range} onConfirm={setRange} minDate={new Date()} /> </>
In a form field​
A field opens the sheet for you and shows the confirmed value, so there's no open state to manage. Each sheet has one: DatePickerField, TimePickerField, DateTimePickerField, WheelPickerField and EmojiPickerField.
<View style={{ gap: 14 }}> <DatePickerField label="Date" placeholder="Pick a date" value={day} onConfirm={setDay} minDate={new Date()} /> <TimePickerField label="Time" placeholder="Pick a time" value={time} onConfirm={setTime} minuteInterval={15} /> </View>
→ Picker fields
Pick a design​
Each picker looks native on its platform by default. Use the switch at the top left of any example to see iOS, Android and Web. To use one look on every platform, set design on the provider or on one component:
<TimePicker design="material" value={time} onChange={setTime} />
→ Designs
Next​
- Core concepts: the few ideas every component shares
- Components: full props for each picker