@app-studio/components
Select
A customizable UI component for selecting from a list of options.
View component sourceImport
ts
import { Select } from '@app-studio/components';New to the library? Complete installation and provider setup first.
Interactive examples
Try the component, then open Code to copy the complete example.
import React, { useState } from 'react';
import { Horizontal } from 'app-studio';
import { Button } from '@app-studio/components';
import { Select } from '@app-studio/components';
const options = [
{ label: 'Item1', value: '1' },
{ label: 'Item2', value: '2' },
{ label: 'Item3', value: '3' },
];
export const ControlledSelect = () => {
const [value, setValue] = useState('2');
return (
<Horizontal gap={12} alignItems="center">
<Select
options={options}
label="Select an item"
value={value}
// `onChange` hands back the next selection — a string here, and the
// whole array when `isMulti`. Never a DOM event, so there is no
// `e.target.value` to read.
onChange={(next: string) => setValue(next)}
/>
{/* The selection follows the state, whoever moved it. */}
<Button onClick={() => setValue('3')}>Jump to Item3</Button>
</Horizontal>
);
};Props
Required props are marked below. A dash indicates an unspecified default. Design system configuration can override implementation defaults.
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
id | string | — | See the type and source declaration for this property.Source |
error | boolean | false | Error state — usually a string for the error message, or a boolean toggle.Source |
name | string | — | Field name used by forms and Formik bindings.Source |
label | string | — | Visible label rendered alongside the input. Form-library wrappers (Switch, TextField, Checkbox, …) consume this. Not a native HTML attribute on <input>, but conventionally part of the form-control prop surface.Source |
helperText | string | — | Helper text rendered below the input (hint / error / explanation).Source |
placeholder | string | — | Hint displayed while the field is empty.Source |
options Required | Option[] | [] | Available choices and their values.Source |
value | string | string[] | — | Current controlled value. Update it from the matching change callback.Source |
defaultValue | string | string[] | — | Initial value for uncontrolled usage.Source |
isMulti | boolean | false | See the type and source declaration for this property.Source |
isReadOnly | boolean | false | Keeps the value visible without allowing edits.Source |
isDisabled | boolean | false | Disables user interaction.Source |
isRequired | boolean | false | Marks this field as required.Source |
isAutoFocus | boolean | false | See the type and source declaration for this property.Source |
onChange | ((value: string | string[]) => void) | — | Called with the next selection whenever it changes: the chosen option's value for a single select, the full array of selected values when `isMulti`. It has to be the *next* selection rather than the option that was just touched, otherwise a controlled parent has nothing to store. It is always the **value**, never the DOM event — `e.target.value` is a compile error. The parameter is typed rather than left `any` so a DOM-shaped handler fails to build instead of failing silently at runtime. Declared with method syntax on purpose. Method parameters are compared bivariantly, so a single-select caller can still pass a plain `(value: string) => void` (arrays only ever occur when `isMulti`) while a `(e: ChangeEvent) => void` stays rejected — an event is unrelated to `string | string[]` in both directions. Writing this as a property would force every single-select consumer to narrow a union that their Select can never produce.Source |
shape | Shape"square""rounded""pill""default" | 'default' | Shape preset for the component.Source |
variant | Variant"outline""default""none" | 'default' | Visual treatment of the component.Source |
views | SelectStyles | {
text: {},
icon: {},
dropDown: {},
selectBox: {},
label: {},
helperText: {},
} | Style overrides for the named internal parts.Source |
size | Size"sm""md""lg""xs""xl" | 'md' | Size preset for the component.Source |
shadow | ViewProps | Shadow | Elevation | {} | Shadow or elevation styling.Source |
isScrollable | boolean | — | See the type and source declaration for this property.Source |
Common inherited styling props (7)
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
onClick | any | — | Called when the user activates the component. |
media | Record<string, CssProps> | — | See the type and source declaration for this property. |
as | keyof JSX.IntrinsicElements"symbol""object""slot""style""title""pattern""form""animate""clipPath""filter""marker""mask""a""abbr""address""area""article""aside""audio""b""base""bdi""bdo""big""blockquote""body""br""button""canvas""caption""center""cite""code""col""colgroup""data""datalist""dd""del""details""dfn""dialog""div""dl""dt""em""embed""fieldset""figcaption""figure""footer""h1""h2""h3""h4""h5""h6""head""header""hgroup""hr""html""i""iframe""img""input""ins""kbd""keygen""label""legend""li""link""main""map""mark""menu""menuitem""meta""meter""nav""noindex""noscript""ol""optgroup""option""output""p""param""picture""pre""progress""q""rp""rt""ruby""s""samp""search""script""section""select""small""source""span""strong""sub""summary""sup""table""template""tbody""td""textarea""tfoot""th""thead""time""tr""track""u""ul""var""video""wbr""webview""svg""animateMotion""animateTransform""circle""defs""desc""ellipse""feBlend""feColorMatrix""feComponentTransfer""feComposite""feConvolveMatrix""feDiffuseLighting""feDisplacementMap""feDistantLight""feDropShadow""feFlood""feFuncA""feFuncB""feFuncG""feFuncR""feGaussianBlur""feImage""feMerge""feMergeNode""feMorphology""feOffset""fePointLight""feSpecularLighting""feSpotLight""feTile""feTurbulence""foreignObject""g""image""line""linearGradient""metadata""mpath""path""polygon""polyline""radialGradient""rect""set""stop""switch""text""textPath""tspan""use""view" | — | See the type and source declaration for this property. |
themeMode | "light" | "dark""light""dark" | — | See the type and source declaration for this property. |
_hover | string | CssProps | — | See the type and source declaration for this property. |
_active | string | CssProps | — | See the type and source declaration for this property. |
_focus | string | CssProps | — | See the type and source declaration for this property. |
For shared layout, color, and responsive properties, read Styling & composition and Responsive layouts. Additional native element attributes depend on the target platform.
Usage guidance
- Give controls a visible label or an accessible name, and verify keyboard interaction. See Accessibility.
- For controlled inputs, update the value from the callback shown in the props table. Keep application state in your component or form library.
- These previews run in the browser. Check React Native setup for platform requirements and differences.