@lunit/design-system 2.0.1 → 2.1.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/README.md +107 -7
- package/dist/cjs/components/Checkbox/index.js +1 -1
- package/dist/cjs/components/Checkbox/index.js.map +1 -1
- package/dist/cjs/components/Chip/index.js +1 -1
- package/dist/cjs/components/Chip/index.js.map +1 -1
- package/dist/cjs/components/Dialog/index.js +1 -1
- package/dist/cjs/components/Dialog/index.js.map +1 -1
- package/dist/cjs/components/Dropdown/index.js +1 -1
- package/dist/cjs/components/Dropdown/index.js.map +1 -1
- package/dist/cjs/components/Radio/index.js +1 -1
- package/dist/cjs/components/Radio/index.js.map +1 -1
- package/dist/cjs/components/TextField/index.js +1 -1
- package/dist/cjs/components/TextField/index.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +2 -2
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Chip/Chip.styled.js +9 -16
- package/dist/components/Chip/Chip.styled.js.map +1 -1
- package/dist/components/Dialog/Dialog.js +0 -6
- package/dist/components/Dialog/Dialog.js.map +1 -1
- package/dist/components/Dropdown/Dropdown.js +37 -4
- package/dist/components/Dropdown/Dropdown.js.map +1 -1
- package/dist/components/Dropdown/Dropdown.styled.js +161 -0
- package/dist/components/Dropdown/Dropdown.styled.js.map +1 -0
- package/dist/components/Dropdown/Dropdown.types.js +2 -0
- package/dist/components/Dropdown/Dropdown.types.js.map +1 -0
- package/dist/components/Dropdown/DropdownItem.js +36 -0
- package/dist/components/Dropdown/DropdownItem.js.map +1 -0
- package/dist/components/Dropdown/index.js +1 -0
- package/dist/components/Dropdown/index.js.map +1 -1
- package/dist/components/Radio/Radio.js +2 -2
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/TextField/TextField.js +1 -1
- package/dist/components/TextField/TextField.js.map +1 -1
- package/dist/components/TextField/TextField.style.js +27 -3
- package/dist/components/TextField/TextField.style.js.map +1 -1
- package/dist/foundation/Typography/index.js +5 -0
- package/dist/foundation/Typography/index.js.map +1 -1
- package/dist/foundation/Typography/tokens.js +44 -0
- package/dist/foundation/Typography/tokens.js.map +1 -1
- package/dist/foundation/colors/base/blue.js +12 -10
- package/dist/foundation/colors/base/blue.js.map +1 -1
- package/dist/foundation/colors/base/green.js +11 -9
- package/dist/foundation/colors/base/green.js.map +1 -1
- package/dist/foundation/colors/base/grey.js +30 -15
- package/dist/foundation/colors/base/grey.js.map +1 -1
- package/dist/foundation/colors/base/lunitTeal.js +2 -0
- package/dist/foundation/colors/base/lunitTeal.js.map +1 -1
- package/dist/foundation/colors/base/magenta.js +3 -1
- package/dist/foundation/colors/base/magenta.js.map +1 -1
- package/dist/foundation/colors/base/orange.js +11 -9
- package/dist/foundation/colors/base/orange.js.map +1 -1
- package/dist/foundation/colors/base/purple.js +3 -1
- package/dist/foundation/colors/base/purple.js.map +1 -1
- package/dist/foundation/colors/base/red.js +5 -3
- package/dist/foundation/colors/base/red.js.map +1 -1
- package/dist/foundation/colors/base/yellow.js +12 -10
- package/dist/foundation/colors/base/yellow.js.map +1 -1
- package/dist/foundation/colors/index.js +3 -0
- package/dist/foundation/colors/index.js.map +1 -1
- package/dist/foundation/colors/token/component.js +26 -22
- package/dist/foundation/colors/token/component.js.map +1 -1
- package/dist/foundation/colors/token/core.js +21 -0
- package/dist/foundation/colors/token/core.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/components/Button/Button.styled.d.ts +3 -3
- package/dist/types/components/Chip/Chip.styled.d.ts +8 -8
- package/dist/types/components/Dialog/Dialog.d.ts +0 -3
- package/dist/types/components/Dropdown/Dropdown.d.ts +3 -1
- package/dist/types/components/Dropdown/Dropdown.styled.d.ts +41 -0
- package/dist/types/components/Dropdown/Dropdown.types.d.ts +11 -0
- package/dist/types/components/Dropdown/DropdownItem.d.ts +13 -0
- package/dist/types/components/Dropdown/index.d.ts +2 -0
- package/dist/types/components/ToggleButton/ToggleButton.styled.d.ts +2 -2
- package/dist/types/foundation/Typography/index.d.ts +21 -1
- package/dist/types/foundation/Typography/tokens.d.ts +15 -0
- package/dist/types/foundation/colors/base/blue.d.ts +2 -0
- package/dist/types/foundation/colors/base/green.d.ts +2 -0
- package/dist/types/foundation/colors/base/grey.d.ts +15 -0
- package/dist/types/foundation/colors/base/lunitTeal.d.ts +2 -0
- package/dist/types/foundation/colors/base/magenta.d.ts +2 -0
- package/dist/types/foundation/colors/base/orange.d.ts +2 -0
- package/dist/types/foundation/colors/base/purple.d.ts +2 -0
- package/dist/types/foundation/colors/base/red.d.ts +2 -0
- package/dist/types/foundation/colors/base/yellow.d.ts +2 -0
- package/dist/types/foundation/colors/index.d.ts +3 -0
- package/dist/types/foundation/colors/types.d.ts +3 -0
- package/dist/types/foundation/index.d.ts +3 -0
- package/dist/types/index.d.ts +1 -1
- package/package.json +2 -2
- package/src/components/Checkbox/Checkbox.tsx +4 -4
- package/src/components/Chip/Chip.styled.ts +9 -16
- package/src/components/Dialog/Dialog.tsx +0 -8
- package/src/components/Dropdown/Dropdown.styled.tsx +170 -0
- package/src/components/Dropdown/Dropdown.tsx +59 -8
- package/src/components/Dropdown/Dropdown.types.ts +15 -0
- package/src/components/Dropdown/DropdownItem.tsx +107 -0
- package/src/components/Dropdown/index.ts +6 -0
- package/src/components/Radio/Radio.tsx +4 -4
- package/src/components/TextField/TextField.style.ts +28 -3
- package/src/components/TextField/TextField.tsx +1 -7
- package/src/foundation/Typography/index.ts +10 -0
- package/src/foundation/Typography/tokens.ts +45 -0
- package/src/foundation/colors/base/blue.ts +12 -10
- package/src/foundation/colors/base/green.ts +11 -9
- package/src/foundation/colors/base/grey.ts +30 -15
- package/src/foundation/colors/base/lunitTeal.ts +2 -0
- package/src/foundation/colors/base/magenta.ts +3 -1
- package/src/foundation/colors/base/orange.ts +11 -9
- package/src/foundation/colors/base/purple.ts +3 -1
- package/src/foundation/colors/base/red.ts +5 -3
- package/src/foundation/colors/base/yellow.ts +12 -10
- package/src/foundation/colors/index.ts +3 -0
- package/src/foundation/colors/token/component.ts +26 -22
- package/src/foundation/colors/token/core.ts +21 -0
- package/src/foundation/colors/types.ts +3 -0
- package/src/index.ts +6 -1
- package/src/stories/components/Chip/Chip.stories.tsx +18 -0
- package/src/stories/components/Chip/ChipDocs.mdx +20 -0
- package/src/stories/components/Dialog/DialogDocs.mdx +2 -10
- package/src/stories/components/Dropdown/Dropdown.stories.tsx +299 -10
- package/src/stories/components/Dropdown/DropdownExamples.stories.tsx +221 -0
- package/src/stories/components/Dropdown/DropdownItem.stories.tsx +360 -0
- package/src/stories/components/TextField/BasicTextField.stories.tsx +28 -0
- package/src/stories/components/TextField/TextFieldDocs.mdx +12 -0
- package/src/stories/foundation/Typography/Typography.stories.tsx +13 -0
- package/src/stories/foundation/Typography/const.ts +6 -1
- package/src/stories/foundation/colors/TokenPaletteTable.tsx +19 -1
- package/dist/cjs/components/Modal/index.js +0 -2
- package/dist/cjs/components/Modal/index.js.map +0 -1
- package/dist/components/Modal/Modal.js +0 -7
- package/dist/components/Modal/Modal.js.map +0 -1
- package/dist/components/Modal/index.js +0 -2
- package/dist/components/Modal/index.js.map +0 -1
- package/dist/types/components/Modal/Modal.d.ts +0 -2
- package/dist/types/components/Modal/index.d.ts +0 -1
|
@@ -1,21 +1,310 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { StoryFn, Meta } from "@storybook/react";
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { StoryFn, Meta, StoryObj } from "@storybook/react";
|
|
3
3
|
|
|
4
|
-
import Dropdown from "@/components/Dropdown";
|
|
4
|
+
import Dropdown, { DropdownItem } from "@/components/Dropdown";
|
|
5
|
+
import { Box, SelectChangeEvent } from "@mui/material";
|
|
5
6
|
|
|
6
7
|
export default {
|
|
7
8
|
title: "Components/Dropdown",
|
|
8
9
|
component: Dropdown,
|
|
10
|
+
argTypes: {
|
|
11
|
+
size: {
|
|
12
|
+
control: {
|
|
13
|
+
type: "radio",
|
|
14
|
+
},
|
|
15
|
+
options: ["small", "medium", "large"],
|
|
16
|
+
description: "The size of the dropdown. Default is medium.",
|
|
17
|
+
},
|
|
18
|
+
select: {
|
|
19
|
+
control: {
|
|
20
|
+
type: "radio",
|
|
21
|
+
},
|
|
22
|
+
options: ["single", "multiple"],
|
|
23
|
+
description: "The select type of the dropdown. Default is single.",
|
|
24
|
+
},
|
|
25
|
+
error: {
|
|
26
|
+
control: {
|
|
27
|
+
type: "radio",
|
|
28
|
+
},
|
|
29
|
+
options: [true, false],
|
|
30
|
+
description: "The error prop toggles the error state.",
|
|
31
|
+
},
|
|
32
|
+
disabled: {
|
|
33
|
+
control: {
|
|
34
|
+
type: "radio",
|
|
35
|
+
},
|
|
36
|
+
options: [true, false],
|
|
37
|
+
description: "If true, the text field will be disabled.",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
9
40
|
} as Meta<typeof Dropdown>;
|
|
10
41
|
|
|
11
|
-
const
|
|
42
|
+
const BasicDropdownTemplate: StoryFn<typeof Dropdown> = (args, context) => {
|
|
43
|
+
const classNameFromGlobal = context.globals.theme;
|
|
12
44
|
|
|
13
|
-
|
|
14
|
-
|
|
45
|
+
// In a single select, selectedValue can be used as a string type instead of an array.
|
|
46
|
+
// In the current Storybook Template, we use selectedValue as a string[] in order to also use it as multiple depending on the control selection.
|
|
47
|
+
const [selectedValue, setSelectedValue] = useState<string[]>(["test1"]);
|
|
48
|
+
const handleSelectedValueChange = (event: SelectChangeEvent<unknown>) => {
|
|
49
|
+
const {
|
|
50
|
+
target: { value },
|
|
51
|
+
} = event;
|
|
52
|
+
setSelectedValue(
|
|
53
|
+
// On autofill we get a stringified value.
|
|
54
|
+
typeof value === "string" ? value.split(",") : (value as string[])
|
|
55
|
+
);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<Box>
|
|
60
|
+
<Dropdown
|
|
61
|
+
className={classNameFromGlobal}
|
|
62
|
+
value={selectedValue}
|
|
63
|
+
onChange={handleSelectedValueChange}
|
|
64
|
+
sx={{ width: "150px" }}
|
|
65
|
+
{...args}
|
|
66
|
+
>
|
|
67
|
+
<DropdownItem value={"test1"}>Conquer cancer through AI</DropdownItem>
|
|
68
|
+
<DropdownItem value={"test2"}>test item 2</DropdownItem>
|
|
69
|
+
<DropdownItem value={"test3"}>test item 3</DropdownItem>
|
|
70
|
+
</Dropdown>
|
|
71
|
+
</Box>
|
|
72
|
+
);
|
|
15
73
|
};
|
|
16
|
-
|
|
17
|
-
|
|
74
|
+
|
|
75
|
+
export const BasicDropdown: StoryObj<typeof Dropdown> = {
|
|
76
|
+
render: BasicDropdownTemplate,
|
|
77
|
+
parameters: {
|
|
78
|
+
chromatic: { disableSnapshot: true },
|
|
79
|
+
},
|
|
18
80
|
};
|
|
19
|
-
|
|
20
|
-
|
|
81
|
+
|
|
82
|
+
const SizeTemplate: StoryFn<typeof Dropdown> = (args, context) => {
|
|
83
|
+
const classNameFromGlobal = context.globals.theme;
|
|
84
|
+
|
|
85
|
+
// In a single select, selectedValue can be used as a string type instead of an array.
|
|
86
|
+
// In the current Storybook Template, we use selectedValue as a string[] in order to also use it as multiple depending on the control selection.
|
|
87
|
+
const [selectedValue, setSelectedValue] = useState<string[]>(["test1"]);
|
|
88
|
+
const handleSelectedValueChange = (event: SelectChangeEvent<unknown>) => {
|
|
89
|
+
const {
|
|
90
|
+
target: { value },
|
|
91
|
+
} = event;
|
|
92
|
+
setSelectedValue(
|
|
93
|
+
// On autofill we get a stringified value.
|
|
94
|
+
typeof value === "string" ? value.split(",") : (value as string[])
|
|
95
|
+
);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
return (
|
|
99
|
+
<Box sx={{ display: "flex", alignItems: "center", gap: 4 }}>
|
|
100
|
+
<Box>
|
|
101
|
+
<Dropdown
|
|
102
|
+
className={classNameFromGlobal}
|
|
103
|
+
value={selectedValue}
|
|
104
|
+
onChange={handleSelectedValueChange}
|
|
105
|
+
size="small"
|
|
106
|
+
sx={{ width: "150px" }}
|
|
107
|
+
{...args}
|
|
108
|
+
>
|
|
109
|
+
<DropdownItem value={"test1"}>Small item 1</DropdownItem>
|
|
110
|
+
<DropdownItem value={"test2"}>Small item 2</DropdownItem>
|
|
111
|
+
<DropdownItem value={"test3"}>Small item 3</DropdownItem>
|
|
112
|
+
</Dropdown>
|
|
113
|
+
</Box>
|
|
114
|
+
<Box>
|
|
115
|
+
<Dropdown
|
|
116
|
+
className={classNameFromGlobal}
|
|
117
|
+
value={selectedValue}
|
|
118
|
+
onChange={handleSelectedValueChange}
|
|
119
|
+
size="medium"
|
|
120
|
+
sx={{ width: "150px" }}
|
|
121
|
+
{...args}
|
|
122
|
+
>
|
|
123
|
+
<DropdownItem value={"test1"}>Medium item 1</DropdownItem>
|
|
124
|
+
<DropdownItem value={"test2"}>Medium item 2</DropdownItem>
|
|
125
|
+
<DropdownItem value={"test3"}>Medium item 3</DropdownItem>
|
|
126
|
+
</Dropdown>
|
|
127
|
+
</Box>
|
|
128
|
+
<Box>
|
|
129
|
+
<Dropdown
|
|
130
|
+
className={classNameFromGlobal}
|
|
131
|
+
value={selectedValue}
|
|
132
|
+
onChange={handleSelectedValueChange}
|
|
133
|
+
size="large"
|
|
134
|
+
sx={{ width: "150px" }}
|
|
135
|
+
{...args}
|
|
136
|
+
>
|
|
137
|
+
<DropdownItem value={"test1"}>Large item 1</DropdownItem>
|
|
138
|
+
<DropdownItem value={"test2"}>Large item 2</DropdownItem>
|
|
139
|
+
<DropdownItem value={"test3"}>Large item 3</DropdownItem>
|
|
140
|
+
</Dropdown>
|
|
141
|
+
</Box>
|
|
142
|
+
</Box>
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
export const Size: StoryObj<typeof Dropdown> = {
|
|
147
|
+
render: SizeTemplate,
|
|
148
|
+
parameters: {
|
|
149
|
+
controls: {
|
|
150
|
+
include: ["select", "error", "disabled"],
|
|
151
|
+
},
|
|
152
|
+
chromatic: { disableSnapshot: true },
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const SelectTypeTemplate: StoryFn<typeof Dropdown> = (args, context) => {
|
|
157
|
+
const classNameFromGlobal = context.globals.theme;
|
|
158
|
+
|
|
159
|
+
const [selectedValue, setSelectedValue] = useState<string>("single1");
|
|
160
|
+
const handleSelectedValueChange = (event: SelectChangeEvent<unknown>) => {
|
|
161
|
+
const {
|
|
162
|
+
target: { value },
|
|
163
|
+
} = event;
|
|
164
|
+
setSelectedValue(value as string);
|
|
165
|
+
};
|
|
166
|
+
const [selectedValue2, setSelectedValue2] = useState<string[]>(["multiple1"]);
|
|
167
|
+
const handleSelectedValueChange2 = (event: SelectChangeEvent<unknown>) => {
|
|
168
|
+
const {
|
|
169
|
+
target: { value },
|
|
170
|
+
} = event;
|
|
171
|
+
setSelectedValue2(
|
|
172
|
+
// On autofill we get a stringified value.
|
|
173
|
+
typeof value === "string" ? value.split(",") : (value as string[])
|
|
174
|
+
);
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
return (
|
|
178
|
+
<Box sx={{ display: "flex", alignItems: "center", gap: 4 }}>
|
|
179
|
+
<Box>
|
|
180
|
+
<Dropdown
|
|
181
|
+
className={classNameFromGlobal}
|
|
182
|
+
value={selectedValue}
|
|
183
|
+
onChange={handleSelectedValueChange}
|
|
184
|
+
sx={{ width: "150px" }}
|
|
185
|
+
{...args}
|
|
186
|
+
>
|
|
187
|
+
<DropdownItem value={"single1"}>Single item 1</DropdownItem>
|
|
188
|
+
<DropdownItem value={"single2"}>Single item 2</DropdownItem>
|
|
189
|
+
<DropdownItem value={"single3"}>Single item 3</DropdownItem>
|
|
190
|
+
</Dropdown>
|
|
191
|
+
</Box>
|
|
192
|
+
<Box>
|
|
193
|
+
<Dropdown
|
|
194
|
+
className={classNameFromGlobal}
|
|
195
|
+
value={selectedValue2}
|
|
196
|
+
onChange={handleSelectedValueChange2}
|
|
197
|
+
select="multiple"
|
|
198
|
+
sx={{ width: "200px" }}
|
|
199
|
+
{...args}
|
|
200
|
+
>
|
|
201
|
+
<DropdownItem value={"multiple1"}>Multiple item 1</DropdownItem>
|
|
202
|
+
<DropdownItem value={"multiple2"}>Multiple item 2</DropdownItem>
|
|
203
|
+
<DropdownItem value={"multiple3"}>Multiple item 3</DropdownItem>
|
|
204
|
+
</Dropdown>
|
|
205
|
+
</Box>
|
|
206
|
+
</Box>
|
|
207
|
+
);
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
export const SelectType: StoryObj<typeof Dropdown> = {
|
|
211
|
+
render: SelectTypeTemplate,
|
|
212
|
+
parameters: {
|
|
213
|
+
controls: {
|
|
214
|
+
include: ["size", "error", "disabled"],
|
|
215
|
+
},
|
|
216
|
+
chromatic: { disableSnapshot: true },
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const ErrorTemplate: StoryFn<typeof Dropdown> = (args, context) => {
|
|
221
|
+
const classNameFromGlobal = context.globals.theme;
|
|
222
|
+
|
|
223
|
+
// In a single select, selectedValue can be used as a string type instead of an array.
|
|
224
|
+
// In the current Storybook Template, we use selectedValue as a string[] in order to also use it as multiple depending on the control selection.
|
|
225
|
+
const [selectedValue, setSelectedValue] = useState<string[]>(["test1"]);
|
|
226
|
+
const handleSelectedValueChange = (event: SelectChangeEvent<unknown>) => {
|
|
227
|
+
const {
|
|
228
|
+
target: { value },
|
|
229
|
+
} = event;
|
|
230
|
+
setSelectedValue(
|
|
231
|
+
// On autofill we get a stringified value.
|
|
232
|
+
typeof value === "string" ? value.split(",") : (value as string[])
|
|
233
|
+
);
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
return (
|
|
237
|
+
<Box sx={{ display: "flex", alignItems: "center", gap: 4 }}>
|
|
238
|
+
<Box>
|
|
239
|
+
<Dropdown
|
|
240
|
+
className={classNameFromGlobal}
|
|
241
|
+
value={selectedValue}
|
|
242
|
+
onChange={handleSelectedValueChange}
|
|
243
|
+
error
|
|
244
|
+
sx={{ width: "150px" }}
|
|
245
|
+
{...args}
|
|
246
|
+
>
|
|
247
|
+
<DropdownItem value={"test1"}>Small item 1</DropdownItem>
|
|
248
|
+
<DropdownItem value={"test2"}>Small item 2</DropdownItem>
|
|
249
|
+
<DropdownItem value={"test3"}>Small item 3</DropdownItem>
|
|
250
|
+
</Dropdown>
|
|
251
|
+
</Box>
|
|
252
|
+
</Box>
|
|
253
|
+
);
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
export const Error: StoryObj<typeof Dropdown> = {
|
|
257
|
+
render: ErrorTemplate,
|
|
258
|
+
parameters: {
|
|
259
|
+
controls: {
|
|
260
|
+
include: [],
|
|
261
|
+
},
|
|
262
|
+
chromatic: { disableSnapshot: true },
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
const DisabledTemplate: StoryFn<typeof Dropdown> = (args, context) => {
|
|
267
|
+
const classNameFromGlobal = context.globals.theme;
|
|
268
|
+
|
|
269
|
+
// In a single select, selectedValue can be used as a string type instead of an array.
|
|
270
|
+
// In the current Storybook Template, we use selectedValue as a string[] in order to also use it as multiple depending on the control selection.
|
|
271
|
+
const [selectedValue, setSelectedValue] = useState<string[]>(["test1"]);
|
|
272
|
+
const handleSelectedValueChange = (event: SelectChangeEvent<unknown>) => {
|
|
273
|
+
const {
|
|
274
|
+
target: { value },
|
|
275
|
+
} = event;
|
|
276
|
+
setSelectedValue(
|
|
277
|
+
// On autofill we get a stringified value.
|
|
278
|
+
typeof value === "string" ? value.split(",") : (value as string[])
|
|
279
|
+
);
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
return (
|
|
283
|
+
<Box sx={{ display: "flex", alignItems: "center", gap: 4 }}>
|
|
284
|
+
<Box>
|
|
285
|
+
<Dropdown
|
|
286
|
+
className={classNameFromGlobal}
|
|
287
|
+
value={selectedValue}
|
|
288
|
+
onChange={handleSelectedValueChange}
|
|
289
|
+
disabled
|
|
290
|
+
sx={{ width: "150px" }}
|
|
291
|
+
{...args}
|
|
292
|
+
>
|
|
293
|
+
<DropdownItem value={"test1"}>Small item 1</DropdownItem>
|
|
294
|
+
<DropdownItem value={"test2"}>Small item 2</DropdownItem>
|
|
295
|
+
<DropdownItem value={"test3"}>Small item 3</DropdownItem>
|
|
296
|
+
</Dropdown>
|
|
297
|
+
</Box>
|
|
298
|
+
</Box>
|
|
299
|
+
);
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
export const Disabled: StoryObj<typeof Dropdown> = {
|
|
303
|
+
render: DisabledTemplate,
|
|
304
|
+
parameters: {
|
|
305
|
+
controls: {
|
|
306
|
+
include: [],
|
|
307
|
+
},
|
|
308
|
+
chromatic: { disableSnapshot: true },
|
|
309
|
+
},
|
|
21
310
|
};
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { StoryFn, Meta, StoryObj } from "@storybook/react";
|
|
3
|
+
|
|
4
|
+
import Dropdown, { DropdownItem } from "@/components/Dropdown";
|
|
5
|
+
import {
|
|
6
|
+
Box,
|
|
7
|
+
SelectChangeEvent,
|
|
8
|
+
Table,
|
|
9
|
+
TableBody,
|
|
10
|
+
TableCell,
|
|
11
|
+
TableHead,
|
|
12
|
+
TableRow,
|
|
13
|
+
} from "@mui/material";
|
|
14
|
+
import Button from "@/components/Button";
|
|
15
|
+
|
|
16
|
+
export default {
|
|
17
|
+
title: "Components/Dropdown",
|
|
18
|
+
component: Dropdown,
|
|
19
|
+
argTypes: {
|
|
20
|
+
size: {
|
|
21
|
+
control: {
|
|
22
|
+
type: "radio",
|
|
23
|
+
},
|
|
24
|
+
options: ["small", "medium", "large"],
|
|
25
|
+
description: "The size of the dropdown. Default is medium.",
|
|
26
|
+
},
|
|
27
|
+
select: {
|
|
28
|
+
control: {
|
|
29
|
+
type: "radio",
|
|
30
|
+
},
|
|
31
|
+
options: ["single", "multiple"],
|
|
32
|
+
description: "The select type of the dropdown. Default is single.",
|
|
33
|
+
},
|
|
34
|
+
error: {
|
|
35
|
+
control: {
|
|
36
|
+
type: "radio",
|
|
37
|
+
},
|
|
38
|
+
options: [true, false],
|
|
39
|
+
description: "The error prop toggles the error state.",
|
|
40
|
+
},
|
|
41
|
+
disabled: {
|
|
42
|
+
control: {
|
|
43
|
+
type: "radio",
|
|
44
|
+
},
|
|
45
|
+
options: [true, false],
|
|
46
|
+
description: "If true, the text field will be disabled.",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
} as Meta<typeof Dropdown>;
|
|
50
|
+
|
|
51
|
+
const dropdownContent = {
|
|
52
|
+
test1: "Conquer cancer through AI",
|
|
53
|
+
test2: "test item 2",
|
|
54
|
+
test3: "test item 3",
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const DropdownExampleTemplate: StoryFn<typeof Dropdown> = (args, context) => {
|
|
58
|
+
const classNameFromGlobal = context.globals.theme;
|
|
59
|
+
|
|
60
|
+
const [ex1selectedValue, setEx1SelectedValue] = useState<string>("");
|
|
61
|
+
const handleEx1SelectedValueChange = (event: SelectChangeEvent<unknown>) => {
|
|
62
|
+
const {
|
|
63
|
+
target: { value },
|
|
64
|
+
} = event;
|
|
65
|
+
setEx1SelectedValue(value as string);
|
|
66
|
+
};
|
|
67
|
+
const [ex2selectedValue, setEx2SelectedValue] = useState<string[]>([]);
|
|
68
|
+
const handleEx2SelectedValueChange = (event: SelectChangeEvent<unknown>) => {
|
|
69
|
+
const {
|
|
70
|
+
target: { value },
|
|
71
|
+
} = event;
|
|
72
|
+
setEx2SelectedValue(
|
|
73
|
+
// On autofill we get a stringified value.
|
|
74
|
+
typeof value === "string" ? value.split(",") : (value as string[])
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
const [ex3selectedValue, setEx3SelectedValue] = useState<string>("test1");
|
|
78
|
+
const handleEx3SelectedValueChange = (event: SelectChangeEvent<unknown>) => {
|
|
79
|
+
const {
|
|
80
|
+
target: { value },
|
|
81
|
+
} = event;
|
|
82
|
+
setEx3SelectedValue(value as string);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const [open, setOpen] = useState(false);
|
|
86
|
+
const handleClose = () => {
|
|
87
|
+
setOpen(false);
|
|
88
|
+
};
|
|
89
|
+
const handleOpen = () => {
|
|
90
|
+
setOpen(true);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<Table sx={{ maxWidth: "1200px" }}>
|
|
95
|
+
<TableHead>
|
|
96
|
+
<TableRow>
|
|
97
|
+
<TableCell sx={{ typography: "body2_14_medium", color: "inherit" }}>
|
|
98
|
+
Using placeholder Example
|
|
99
|
+
</TableCell>
|
|
100
|
+
<TableCell sx={{ typography: "body2_14_medium", color: "inherit" }}>
|
|
101
|
+
Dropdown with Button Example
|
|
102
|
+
</TableCell>
|
|
103
|
+
</TableRow>
|
|
104
|
+
</TableHead>
|
|
105
|
+
<TableBody>
|
|
106
|
+
<TableRow>
|
|
107
|
+
<TableCell>
|
|
108
|
+
{/* This placeholder examples are referenced from MUI demo https://v5.mui.com/material-ui/react-select/#placeholder */}
|
|
109
|
+
{/* Example 1 (Placeholder with Single select) */}
|
|
110
|
+
<Dropdown
|
|
111
|
+
className={classNameFromGlobal}
|
|
112
|
+
sx={{ width: "200px" }}
|
|
113
|
+
value={ex1selectedValue}
|
|
114
|
+
onChange={handleEx1SelectedValueChange}
|
|
115
|
+
displayEmpty // to make the placeholder visible. Refer to the following URL: https://v5.mui.com/material-ui/api/select/#select-prop-displayEmpty
|
|
116
|
+
renderValue={(selected) => {
|
|
117
|
+
if (!selected) {
|
|
118
|
+
return (
|
|
119
|
+
<Box
|
|
120
|
+
sx={{
|
|
121
|
+
color: (theme) =>
|
|
122
|
+
theme.palette.lunit_token.core.text_light,
|
|
123
|
+
}}
|
|
124
|
+
>
|
|
125
|
+
Placeholder Single
|
|
126
|
+
</Box>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
return dropdownContent[
|
|
130
|
+
selected as keyof typeof dropdownContent
|
|
131
|
+
];
|
|
132
|
+
}}
|
|
133
|
+
>
|
|
134
|
+
{Object.entries(dropdownContent).map(([key, text]) => (
|
|
135
|
+
<DropdownItem key={key} value={key}>
|
|
136
|
+
{text}
|
|
137
|
+
</DropdownItem>
|
|
138
|
+
))}
|
|
139
|
+
</Dropdown>
|
|
140
|
+
|
|
141
|
+
{/* Example 2 (Placeholder with Multiple select) */}
|
|
142
|
+
<Dropdown
|
|
143
|
+
className={classNameFromGlobal}
|
|
144
|
+
sx={{ width: "200px" }}
|
|
145
|
+
value={ex2selectedValue}
|
|
146
|
+
onChange={handleEx2SelectedValueChange}
|
|
147
|
+
select="multiple"
|
|
148
|
+
displayEmpty
|
|
149
|
+
renderValue={(selected) => {
|
|
150
|
+
if ((selected as string[]).length === 0) {
|
|
151
|
+
return (
|
|
152
|
+
<Box
|
|
153
|
+
sx={{
|
|
154
|
+
color: (theme) =>
|
|
155
|
+
theme.palette.lunit_token.core.text_light,
|
|
156
|
+
}}
|
|
157
|
+
>
|
|
158
|
+
Placeholder multiple
|
|
159
|
+
</Box>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
return (selected as string[])
|
|
163
|
+
.map(
|
|
164
|
+
(value) =>
|
|
165
|
+
dropdownContent[value as keyof typeof dropdownContent]
|
|
166
|
+
)
|
|
167
|
+
.join(", ");
|
|
168
|
+
}}
|
|
169
|
+
>
|
|
170
|
+
{Object.entries(dropdownContent).map(([key, text]) => (
|
|
171
|
+
<DropdownItem key={key} value={key}>
|
|
172
|
+
{text}
|
|
173
|
+
</DropdownItem>
|
|
174
|
+
))}
|
|
175
|
+
</Dropdown>
|
|
176
|
+
</TableCell>
|
|
177
|
+
<TableCell>
|
|
178
|
+
{/* Example 3 (Button dropdown) */}
|
|
179
|
+
<Box sx={{ position: "relative" }}>
|
|
180
|
+
<Button onClick={handleOpen}>Dropdown Button</Button>
|
|
181
|
+
<Dropdown
|
|
182
|
+
value={ex3selectedValue}
|
|
183
|
+
onChange={handleEx3SelectedValueChange}
|
|
184
|
+
open={open}
|
|
185
|
+
onClose={handleClose}
|
|
186
|
+
onOpen={handleOpen}
|
|
187
|
+
sx={{
|
|
188
|
+
clip: "rect(0 0 0 0)",
|
|
189
|
+
clipPath: "inset(50%)",
|
|
190
|
+
height: "1px",
|
|
191
|
+
overflow: "hidden",
|
|
192
|
+
position: "absolute",
|
|
193
|
+
bottom: 0,
|
|
194
|
+
left: 0,
|
|
195
|
+
whiteSpace: "nowrap",
|
|
196
|
+
width: "1px",
|
|
197
|
+
}}
|
|
198
|
+
>
|
|
199
|
+
{Object.entries(dropdownContent).map(([key, text]) => (
|
|
200
|
+
<DropdownItem key={key} value={key}>
|
|
201
|
+
{text}
|
|
202
|
+
</DropdownItem>
|
|
203
|
+
))}
|
|
204
|
+
</Dropdown>
|
|
205
|
+
</Box>
|
|
206
|
+
</TableCell>
|
|
207
|
+
</TableRow>
|
|
208
|
+
</TableBody>
|
|
209
|
+
</Table>
|
|
210
|
+
);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
export const DropdownExamples: StoryObj<typeof Dropdown> = {
|
|
214
|
+
render: DropdownExampleTemplate,
|
|
215
|
+
parameters: {
|
|
216
|
+
controls: {
|
|
217
|
+
include: [],
|
|
218
|
+
},
|
|
219
|
+
chromatic: { disableSnapshot: true },
|
|
220
|
+
},
|
|
221
|
+
};
|