omverse-ui

Menu

ComponentsExamplesGitHub

Getting started

IntroductionInstallationThemingDesign tokensDark mode

Form

ButtonInputSelectCheckboxRadioSwitchSlidernewDatePickernew

Display

AvatarBadgeCardChipAccordionProgressDivider

Navigation

NavbarBreadcrumbTabsPaginationStepper

Overlay

DialogTooltipToast

Other

IconIconButtonSpinner
ComponentsFormSelect

Select

Single · multi · searchable · grouped · avatar options · 3 sizes

Single selectMulti selectSearchableOption groupsAvatar options3 sizes

Basic

Live preview

Single selection — clearable, required with error state, and disabled

Choose your department

Please select a department

App.tsx
tsx
1import { useState } from 'react'
2import { Select, type SelectOption } from 'omverse-ui'
3 
4const departmentOptions: SelectOption[] = [
5 { value: 'design', label: 'Design' },
6 { value: 'engineering', label: 'Engineering' },
7 { value: 'marketing', label: 'Marketing' },
8 { value: 'product', label: 'Product' },
9 { value: 'sales', label: 'Sales' },
10 { value: 'archived', label: 'Archived', disabled: true },
11]
12 
13const [dept, setDept] = useState('')
14 
15{/* Clearable with helper text */}
16<Select
17 label="Department"
18 placeholder="Select department..."
19 options={departmentOptions}
20 value={dept}
21 onChange={setDept}
22 clearable
23 helperText="Choose your department"
24/>
25 
26{/* Required with error state */}
27<Select
28 label="Required field"
29 placeholder="Select department..."
30 options={departmentOptions}
31 value={dept}
32 onChange={setDept}
33 required
34 error={!dept}
35 errorText="Please select a department"
36/>
37 
38{/* Disabled */}
39<Select
40 label="Disabled"
41 placeholder="Cannot select..."
42 options={departmentOptions}
43 disabled
44/>

Searchable

Live preview

Filters options as the user types — useful for long lists

App.tsx
tsx
1<Select
2 label="Department"
3 placeholder="Search departments..."
4 options={departmentOptions}
5 value={dept}
6 onChange={setDept}
7 searchable
8 clearable
9/>

Option groups

Live preview

Groups options under labeled sections — pass optionGroups instead of options

App.tsx
tsx
1import { type SelectOptionGroup } from 'omverse-ui'
2 
3const countryGroups: SelectOptionGroup[] = [
4 {
5 label: 'Asia',
6 options: [
7 { value: 'in', label: '🇮🇳 India' },
8 { value: 'jp', label: '🇯🇵 Japan' },
9 { value: 'sg', label: '🇸🇬 Singapore' },
10 ],
11 },
12 {
13 label: 'Europe',
14 options: [
15 { value: 'gb', label: '🇬🇧 United Kingdom' },
16 { value: 'de', label: '🇩🇪 Germany' },
17 { value: 'fr', label: '🇫🇷 France' },
18 ],
19 },
20 {
21 label: 'Americas',
22 options: [
23 { value: 'us', label: '🇺🇸 United States' },
24 { value: 'ca', label: '🇨🇦 Canada' },
25 { value: 'br', label: '🇧🇷 Brazil' },
26 ],
27 },
28]
29 
30<Select
31 label="Country"
32 placeholder="Select country..."
33 optionGroups={countryGroups}
34 value={country}
35 onChange={setCountry}
36 searchable
37 clearable
38/>

Avatar options

Live preview

Options with avatarSrc and description render a profile image and subtitle

App.tsx
tsx
1const teamOptions: SelectOption[] = [
2 { value: 'john', label: 'John Doe', description: 'Designer', avatarSrc: 'https://i.pravatar.cc/150?img=1' },
3 { value: 'jane', label: 'Jane Smith', description: 'Engineer', avatarSrc: 'https://i.pravatar.cc/150?img=5' },
4 { value: 'bob', label: 'Bob Lee', description: 'Product', avatarSrc: 'https://i.pravatar.cc/150?img=3' },
5 { value: 'alice', label: 'Alice Wang', description: 'Marketing', avatarSrc: 'https://i.pravatar.cc/150?img=9' },
6]
7 
8<Select
9 label="Assign to"
10 placeholder="Select team member..."
11 options={teamOptions}
12 value={assignee}
13 onChange={setAssignee}
14 searchable
15 clearable
16/>

Multi select

Live preview

Allows selecting multiple options — selected items are shown as removable chips

2 selected

App.tsx
tsx
1const [tags, setTags] = useState(['react', 'ts'])
2 
3<Select
4 label="Technologies"
5 placeholder="Select technologies..."
6 options={tagOptions}
7 multi
8 values={tags}
9 onChangeMulti={setTags}
10 clearable
11 helperText={`${tags.length} selected`}
12/>

Sizes

Live preview

sm, md (default) and lg trigger heights

App.tsx
tsx
1<Select label="Small" size="sm" placeholder="Select..." options={options} value={size} onChange={setSize} />
2<Select label="Medium (default)" size="md" placeholder="Select..." options={options} value={size} onChange={setSize} />
3<Select label="Large" size="lg" placeholder="Select..." options={options} value={size} onChange={setSize} />

Props

PropTypeDefaultDescription
labelstringLabel shown above the select
placeholderstring'Select...'Placeholder when no value selected
helperTextstringHelper text shown below
optionsSelectOption[][]Flat list of options
optionGroupsSelectOptionGroup[]Grouped options — takes priority over options
valuestringControlled value (single select)
valuesstring[][]Controlled values (multi select)
onChange(value: string) => voidCallback for single select
onChangeMulti(values: string[]) => voidCallback for multi select
multibooleanfalseEnables multi-select mode
searchablebooleanfalseShows a search input inside the dropdown
clearablebooleanfalseShows a clear button when a value is selected
requiredbooleanfalseMarks the field as required
errorbooleanfalseError state
errorTextstringError message shown below
disabledbooleanfalseDisables the select
size'sm' | 'md' | 'lg''md'Trigger height
maxDisplaynumber3Max chips shown in multi mode before +N more