Skip to canvas
Proton Design System
/
Introduction
Changelog
Colors
Icons
Layers Management
Responsive
Sass Css Variables
Typography
Alert
Autocomplete
Badge
ButtonGroup
Checkbox
Collapsible
Copy
CountrySelect
DateInput
Details
Dropdown
Dropzone
EllipsisLoader
Errors
Icon
InputButton
InputField
InputFieldStacked
LabelStack
Logo
Meter
MiddleEllipsis
Modal
Notification
Price
Progress
Promotion Button
QuickSettings
Radio
Scale
Select
Spotlight
Table
Tabs
Toggle
TopBanner
TotpInput
VideoInstructions
Avatar
Banner
Button
Card
CircleLoader
DashboardCard
Donut
Href
InlineLinkButton
Input
Kbd
NotificationDot
Pill
ProtonLoader
Scroll
Slider
Stepper
UserAvatar
VerticalSteps
Vr
Border
Border Radius
Colors
Columns
Cursor
Divide
ExpandClickArea
Gap
HidingDisablingContent
InteractiveFocusHelper
Lists
Margin
Opacity
OpacityOnHover
Padding
Position
Print
Ratio Container
Responsive
Scroll
Shadow
Sizing
Transforms
Typography
  1. Recently opened
  2. Back to componentsESC
  3. Clear history
Skip to sidebar
1import { useMemo, useRef, useState } from 'react'; 2 3import { Icon, InputFieldTwo, LabelStack, Option, SearchableSelect, SelectTwo } from '@proton/components'; 4 5import { getTitle } from '../../helpers/title'; 6import mdx from './Select.mdx'; 7 8export default { 9 title: getTitle(__filename, false), 10 component: SelectTwo, 11 parameters: { 12 docs: { 13 page: mdx, 14 }, 15 }, 16}; 17
18export const Playground = ({ ...args }) => { 19 const [value, setValue] = useState('ant'); 20 21 return ( 22 <SelectTwo {...args} value={value} onChange={({ value: v }) => setValue(v)}> 23 <Option title="Ant" value="ant" /> 24 <Option title="Zebra" value="zebra" /> 25 </SelectTwo> 26 ); 27};
28Playground.args = {}; 29 30export const Basic = () => { 31 const [value, setValue] = useState('ant'); 32 33 return ( 34 <SelectTwo value={value} onValue={setValue}> 35 <Option title="Ant" value="ant" /> 36 <Option title="Zebra" value="zebra" /> 37 </SelectTwo> 38 ); 39}; 40 41export const Multiple = () => { 42 const options = useMemo(() => [{ label: 'ant' }, { label: 'zebra' }], []); 43 const [value, setValue] = useState([options[0]]); 44 45 return ( 46 <SelectTwo value={value} onValue={setValue} multiple> 47 {options.map((option) => ( 48 <Option title={option.label} value={option} key={option.label} /> 49 ))} 50 </SelectTwo> 51 ); 52}; 53 54export const Search = () => { 55 const options = ['France', 'Switzerland', 'Taïwan', 'USA', 'UK']; 56 const [value, setValue] = useState('France'); 57 58 return ( 59 <SearchableSelect 60 title={'Choose your country'} 61 value={value} 62 onChange={(e) => setValue(e.value)} 63 search 64 searchPlaceholder={'Search for country'} 65 > 66 {options.map((option) => ( 67 <Option key={option} value={option} title={option} /> 68 ))} 69 </SearchableSelect> 70 ); 71}; 72 73export const MultiSearch = () => { 74 const options = ['France', 'Switzerland', 'Taïwan', 'USA', 'UK']; 75 const [value, setValue] = useState([]); 76 77 return ( 78 <SearchableSelect 79 multiple 80 value={value} 81 onChange={(e) => setValue(e.value)} 82 search 83 searchPlaceholder={'Search for country'} 84 placeholder={'Choose your country'} 85 > 86 {options.map((option) => ( 87 <Option key={option} value={option} title={option} /> 88 ))} 89 </SearchableSelect> 90 ); 91}; 92 93const options = [ 94 { color: '#8080FF', name: 'electron' }, 95 { color: '#EC3E7C', name: 'muon' }, 96 { color: '#DB60D6', name: 'tau' }, 97 { color: '#415DF0', name: 'neutrino' }, 98 { color: '#179FD9', name: 'z boson' }, 99 { color: '#1DA583', name: 'w boson' }, 100 { color: '#3CBB3A', name: 'quark' }, 101 { color: '#B4A40E', name: 'higgs' }, 102 { color: '#936D58', name: 'photon' }, 103 { color: '#F78400', name: 'gluon' }, 104]; 105 106export const RenderSelected = () => { 107 const [value, setValue] = useState<typeof options>(options.slice(0, 4)); 108 109 return ( 110 <SelectTwo 111 multiple 112 value={value} 113 placeholder={'Choose your country'} 114 onValue={setValue} 115 renderSelected={(selected) => <LabelStack labels={selected ?? []} />} 116 > 117 {options.map((option) => ( 118 <Option key={option.name} value={option} title={option.name} /> 119 ))} 120 </SelectTwo> 121 ); 122}; 123 124export const ControlledOpenState = () => { 125 const [value, setValue] = useState(''); 126 127 const [open, setOpen] = useState(false); 128 129 function handleOpen() { 130 setOpen(true); 131 } 132 133 function handleClose() { 134 setOpen(false); 135 } 136 137 return ( 138 <SelectTwo 139 isOpen={open} 140 value={value} 141 onChange={({ value: v }) => setValue(v)} 142 onOpen={handleOpen} 143 onClose={handleClose} 144 > 145 <Option title="Ant" value="ant" /> 146 <Option title="Zebra" value="zebra" /> 147 </SelectTwo> 148 ); 149}; 150 151export const WithRichOptionContent = () => { 152 const [value, setValue] = useState('android'); 153 154 return ( 155 <SelectTwo value={value} onChange={({ value: v }) => setValue(v)}> 156 <Option title="android" value="android"> 157 <Icon name="brand-android" /> android 158 </Option> 159 <Option title="apple" value="apple"> 160 <Icon name="brand-apple" /> apple 161 </Option> 162 <Option title="linux" value="linux"> 163 <Icon name="brand-linux" /> linux 164 </Option> 165 <Option title="chrome" value="chrome"> 166 <Icon name="brand-chrome" /> chrome 167 </Option> 168 </SelectTwo> 169 ); 170}; 171 172export const WithCustomSearchClearTimer = () => { 173 const [value, setValue] = useState('ant'); 174 175 return ( 176 <SelectTwo value={value} onChange={({ value: v }) => setValue(v)} clearSearchAfter={1000}> 177 <Option title="Ant" value="ant" /> 178 <Option title="Bear" value="bear" /> 179 <Option title="Chimpanzee" value="chimpanzee" /> 180 <Option title="Deer" value="deer" /> 181 <Option title="Zebra" value="zebra" /> 182 </SelectTwo> 183 ); 184}; 185 186export const WithComplexValues = () => { 187 /* 188 * The useRef is used here in order to preserve identity of the value to its 189 * option between render cycles since the Select uses identity comparison to 190 * determine which option is selected. 191 */ 192 const { current: options } = useRef([{ name: 'ant' }, { name: 'bear' }, { name: 'chimpanzee' }]); 193 194 const [value, setValue] = useState<{ name: string } | null>(options[0]); 195 196 return ( 197 <SelectTwo value={value} onChange={({ value: v }) => setValue(v)}> 198 {options.map((option) => ( 199 <Option title={option.name} value={option} key={option.name} /> 200 ))} 201 </SelectTwo> 202 ); 203}; 204 205export const AsInputField = () => { 206 return ( 207 <InputFieldTwo as={SelectTwo} label="Select" placeholder="Placeholder"> 208 <Option title="one" value="one" /> 209 <Option title="two" value="two" /> 210 <Option title="three" value="three" /> 211 </InputFieldTwo> 212 ); 213};