Select
A form select with a custom, themeable listbox - and a native escape hatch. It takes
MenuItem children as its options, supports single and multiple
selection, and integrates with Form / FormControl context exactly like NativeSelect and
TextInput.
import { Select } from '@soroush.tech/design-system/Select'
import { MenuItem } from '@soroush.tech/design-system/MenuItem'
;<Select variant="outlined" placeholder="Pick a platform" onChange={(value) => console.log(value)}>
<MenuItem value="web">Web</MenuItem>
<MenuItem value="android">Android</MenuItem>
<MenuItem value="ios">iOS</MenuItem>
</Select>
native
native={false}(default) - renders arole="combobox"trigger and a portaledrole="listbox"popover, positioned under the trigger. Fully themeable option rows, supportsmultiple.native={true}- delegates toNativeSelect(a real<select>), deriving itsoptionsfrom theMenuItemchildren'svalue+ label. Single-select only;multipleis ignored on this path.
Examples
Default
Pick a platform
<Select variant="outlined" placeholder="Pick a platform" />
Native
<Select native variant="outlined" placeholder="Pick a platform" />
Variants
outlined
default
underline
text
<Flex flexDirection="column" gap={3}>
{(['outlined', 'default', 'underline', 'text'] as const).map((variant) => (
<Select key={variant} variant={variant} placeholder={variant}>
{platformItems}
</Select>
))}
</Flex>
Sizes
sm
md
lg
<Flex gap={3} alignItems="center">
{(['sm', 'md', 'lg'] as const).map((size) => (
<Select key={size} size={size} variant="outlined" placeholder={size}>
{platformItems}
</Select>
))}
</Flex>
Error State
Pick a platform
<Select variant="outlined" error placeholder="Pick a platform" />
With Dividers
Pick a platform
<Select variant="outlined" placeholder="Pick a platform" />
Controlled
Selected: web
Web
<ControlledSelect />
Multiple
Selected: web, ios
Web, iOS
<MultiSelect />