@vibe/core 4.2.5 → 4.3.0-alpha-9bd83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/metadata/accessibility/Accordion.md +10 -0
- package/dist/metadata/accessibility/AlertBanner.md +9 -0
- package/dist/metadata/accessibility/Avatar.md +12 -0
- package/dist/metadata/accessibility/AvatarGroup.md +6 -0
- package/dist/metadata/accessibility/BreadcrumbsBar.md +10 -0
- package/dist/metadata/accessibility/Button.md +13 -0
- package/dist/metadata/accessibility/ButtonGroup.md +9 -0
- package/dist/metadata/accessibility/Checkbox.md +13 -0
- package/dist/metadata/accessibility/Chips.md +10 -0
- package/dist/metadata/accessibility/Combobox.md +6 -0
- package/dist/metadata/accessibility/DropdownBasicDropdown.md +10 -0
- package/dist/metadata/accessibility/IconButton.md +26 -0
- package/dist/metadata/accessibility/Info.md +12 -0
- package/dist/metadata/accessibility/Link.md +8 -0
- package/dist/metadata/accessibility/List.md +11 -0
- package/dist/metadata/accessibility/Menu.md +10 -0
- package/dist/metadata/accessibility/MenuButton.md +6 -0
- package/dist/metadata/accessibility/MenuItem.md +8 -0
- package/dist/metadata/accessibility/Modal.md +35 -0
- package/dist/metadata/accessibility/NumberField.md +9 -0
- package/dist/metadata/accessibility/RadioButton.md +11 -0
- package/dist/metadata/accessibility/Search.md +10 -0
- package/dist/metadata/accessibility/Tabs.md +10 -0
- package/dist/metadata/accessibility/TextArea.md +17 -0
- package/dist/metadata/accessibility/TextField.md +16 -0
- package/dist/metadata/accessibility/Toast.md +4 -0
- package/dist/metadata/accessibility/Toggle.md +7 -0
- package/dist/metadata/accessibility/Tooltip.md +11 -0
- package/dist/metadata/components.json +20940 -0
- package/dist/metadata/examples/Accordion.md +136 -0
- package/dist/metadata/examples/AlertBanner.md +85 -0
- package/dist/metadata/examples/AttentionBox.md +267 -0
- package/dist/metadata/examples/Avatar.md +118 -0
- package/dist/metadata/examples/AvatarGroup.md +390 -0
- package/dist/metadata/examples/Badge.md +59 -0
- package/dist/metadata/examples/BaseInput.md +2 -0
- package/dist/metadata/examples/BaseList.md +342 -0
- package/dist/metadata/examples/Box.md +208 -0
- package/dist/metadata/examples/BreadcrumbItem.md +54 -0
- package/dist/metadata/examples/BreadcrumbsBar.md +64 -0
- package/dist/metadata/examples/Button.md +174 -0
- package/dist/metadata/examples/ButtonGroup.md +180 -0
- package/dist/metadata/examples/Checkbox.md +24 -0
- package/dist/metadata/examples/Chips.md +192 -0
- package/dist/metadata/examples/Clickable.md +31 -0
- package/dist/metadata/examples/ColorPicker.md +2 -0
- package/dist/metadata/examples/Combobox.md +438 -0
- package/dist/metadata/examples/Counter.md +188 -0
- package/dist/metadata/examples/DatePicker.md +43 -0
- package/dist/metadata/examples/Dialog.md +521 -0
- package/dist/metadata/examples/DialogContentContainer.md +18 -0
- package/dist/metadata/examples/Divider.md +50 -0
- package/dist/metadata/examples/DropdownBasicDropdown.md +479 -0
- package/dist/metadata/examples/DropdownBoxMode.md +218 -0
- package/dist/metadata/examples/EditableHeading.md +33 -0
- package/dist/metadata/examples/EditableText.md +36 -0
- package/dist/metadata/examples/EmptyState.md +192 -0
- package/dist/metadata/examples/ExpandCollapse.md +77 -0
- package/dist/metadata/examples/Flex.md +916 -0
- package/dist/metadata/examples/Heading.md +124 -0
- package/dist/metadata/examples/HiddenText.md +8 -0
- package/dist/metadata/examples/Icon.md +67 -0
- package/dist/metadata/examples/IconButton.md +141 -0
- package/dist/metadata/examples/Info.md +80 -0
- package/dist/metadata/examples/Label.md +109 -0
- package/dist/metadata/examples/Link.md +52 -0
- package/dist/metadata/examples/List.md +125 -0
- package/dist/metadata/examples/ListItem.md +42 -0
- package/dist/metadata/examples/Loader.md +148 -0
- package/dist/metadata/examples/Menu.md +141 -0
- package/dist/metadata/examples/MenuButton.md +127 -0
- package/dist/metadata/examples/MenuDivider.md +35 -0
- package/dist/metadata/examples/MenuGridItem.md +65 -0
- package/dist/metadata/examples/MenuItem.md +98 -0
- package/dist/metadata/examples/MenuItemButton.md +42 -0
- package/dist/metadata/examples/MenuTitle.md +25 -0
- package/dist/metadata/examples/ModalBasicLayout.md +400 -0
- package/dist/metadata/examples/ModalMediaLayout.md +240 -0
- package/dist/metadata/examples/ModalSideBySideLayout.md +313 -0
- package/dist/metadata/examples/MultiStepIndicator.md +189 -0
- package/dist/metadata/examples/NumberField.md +68 -0
- package/dist/metadata/examples/ProgressBar.md +152 -0
- package/dist/metadata/examples/RadioButton.md +41 -0
- package/dist/metadata/examples/Search.md +24 -0
- package/dist/metadata/examples/Skeleton.md +161 -0
- package/dist/metadata/examples/Slider.md +109 -0
- package/dist/metadata/examples/SplitButton.md +120 -0
- package/dist/metadata/examples/Steps.md +106 -0
- package/dist/metadata/examples/Table.md +449 -0
- package/dist/metadata/examples/Tabs.md +241 -0
- package/dist/metadata/examples/Text.md +188 -0
- package/dist/metadata/examples/TextArea.md +28 -0
- package/dist/metadata/examples/TextField.md +119 -0
- package/dist/metadata/examples/TextWithHighlight.md +2 -0
- package/dist/metadata/examples/ThemeProvider.md +47 -0
- package/dist/metadata/examples/Tipseen.md +111 -0
- package/dist/metadata/examples/Toast.md +127 -0
- package/dist/metadata/examples/Toggle.md +38 -0
- package/dist/metadata/examples/Tooltip.md +53 -0
- package/dist/metadata/examples/VirtualizedGrid.md +54 -0
- package/dist/metadata/examples/VirtualizedList.md +50 -0
- package/dist/metadata/examples/useGridKeyboardNavigationContext.md +61 -0
- package/dist/mocked_classnames/scripts/build-all-metadata.d.ts +1 -0
- package/dist/mocked_classnames/scripts/extract-accessibility.d.ts +4 -0
- package/dist/mocked_classnames/scripts/extract-examples.d.ts +3 -0
- package/dist/scripts/build-all-metadata.d.ts +1 -0
- package/dist/scripts/extract-accessibility.d.ts +4 -0
- package/dist/scripts/extract-examples.d.ts +3 -0
- package/package.json +12 -10
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
# Storybook Code Examples
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
const dropdownTemplate = (props: BaseDropdownProps<any>) => {
|
|
7
|
+
const options = useMemo(() => [{
|
|
8
|
+
value: 1,
|
|
9
|
+
label: "Option 1"
|
|
10
|
+
}, {
|
|
11
|
+
value: 2,
|
|
12
|
+
label: "Option 2"
|
|
13
|
+
}, {
|
|
14
|
+
value: 3,
|
|
15
|
+
label: "Option 3"
|
|
16
|
+
}], []);
|
|
17
|
+
return <div style={{
|
|
18
|
+
height: "150px",
|
|
19
|
+
width: "300px"
|
|
20
|
+
}}>
|
|
21
|
+
<Dropdown options={options} label="Label" helperText="Helper text" {...props} />
|
|
22
|
+
</div>;
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Sizes
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
const options = useMemo(() => [{
|
|
30
|
+
value: 1,
|
|
31
|
+
label: "Option 1"
|
|
32
|
+
}, {
|
|
33
|
+
value: 2,
|
|
34
|
+
label: "Option 2"
|
|
35
|
+
}, {
|
|
36
|
+
value: 3,
|
|
37
|
+
label: "Option 3"
|
|
38
|
+
}], []);
|
|
39
|
+
return <Flex gap="medium">
|
|
40
|
+
<div style={{
|
|
41
|
+
width: "300px"
|
|
42
|
+
}}>
|
|
43
|
+
<Dropdown id="sizes-large" aria-label="Large dropdown" options={options} placeholder="Placeholder text here" label="Label" size="large" clearAriaLabel="Clear" />
|
|
44
|
+
</div>
|
|
45
|
+
<div style={{
|
|
46
|
+
width: "300px"
|
|
47
|
+
}}>
|
|
48
|
+
<Dropdown id="sizes-medium" aria-label="Medium dropdown" options={options} placeholder="Placeholder text here" label="Label" size="medium" clearAriaLabel="Clear" />
|
|
49
|
+
</div>
|
|
50
|
+
<div style={{
|
|
51
|
+
width: "300px"
|
|
52
|
+
}}>
|
|
53
|
+
<Dropdown id="sizes-small" aria-label="Small dropdown" options={options} placeholder="Placeholder text here" label="Label" size="small" clearAriaLabel="Clear" />
|
|
54
|
+
</div>
|
|
55
|
+
</Flex>;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## States
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
<Flex direction="row" gap="medium">
|
|
62
|
+
<Flex direction="column" gap="medium">
|
|
63
|
+
<div style={{
|
|
64
|
+
width: "300px"
|
|
65
|
+
}}>
|
|
66
|
+
<Dropdown id="states-default" aria-label="Default dropdown" options={[]} placeholder="Default" clearAriaLabel="Clear" />
|
|
67
|
+
</div>
|
|
68
|
+
<div style={{
|
|
69
|
+
width: "300px"
|
|
70
|
+
}}>
|
|
71
|
+
<Dropdown id="states-disabled" aria-label="Disabled dropdown" options={[]} placeholder="Disabled" disabled clearAriaLabel="Clear" />
|
|
72
|
+
</div>
|
|
73
|
+
</Flex>
|
|
74
|
+
<Flex direction="column" gap="medium">
|
|
75
|
+
<div style={{
|
|
76
|
+
width: "300px"
|
|
77
|
+
}}>
|
|
78
|
+
<Dropdown id="states-error" aria-label="Error dropdown" options={[]} placeholder="Error" error clearAriaLabel="Clear" />
|
|
79
|
+
</div>
|
|
80
|
+
<div style={{
|
|
81
|
+
width: "300px"
|
|
82
|
+
}}>
|
|
83
|
+
<Dropdown id="states-readonly" aria-label="Readonly dropdown" options={[]} placeholder="Readonly" readOnly clearAriaLabel="Clear" />
|
|
84
|
+
</div>
|
|
85
|
+
</Flex>
|
|
86
|
+
</Flex>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## MultiSelect
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
const options = useMemo(() => [{
|
|
93
|
+
value: "1",
|
|
94
|
+
label: "Chip one"
|
|
95
|
+
}, {
|
|
96
|
+
value: "2",
|
|
97
|
+
label: "Chip two"
|
|
98
|
+
}, {
|
|
99
|
+
value: "3",
|
|
100
|
+
label: "Chip three"
|
|
101
|
+
}, {
|
|
102
|
+
value: "4",
|
|
103
|
+
label: "Chip four"
|
|
104
|
+
}], []);
|
|
105
|
+
return <Flex gap="large" align="start" justify="start">
|
|
106
|
+
<Flex direction="column" gap="medium">
|
|
107
|
+
<Text>Single line with hidden options</Text>
|
|
108
|
+
<div style={{
|
|
109
|
+
width: "350px",
|
|
110
|
+
marginBottom: "50px"
|
|
111
|
+
}}>
|
|
112
|
+
<Dropdown placeholder="Single line multi state" defaultValue={[options[0], options[1], options[2]]} options={options} multi clearAriaLabel="Clear" />
|
|
113
|
+
</div>
|
|
114
|
+
</Flex>
|
|
115
|
+
<Flex direction="column" gap="medium">
|
|
116
|
+
<Text>Multiple lines</Text>
|
|
117
|
+
<div style={{
|
|
118
|
+
width: "350px",
|
|
119
|
+
marginBottom: "50px"
|
|
120
|
+
}}>
|
|
121
|
+
<Dropdown placeholder="Multiple line multi state" defaultValue={[options[0], options[1], options[2]]} options={options} multi multiline clearAriaLabel="Clear" />
|
|
122
|
+
</div>
|
|
123
|
+
</Flex>
|
|
124
|
+
</Flex>;
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## DropdownWithIconOrAvatar
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
const optionsIcons: any = useMemo(() => [{
|
|
131
|
+
value: "email",
|
|
132
|
+
label: "Email",
|
|
133
|
+
startElement: {
|
|
134
|
+
type: "icon",
|
|
135
|
+
value: Email
|
|
136
|
+
}
|
|
137
|
+
}, {
|
|
138
|
+
value: "attach",
|
|
139
|
+
label: "Attach",
|
|
140
|
+
startElement: {
|
|
141
|
+
type: "icon",
|
|
142
|
+
value: Attach
|
|
143
|
+
}
|
|
144
|
+
}], []);
|
|
145
|
+
const optionsAvatar: any = useMemo(() => [{
|
|
146
|
+
value: "Julia",
|
|
147
|
+
label: "Julia Martinez",
|
|
148
|
+
startElement: {
|
|
149
|
+
type: "avatar",
|
|
150
|
+
value: person1
|
|
151
|
+
}
|
|
152
|
+
}, {
|
|
153
|
+
value: "Sophia",
|
|
154
|
+
label: "Sophia Johnson",
|
|
155
|
+
startElement: {
|
|
156
|
+
type: "avatar",
|
|
157
|
+
value: person2
|
|
158
|
+
}
|
|
159
|
+
}, {
|
|
160
|
+
value: "Marco",
|
|
161
|
+
label: "Marco DiAngelo",
|
|
162
|
+
startElement: {
|
|
163
|
+
type: "avatar",
|
|
164
|
+
value: person3
|
|
165
|
+
}
|
|
166
|
+
}], []);
|
|
167
|
+
return <Flex gap="large" align="start" justify="start">
|
|
168
|
+
<Flex direction="column" gap="medium">
|
|
169
|
+
<Text>Single value</Text>
|
|
170
|
+
<div style={{
|
|
171
|
+
width: "350px",
|
|
172
|
+
marginBottom: "10px"
|
|
173
|
+
}}>
|
|
174
|
+
<Dropdown defaultValue={optionsIcons[0]} options={optionsIcons} clearAriaLabel="Clear" />
|
|
175
|
+
</div>
|
|
176
|
+
<div style={{
|
|
177
|
+
width: "350px",
|
|
178
|
+
marginBottom: "10px"
|
|
179
|
+
}}>
|
|
180
|
+
<Dropdown defaultValue={optionsAvatar[0]} options={optionsAvatar} clearAriaLabel="Clear" />
|
|
181
|
+
</div>
|
|
182
|
+
</Flex>
|
|
183
|
+
<Flex direction="column" gap="medium">
|
|
184
|
+
<Text>Multiple values</Text>
|
|
185
|
+
<div style={{
|
|
186
|
+
width: "350px",
|
|
187
|
+
marginBottom: "10px"
|
|
188
|
+
}}>
|
|
189
|
+
<Dropdown defaultValue={[optionsIcons[0]]} options={optionsIcons} multi clearAriaLabel="Clear" />
|
|
190
|
+
</div>
|
|
191
|
+
<div style={{
|
|
192
|
+
width: "350px",
|
|
193
|
+
marginBottom: "10px"
|
|
194
|
+
}}>
|
|
195
|
+
<Dropdown defaultValue={[optionsAvatar[0]]} options={optionsAvatar} multi clearAriaLabel="Clear" />
|
|
196
|
+
</div>
|
|
197
|
+
</Flex>
|
|
198
|
+
</Flex>;
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Searchable
|
|
202
|
+
|
|
203
|
+
```tsx
|
|
204
|
+
const options = useMemo(() => [{
|
|
205
|
+
value: "Item 1",
|
|
206
|
+
label: "Item 1"
|
|
207
|
+
}, {
|
|
208
|
+
value: "Item 2",
|
|
209
|
+
label: "Item 2"
|
|
210
|
+
}, {
|
|
211
|
+
value: "Item 3",
|
|
212
|
+
label: "Item 3"
|
|
213
|
+
}], []);
|
|
214
|
+
return <div style={{
|
|
215
|
+
width: "300px"
|
|
216
|
+
}}>
|
|
217
|
+
<Dropdown placeholder={"Search an item"} options={options} searchable maxMenuHeight={170} clearAriaLabel="Clear" />
|
|
218
|
+
</div>;
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## DropdownWithGroups
|
|
222
|
+
|
|
223
|
+
```tsx
|
|
224
|
+
const options = useMemo(() => [{
|
|
225
|
+
label: "Category 1",
|
|
226
|
+
options: [{
|
|
227
|
+
value: "1",
|
|
228
|
+
label: "Item 1"
|
|
229
|
+
}, {
|
|
230
|
+
value: "2",
|
|
231
|
+
label: "Item 2"
|
|
232
|
+
}, {
|
|
233
|
+
value: "3",
|
|
234
|
+
label: "Item 3"
|
|
235
|
+
}]
|
|
236
|
+
}, {
|
|
237
|
+
label: "Category 2",
|
|
238
|
+
options: [{
|
|
239
|
+
value: "4",
|
|
240
|
+
label: "Item 1"
|
|
241
|
+
}, {
|
|
242
|
+
value: "5",
|
|
243
|
+
label: "Item 2"
|
|
244
|
+
}, {
|
|
245
|
+
value: "6",
|
|
246
|
+
label: "Item 3"
|
|
247
|
+
}]
|
|
248
|
+
}], []);
|
|
249
|
+
const optionsWithoutGroupLabel = useMemo(() => [{
|
|
250
|
+
options: [{
|
|
251
|
+
value: "1",
|
|
252
|
+
label: "Item 1"
|
|
253
|
+
}, {
|
|
254
|
+
value: "2",
|
|
255
|
+
label: "Item 2"
|
|
256
|
+
}, {
|
|
257
|
+
value: "3",
|
|
258
|
+
label: "Item 3"
|
|
259
|
+
}]
|
|
260
|
+
}, {
|
|
261
|
+
options: [{
|
|
262
|
+
value: "4",
|
|
263
|
+
label: "Item 1"
|
|
264
|
+
}, {
|
|
265
|
+
value: "5",
|
|
266
|
+
label: "Item 2"
|
|
267
|
+
}]
|
|
268
|
+
}], []);
|
|
269
|
+
return <Flex gap="medium" align="start" justify="start">
|
|
270
|
+
<Flex direction="column" gap="medium">
|
|
271
|
+
<Text>Group by divider</Text>
|
|
272
|
+
<div style={{
|
|
273
|
+
width: "300px"
|
|
274
|
+
}}>
|
|
275
|
+
<Dropdown placeholder="Group by divider" options={optionsWithoutGroupLabel} withGroupDivider maxMenuHeight={170} clearAriaLabel="Clear" />
|
|
276
|
+
</div>
|
|
277
|
+
</Flex>
|
|
278
|
+
<Flex direction="column" gap="medium">
|
|
279
|
+
<Text>Group by category</Text>
|
|
280
|
+
<div style={{
|
|
281
|
+
width: "300px"
|
|
282
|
+
}}>
|
|
283
|
+
<Dropdown placeholder="Group by category" options={options} maxMenuHeight={170} clearAriaLabel="Clear" />
|
|
284
|
+
</div>
|
|
285
|
+
</Flex>
|
|
286
|
+
<Flex direction="column" gap="medium">
|
|
287
|
+
<Text>Group by category title sticky</Text>
|
|
288
|
+
<div style={{
|
|
289
|
+
width: "300px"
|
|
290
|
+
}}>
|
|
291
|
+
<Dropdown placeholder="Group by category title sticky" options={options} stickyGroupTitle maxMenuHeight={170} clearAriaLabel="Clear" />
|
|
292
|
+
</div>
|
|
293
|
+
</Flex>
|
|
294
|
+
</Flex>;
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## DropdownItemWithElements
|
|
298
|
+
|
|
299
|
+
```tsx
|
|
300
|
+
const startOptions: DropdownOption<Record<string, unknown>>[] = useMemo(() => [{
|
|
301
|
+
value: "icon",
|
|
302
|
+
label: "Item with icon",
|
|
303
|
+
startElement: {
|
|
304
|
+
type: "icon",
|
|
305
|
+
value: Email
|
|
306
|
+
}
|
|
307
|
+
}, {
|
|
308
|
+
value: "avatar",
|
|
309
|
+
label: "Item with avatar",
|
|
310
|
+
startElement: {
|
|
311
|
+
type: "avatar",
|
|
312
|
+
value: person1
|
|
313
|
+
}
|
|
314
|
+
}, {
|
|
315
|
+
value: "indent",
|
|
316
|
+
label: "Item with insert",
|
|
317
|
+
startElement: {
|
|
318
|
+
type: "indent"
|
|
319
|
+
}
|
|
320
|
+
}], []);
|
|
321
|
+
const endOptions: DropdownOption<Record<string, unknown>>[] = useMemo(() => [{
|
|
322
|
+
value: "endIcon",
|
|
323
|
+
label: "Item with icon",
|
|
324
|
+
endElement: {
|
|
325
|
+
type: "icon",
|
|
326
|
+
value: Email
|
|
327
|
+
}
|
|
328
|
+
}, {
|
|
329
|
+
value: "hintText",
|
|
330
|
+
label: "Item with hint text",
|
|
331
|
+
endElement: {
|
|
332
|
+
type: "suffix",
|
|
333
|
+
value: "⌘C"
|
|
334
|
+
}
|
|
335
|
+
}], []);
|
|
336
|
+
return <Flex gap="large">
|
|
337
|
+
<div style={{
|
|
338
|
+
width: "300px"
|
|
339
|
+
}}>
|
|
340
|
+
<Dropdown placeholder={"Start element"} options={startOptions} label="Start element" required clearAriaLabel="Clear" />
|
|
341
|
+
</div>
|
|
342
|
+
<div style={{
|
|
343
|
+
width: "300px"
|
|
344
|
+
}}>
|
|
345
|
+
<Dropdown placeholder={"End element"} options={endOptions} label="End element" required clearAriaLabel="Clear" />
|
|
346
|
+
</div>
|
|
347
|
+
</Flex>;
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## DropdownHideSelectedItems
|
|
351
|
+
|
|
352
|
+
```tsx
|
|
353
|
+
const options = useMemo(() => [{
|
|
354
|
+
value: "Option 1",
|
|
355
|
+
label: "Label"
|
|
356
|
+
}, {
|
|
357
|
+
value: "Option 2",
|
|
358
|
+
label: "Label"
|
|
359
|
+
}, {
|
|
360
|
+
value: "Option 3",
|
|
361
|
+
label: "Label"
|
|
362
|
+
}, {
|
|
363
|
+
value: "Option 4",
|
|
364
|
+
label: "Label"
|
|
365
|
+
}, {
|
|
366
|
+
value: "Option 5",
|
|
367
|
+
label: "Label"
|
|
368
|
+
}, {
|
|
369
|
+
value: "Option 6",
|
|
370
|
+
label: "Label"
|
|
371
|
+
}], []);
|
|
372
|
+
return <div style={{
|
|
373
|
+
width: "300px"
|
|
374
|
+
}}>
|
|
375
|
+
<Dropdown placeholder={"Placeholder text here"} options={options} defaultValue={[options[0], options[2], options[3]]} label="Label" required multi showSelectedOptions={false} clearAriaLabel="Clear" />
|
|
376
|
+
</div>;
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## DropdownWithTooltips
|
|
380
|
+
|
|
381
|
+
```tsx
|
|
382
|
+
const optionsWithTooltips = useMemo(() => [{
|
|
383
|
+
value: "Option 1",
|
|
384
|
+
label: "Tooltip",
|
|
385
|
+
tooltipProps: {
|
|
386
|
+
content: "This is a title message for further information will appear here."
|
|
387
|
+
}
|
|
388
|
+
}, {
|
|
389
|
+
value: "Option 2",
|
|
390
|
+
label: "Chip",
|
|
391
|
+
tooltipProps: {
|
|
392
|
+
content: "This is a title message for further information will appear here."
|
|
393
|
+
}
|
|
394
|
+
}, {
|
|
395
|
+
value: "Option 3",
|
|
396
|
+
label: "Button"
|
|
397
|
+
}], []);
|
|
398
|
+
return <div style={{
|
|
399
|
+
width: "300px"
|
|
400
|
+
}}>
|
|
401
|
+
<Dropdown placeholder={"Placeholder text here"} options={optionsWithTooltips} clearAriaLabel="Clear" />
|
|
402
|
+
</div>;
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
## Virtualized Dropdown
|
|
406
|
+
|
|
407
|
+
```tsx
|
|
408
|
+
const options = useMemo(() => [{
|
|
409
|
+
options: Array.from({
|
|
410
|
+
length: 1000
|
|
411
|
+
}, (_, index) => ({
|
|
412
|
+
value: `option-${index + 1}`,
|
|
413
|
+
label: `Option ${index + 1}`
|
|
414
|
+
}))
|
|
415
|
+
}], []);
|
|
416
|
+
const groupedOptions = useMemo(() => Array.from({
|
|
417
|
+
length: 10
|
|
418
|
+
}, (_, groupIndex) => ({
|
|
419
|
+
label: `Group ${groupIndex + 1}`,
|
|
420
|
+
options: Array.from({
|
|
421
|
+
length: 100
|
|
422
|
+
}, (_, optionIndex) => ({
|
|
423
|
+
value: `group-${groupIndex + 1}-option-${optionIndex + 1}`,
|
|
424
|
+
label: `Group ${groupIndex + 1} - Option ${optionIndex + 1}`
|
|
425
|
+
}))
|
|
426
|
+
})), []);
|
|
427
|
+
const virtualizedMenuRenderer = useCallback(({
|
|
428
|
+
children
|
|
429
|
+
}: {
|
|
430
|
+
children: React.ReactNode;
|
|
431
|
+
}) => {
|
|
432
|
+
const flattenedOptions: React.ReactElement[] = [];
|
|
433
|
+
const flattenOptions = (reactNode: React.ReactNode) => {
|
|
434
|
+
React.Children.forEach(reactNode, childElement => {
|
|
435
|
+
if (React.isValidElement(childElement)) {
|
|
436
|
+
if (childElement.type === "li" || childElement.props?.role) {
|
|
437
|
+
flattenedOptions.push(childElement);
|
|
438
|
+
} else if (childElement.props?.children) {
|
|
439
|
+
flattenOptions(childElement.props.children);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
};
|
|
444
|
+
flattenOptions(children);
|
|
445
|
+
if (flattenedOptions.length === 0) {
|
|
446
|
+
return <div>No options available</div>;
|
|
447
|
+
}
|
|
448
|
+
const itemHeight = 40;
|
|
449
|
+
const containerHeight = 200;
|
|
450
|
+
|
|
451
|
+
// Row renderer that preserves original elements with all their downshift props
|
|
452
|
+
const VirtualizedRow = useCallback(({
|
|
453
|
+
index,
|
|
454
|
+
style
|
|
455
|
+
}: {
|
|
456
|
+
index: number;
|
|
457
|
+
style: React.CSSProperties;
|
|
458
|
+
}) => {
|
|
459
|
+
const option = flattenedOptions[index];
|
|
460
|
+
return <div style={style}>{option}</div>;
|
|
461
|
+
}, [flattenedOptions]);
|
|
462
|
+
return <List height={containerHeight} width="100%" itemCount={flattenedOptions.length} itemSize={itemHeight} overscanCount={5}>
|
|
463
|
+
{VirtualizedRow}
|
|
464
|
+
</List>;
|
|
465
|
+
}, []);
|
|
466
|
+
return <Flex gap="large" align="start">
|
|
467
|
+
<div style={{
|
|
468
|
+
width: "350px"
|
|
469
|
+
}}>
|
|
470
|
+
<Dropdown placeholder="Search" options={options} label="Virtualized" menuRenderer={virtualizedMenuRenderer} searchable maxMenuHeight={250} clearAriaLabel="Clear" />
|
|
471
|
+
</div>
|
|
472
|
+
<div style={{
|
|
473
|
+
width: "350px"
|
|
474
|
+
}}>
|
|
475
|
+
<Dropdown placeholder="Search" options={groupedOptions} label="Grouped Virtualized" menuRenderer={virtualizedMenuRenderer} searchable maxMenuHeight={250} clearAriaLabel="Clear" />
|
|
476
|
+
</div>
|
|
477
|
+
</Flex>;
|
|
478
|
+
```
|
|
479
|
+
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Storybook Code Examples
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
const dropdownTemplate = props => {
|
|
7
|
+
const options = useMemo(() => [{
|
|
8
|
+
value: 1,
|
|
9
|
+
label: "Label"
|
|
10
|
+
}, {
|
|
11
|
+
value: 2,
|
|
12
|
+
label: "Label"
|
|
13
|
+
}, {
|
|
14
|
+
value: 3,
|
|
15
|
+
label: "Label"
|
|
16
|
+
}, {
|
|
17
|
+
value: 4,
|
|
18
|
+
label: "Label"
|
|
19
|
+
}, {
|
|
20
|
+
value: 5,
|
|
21
|
+
label: "Label"
|
|
22
|
+
}], []);
|
|
23
|
+
return <div style={{
|
|
24
|
+
width: "300px"
|
|
25
|
+
}}>
|
|
26
|
+
<Dropdown id="box-mode-overview" aria-label="Box mode overview" options={options} label="Label" placeholder="Placeholder text here" helperText="Helper text" searchable boxMode clearAriaLabel="Clear" />
|
|
27
|
+
</div>;
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## DefaultState
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
const options = useMemo(() => [{
|
|
35
|
+
value: 1,
|
|
36
|
+
label: "Label"
|
|
37
|
+
}, {
|
|
38
|
+
value: 2,
|
|
39
|
+
label: "Label"
|
|
40
|
+
}, {
|
|
41
|
+
value: 3,
|
|
42
|
+
label: "Label"
|
|
43
|
+
}, {
|
|
44
|
+
value: 4,
|
|
45
|
+
label: "Label"
|
|
46
|
+
}, {
|
|
47
|
+
value: 5,
|
|
48
|
+
label: "Label"
|
|
49
|
+
}, {
|
|
50
|
+
value: 6,
|
|
51
|
+
label: "Label"
|
|
52
|
+
}], []);
|
|
53
|
+
return <div style={{
|
|
54
|
+
width: "300px"
|
|
55
|
+
}}>
|
|
56
|
+
<Dropdown id="box-mode-default-state" aria-label="Box mode default state" options={options} label="Label" placeholder="Placeholder text" helperText="Helper text" searchable boxMode clearAriaLabel="Clear" />
|
|
57
|
+
</div>;
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## InsideADialog
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
const options = useMemo(() => [{
|
|
64
|
+
value: 1,
|
|
65
|
+
label: "Label"
|
|
66
|
+
}, {
|
|
67
|
+
value: 2,
|
|
68
|
+
label: "Label"
|
|
69
|
+
}, {
|
|
70
|
+
value: 3,
|
|
71
|
+
label: "Label"
|
|
72
|
+
}, {
|
|
73
|
+
value: 4,
|
|
74
|
+
label: "Label"
|
|
75
|
+
}, {
|
|
76
|
+
value: 5,
|
|
77
|
+
label: "Label"
|
|
78
|
+
}, {
|
|
79
|
+
value: 6,
|
|
80
|
+
label: "Label"
|
|
81
|
+
}], []);
|
|
82
|
+
return <div style={{
|
|
83
|
+
width: "300px"
|
|
84
|
+
}}>
|
|
85
|
+
<DialogContentContainer>
|
|
86
|
+
<Dropdown id="box-mode-dialog" aria-label="Box mode inside dialog" options={options} placeholder="Placeholder text" searchable boxMode clearAriaLabel="Clear" />
|
|
87
|
+
<Button style={{
|
|
88
|
+
width: "100%"
|
|
89
|
+
}} kind="secondary" size="small">
|
|
90
|
+
Edit
|
|
91
|
+
</Button>
|
|
92
|
+
</DialogContentContainer>
|
|
93
|
+
</div>;
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## MultiSelect
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
const options = useMemo(() => [{
|
|
100
|
+
value: 1,
|
|
101
|
+
label: "Label"
|
|
102
|
+
}, {
|
|
103
|
+
value: 2,
|
|
104
|
+
label: "Label"
|
|
105
|
+
}, {
|
|
106
|
+
value: 3,
|
|
107
|
+
label: "Label"
|
|
108
|
+
}, {
|
|
109
|
+
value: 4,
|
|
110
|
+
label: "Label"
|
|
111
|
+
}, {
|
|
112
|
+
value: 5,
|
|
113
|
+
label: "Label"
|
|
114
|
+
}], []);
|
|
115
|
+
return <Flex gap="large" align="start" wrap>
|
|
116
|
+
<Flex direction="column" gap="medium">
|
|
117
|
+
<Text type="text1" weight="bold">
|
|
118
|
+
Single line with hidden options
|
|
119
|
+
</Text>
|
|
120
|
+
<div style={{
|
|
121
|
+
width: "300px"
|
|
122
|
+
}}>
|
|
123
|
+
<Dropdown id="box-mode-multi-single-line" aria-label="Box mode multi select single line" options={options} placeholder="Placeholder text" searchable multi boxMode clearAriaLabel="Clear" />
|
|
124
|
+
</div>
|
|
125
|
+
</Flex>
|
|
126
|
+
|
|
127
|
+
<Flex direction="column" gap="medium">
|
|
128
|
+
<Text type="text1" weight="bold">
|
|
129
|
+
Multiple lines
|
|
130
|
+
</Text>
|
|
131
|
+
<div style={{
|
|
132
|
+
width: "300px"
|
|
133
|
+
}}>
|
|
134
|
+
<Dropdown id="box-mode-multi-multiline" aria-label="Box mode multi select multiple lines" options={options} placeholder="Placeholder text" searchable multi multiline boxMode clearAriaLabel="Clear" />
|
|
135
|
+
</div>
|
|
136
|
+
</Flex>
|
|
137
|
+
</Flex>;
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## WithIcons
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
const optionsWithIcons: any = useMemo(() => [{
|
|
144
|
+
value: "email",
|
|
145
|
+
label: "Email",
|
|
146
|
+
startElement: {
|
|
147
|
+
type: "icon",
|
|
148
|
+
value: Email
|
|
149
|
+
}
|
|
150
|
+
}, {
|
|
151
|
+
value: "send",
|
|
152
|
+
label: "Send",
|
|
153
|
+
startElement: {
|
|
154
|
+
type: "icon",
|
|
155
|
+
value: Send
|
|
156
|
+
}
|
|
157
|
+
}, {
|
|
158
|
+
value: "mobile",
|
|
159
|
+
label: "Mobile",
|
|
160
|
+
startElement: {
|
|
161
|
+
type: "icon",
|
|
162
|
+
value: Mobile
|
|
163
|
+
}
|
|
164
|
+
}, {
|
|
165
|
+
value: "notification",
|
|
166
|
+
label: "Send notification"
|
|
167
|
+
}], []);
|
|
168
|
+
return <div style={{
|
|
169
|
+
width: "300px"
|
|
170
|
+
}}>
|
|
171
|
+
<Dropdown id="box-mode-with-icons" aria-label="Box mode with icons" options={optionsWithIcons} label="Notify via" placeholder="You can choose multiple options" searchable multi boxMode clearAriaLabel="Clear" />
|
|
172
|
+
</div>;
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## PeoplePicker
|
|
176
|
+
|
|
177
|
+
```tsx
|
|
178
|
+
const peopleOptions: any = useMemo(() => [{
|
|
179
|
+
label: "Suggested people",
|
|
180
|
+
options: [{
|
|
181
|
+
value: "Matt",
|
|
182
|
+
label: "Matt Gaman",
|
|
183
|
+
startElement: {
|
|
184
|
+
type: "avatar",
|
|
185
|
+
value: person1
|
|
186
|
+
}
|
|
187
|
+
}, {
|
|
188
|
+
value: "Jennifer",
|
|
189
|
+
label: "Jennifer Lawrence",
|
|
190
|
+
startElement: {
|
|
191
|
+
type: "avatar",
|
|
192
|
+
value: person2
|
|
193
|
+
}
|
|
194
|
+
}, {
|
|
195
|
+
value: "Emma",
|
|
196
|
+
label: "Emma Stone",
|
|
197
|
+
startElement: {
|
|
198
|
+
type: "avatar",
|
|
199
|
+
value: person3
|
|
200
|
+
}
|
|
201
|
+
}, {
|
|
202
|
+
value: "Johnny",
|
|
203
|
+
label: "Johnny Depp",
|
|
204
|
+
startElement: {
|
|
205
|
+
type: "avatar",
|
|
206
|
+
value: person4
|
|
207
|
+
}
|
|
208
|
+
}]
|
|
209
|
+
}], []);
|
|
210
|
+
return <Flex gap="large" align="start" wrap>
|
|
211
|
+
<div style={{
|
|
212
|
+
width: "350px"
|
|
213
|
+
}}>
|
|
214
|
+
<Dropdown id="box-mode-people-picker" aria-label="Box mode people picker" options={peopleOptions} label="Person" placeholder="Search for people" searchable boxMode multi clearAriaLabel="Clear" />
|
|
215
|
+
</div>
|
|
216
|
+
</Flex>;
|
|
217
|
+
```
|
|
218
|
+
|