@ceed/ads 1.13.4 → 1.15.0-next.2
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/Overview.md +11 -0
- package/dist/components/Menu/Menu.d.ts +2 -5
- package/dist/components/Stepper/Stepper.d.ts +6 -0
- package/dist/components/data-display/Avatar.md +428 -0
- package/dist/components/data-display/Badge.md +315 -0
- package/dist/components/data-display/Chip.md +301 -0
- package/dist/components/data-display/DataTable.md +452 -0
- package/dist/components/data-display/InfoSign.md +160 -0
- package/dist/components/data-display/Markdown.md +17 -0
- package/dist/components/data-display/Table.md +1330 -0
- package/dist/components/data-display/Tooltip.md +444 -0
- package/dist/components/data-display/Typography.md +271 -0
- package/dist/components/data-display/llms.txt +17 -0
- package/dist/components/feedback/Alert.md +663 -0
- package/dist/components/feedback/Dialog.md +33 -0
- package/dist/components/feedback/Modal.md +39 -0
- package/dist/components/feedback/llms.txt +11 -0
- package/dist/components/inputs/Autocomplete.md +103 -0
- package/dist/components/inputs/Button.md +334 -0
- package/dist/components/inputs/ButtonGroup.md +382 -0
- package/dist/components/inputs/Calendar.md +19 -0
- package/dist/components/inputs/Checkbox.md +649 -0
- package/dist/components/inputs/CurrencyInput.md +91 -0
- package/dist/components/inputs/DatePicker.md +67 -0
- package/dist/components/inputs/DateRangePicker.md +55 -0
- package/dist/components/inputs/FilterMenu.md +210 -0
- package/dist/components/inputs/IconButton.md +361 -0
- package/dist/components/inputs/Input.md +283 -0
- package/dist/components/inputs/MonthPicker.md +72 -0
- package/dist/components/inputs/MonthRangePicker.md +70 -0
- package/dist/components/inputs/PercentageInput.md +116 -0
- package/dist/components/inputs/RadioButton.md +350 -0
- package/dist/components/inputs/RadioTileGroup.md +418 -0
- package/dist/components/inputs/Select.md +56 -0
- package/dist/components/inputs/Switch.md +577 -0
- package/dist/components/inputs/Textarea.md +64 -0
- package/dist/components/inputs/Uploader/Uploader.md +238 -0
- package/dist/components/inputs/Uploader/llms.txt +9 -0
- package/dist/components/inputs/llms.txt +31 -0
- package/dist/components/layout/Box.md +997 -0
- package/dist/components/layout/Container.md +23 -0
- package/dist/components/layout/Grid.md +728 -0
- package/dist/components/layout/Stack.md +937 -0
- package/dist/components/layout/llms.txt +12 -0
- package/dist/components/llms.txt +14 -0
- package/dist/components/navigation/Breadcrumbs.md +51 -0
- package/dist/components/navigation/Dropdown.md +768 -0
- package/dist/components/navigation/IconMenuButton.md +35 -0
- package/dist/components/navigation/InsetDrawer.md +133 -0
- package/dist/components/navigation/Link.md +24 -0
- package/dist/components/navigation/Menu.md +957 -0
- package/dist/components/navigation/MenuButton.md +39 -0
- package/dist/components/navigation/NavigationGroup.md +17 -0
- package/dist/components/navigation/NavigationItem.md +17 -0
- package/dist/components/navigation/Navigator.md +17 -0
- package/dist/components/navigation/Pagination.md +17 -0
- package/dist/components/navigation/ProfileMenu.md +34 -0
- package/dist/components/navigation/Stepper.md +108 -0
- package/dist/components/navigation/Tabs.md +34 -0
- package/dist/components/navigation/llms.txt +22 -0
- package/dist/components/surfaces/Accordions.md +96 -0
- package/dist/components/surfaces/Card.md +786 -0
- package/dist/components/surfaces/Divider.md +762 -0
- package/dist/components/surfaces/Sheet.md +900 -0
- package/dist/components/surfaces/llms.txt +12 -0
- package/dist/index.cjs +22 -10
- package/dist/index.js +22 -10
- package/dist/llms.txt +75 -0
- package/framer/index.js +36 -36
- package/package.json +8 -4
|
@@ -0,0 +1,768 @@
|
|
|
1
|
+
# Dropdown
|
|
2
|
+
|
|
3
|
+
## Introduction
|
|
4
|
+
|
|
5
|
+
Dropdown 컴포넌트는 메뉴나 옵션 목록을 표시하는 컨테이너 역할을 하는 컴포넌트입니다. Joy UI의 Dropdown을 그대로 사용하며, MenuButton과 Menu 컴포넌트와 함께 사용하여 사용자가 클릭할 때 선택 가능한 옵션들을 보여줍니다. 네비게이션 메뉴, 필터 옵션, 사용자 프로필 메뉴 등 다양한 용도로 활용할 수 있습니다.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Dropdown>
|
|
9
|
+
<MenuButton variant="outlined" endDecorator={<ExpandMoreIcon />}>
|
|
10
|
+
메뉴 열기
|
|
11
|
+
</MenuButton>
|
|
12
|
+
<Menu>
|
|
13
|
+
<MenuItem>옵션 1</MenuItem>
|
|
14
|
+
<MenuItem>옵션 2</MenuItem>
|
|
15
|
+
<MenuItem>옵션 3</MenuItem>
|
|
16
|
+
</Menu>
|
|
17
|
+
</Dropdown>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Field | Description | Default |
|
|
21
|
+
| ---------------------------- | ----------- | ------- |
|
|
22
|
+
| Controls resolved at runtime | — | — |
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { Dropdown, MenuButton, Menu, MenuItem } from '@ceed/ads';
|
|
28
|
+
|
|
29
|
+
function MyComponent() {
|
|
30
|
+
return (
|
|
31
|
+
<Dropdown>
|
|
32
|
+
<MenuButton>메뉴 열기</MenuButton>
|
|
33
|
+
<Menu>
|
|
34
|
+
<MenuItem>옵션 1</MenuItem>
|
|
35
|
+
<MenuItem>옵션 2</MenuItem>
|
|
36
|
+
<MenuItem>옵션 3</MenuItem>
|
|
37
|
+
</Menu>
|
|
38
|
+
</Dropdown>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
|
|
45
|
+
### Basic Dropdown
|
|
46
|
+
|
|
47
|
+
가장 기본적인 Dropdown 사용법입니다.
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
<Stack direction="row" spacing={2}>
|
|
51
|
+
<Dropdown>
|
|
52
|
+
<MenuButton>기본 메뉴</MenuButton>
|
|
53
|
+
<Menu>
|
|
54
|
+
<MenuItem>첫 번째 옵션</MenuItem>
|
|
55
|
+
<MenuItem>두 번째 옵션</MenuItem>
|
|
56
|
+
<MenuItem>세 번째 옵션</MenuItem>
|
|
57
|
+
</Menu>
|
|
58
|
+
</Dropdown>
|
|
59
|
+
|
|
60
|
+
<Dropdown>
|
|
61
|
+
<MenuButton variant="outlined" endDecorator={<ExpandMoreIcon />}>
|
|
62
|
+
아이콘 포함
|
|
63
|
+
</MenuButton>
|
|
64
|
+
<Menu>
|
|
65
|
+
<MenuItem>옵션 A</MenuItem>
|
|
66
|
+
<MenuItem>옵션 B</MenuItem>
|
|
67
|
+
<MenuItem>옵션 C</MenuItem>
|
|
68
|
+
</Menu>
|
|
69
|
+
</Dropdown>
|
|
70
|
+
</Stack>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Button Variants
|
|
74
|
+
|
|
75
|
+
MenuButton의 다양한 스타일 변형을 사용할 수 있습니다.
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<Stack direction="row" spacing={2} flexWrap="wrap">
|
|
79
|
+
<Dropdown>
|
|
80
|
+
<MenuButton variant="plain">Plain</MenuButton>
|
|
81
|
+
<Menu>
|
|
82
|
+
<MenuItem>옵션 1</MenuItem>
|
|
83
|
+
<MenuItem>옵션 2</MenuItem>
|
|
84
|
+
</Menu>
|
|
85
|
+
</Dropdown>
|
|
86
|
+
|
|
87
|
+
<Dropdown>
|
|
88
|
+
<MenuButton variant="outlined">Outlined</MenuButton>
|
|
89
|
+
<Menu>
|
|
90
|
+
<MenuItem>옵션 1</MenuItem>
|
|
91
|
+
<MenuItem>옵션 2</MenuItem>
|
|
92
|
+
</Menu>
|
|
93
|
+
</Dropdown>
|
|
94
|
+
|
|
95
|
+
<Dropdown>
|
|
96
|
+
<MenuButton variant="soft">Soft</MenuButton>
|
|
97
|
+
<Menu>
|
|
98
|
+
<MenuItem>옵션 1</MenuItem>
|
|
99
|
+
<MenuItem>옵션 2</MenuItem>
|
|
100
|
+
</Menu>
|
|
101
|
+
</Dropdown>
|
|
102
|
+
|
|
103
|
+
<Dropdown>
|
|
104
|
+
<MenuButton variant="solid">Solid</MenuButton>
|
|
105
|
+
<Menu>
|
|
106
|
+
<MenuItem>옵션 1</MenuItem>
|
|
107
|
+
<MenuItem>옵션 2</MenuItem>
|
|
108
|
+
</Menu>
|
|
109
|
+
</Dropdown>
|
|
110
|
+
</Stack>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Button Colors
|
|
114
|
+
|
|
115
|
+
MenuButton에 다양한 색상을 적용할 수 있습니다.
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
<Stack direction="row" spacing={2} flexWrap="wrap">
|
|
119
|
+
<Dropdown>
|
|
120
|
+
<MenuButton color="primary" variant="soft">
|
|
121
|
+
Primary
|
|
122
|
+
</MenuButton>
|
|
123
|
+
<Menu>
|
|
124
|
+
<MenuItem>옵션 1</MenuItem>
|
|
125
|
+
<MenuItem>옵션 2</MenuItem>
|
|
126
|
+
</Menu>
|
|
127
|
+
</Dropdown>
|
|
128
|
+
|
|
129
|
+
<Dropdown>
|
|
130
|
+
<MenuButton color="neutral" variant="soft">
|
|
131
|
+
Neutral
|
|
132
|
+
</MenuButton>
|
|
133
|
+
<Menu>
|
|
134
|
+
<MenuItem>옵션 1</MenuItem>
|
|
135
|
+
<MenuItem>옵션 2</MenuItem>
|
|
136
|
+
</Menu>
|
|
137
|
+
</Dropdown>
|
|
138
|
+
|
|
139
|
+
<Dropdown>
|
|
140
|
+
<MenuButton color="danger" variant="soft">
|
|
141
|
+
Danger
|
|
142
|
+
</MenuButton>
|
|
143
|
+
<Menu>
|
|
144
|
+
<MenuItem>옵션 1</MenuItem>
|
|
145
|
+
<MenuItem>옵션 2</MenuItem>
|
|
146
|
+
</Menu>
|
|
147
|
+
</Dropdown>
|
|
148
|
+
|
|
149
|
+
<Dropdown>
|
|
150
|
+
<MenuButton color="success" variant="soft">
|
|
151
|
+
Success
|
|
152
|
+
</MenuButton>
|
|
153
|
+
<Menu>
|
|
154
|
+
<MenuItem>옵션 1</MenuItem>
|
|
155
|
+
<MenuItem>옵션 2</MenuItem>
|
|
156
|
+
</Menu>
|
|
157
|
+
</Dropdown>
|
|
158
|
+
|
|
159
|
+
<Dropdown>
|
|
160
|
+
<MenuButton color="warning" variant="soft">
|
|
161
|
+
Warning
|
|
162
|
+
</MenuButton>
|
|
163
|
+
<Menu>
|
|
164
|
+
<MenuItem>옵션 1</MenuItem>
|
|
165
|
+
<MenuItem>옵션 2</MenuItem>
|
|
166
|
+
</Menu>
|
|
167
|
+
</Dropdown>
|
|
168
|
+
</Stack>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Menu Placements
|
|
172
|
+
|
|
173
|
+
메뉴가 나타나는 위치를 설정할 수 있습니다.
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
<Stack direction="row" spacing={2} sx={{
|
|
177
|
+
mt: 4
|
|
178
|
+
}}>
|
|
179
|
+
<Dropdown>
|
|
180
|
+
<MenuButton variant="outlined">Bottom Start</MenuButton>
|
|
181
|
+
<Menu placement="bottom-start">
|
|
182
|
+
<MenuItem>옵션 1</MenuItem>
|
|
183
|
+
<MenuItem>옵션 2</MenuItem>
|
|
184
|
+
<MenuItem>옵션 3</MenuItem>
|
|
185
|
+
</Menu>
|
|
186
|
+
</Dropdown>
|
|
187
|
+
|
|
188
|
+
<Dropdown>
|
|
189
|
+
<MenuButton variant="outlined">Bottom</MenuButton>
|
|
190
|
+
<Menu placement="bottom">
|
|
191
|
+
<MenuItem>옵션 1</MenuItem>
|
|
192
|
+
<MenuItem>옵션 2</MenuItem>
|
|
193
|
+
<MenuItem>옵션 3</MenuItem>
|
|
194
|
+
</Menu>
|
|
195
|
+
</Dropdown>
|
|
196
|
+
|
|
197
|
+
<Dropdown>
|
|
198
|
+
<MenuButton variant="outlined">Bottom End</MenuButton>
|
|
199
|
+
<Menu placement="bottom-end">
|
|
200
|
+
<MenuItem>옵션 1</MenuItem>
|
|
201
|
+
<MenuItem>옵션 2</MenuItem>
|
|
202
|
+
<MenuItem>옵션 3</MenuItem>
|
|
203
|
+
</Menu>
|
|
204
|
+
</Dropdown>
|
|
205
|
+
|
|
206
|
+
<Dropdown>
|
|
207
|
+
<MenuButton variant="outlined">Top Start</MenuButton>
|
|
208
|
+
<Menu placement="top-start">
|
|
209
|
+
<MenuItem>옵션 1</MenuItem>
|
|
210
|
+
<MenuItem>옵션 2</MenuItem>
|
|
211
|
+
<MenuItem>옵션 3</MenuItem>
|
|
212
|
+
</Menu>
|
|
213
|
+
</Dropdown>
|
|
214
|
+
</Stack>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### With Icons
|
|
218
|
+
|
|
219
|
+
아이콘이 포함된 메뉴를 만들 수 있습니다.
|
|
220
|
+
|
|
221
|
+
```tsx
|
|
222
|
+
<Dropdown>
|
|
223
|
+
<MenuButton variant="outlined" startDecorator={<PersonIcon />} endDecorator={<ExpandMoreIcon />}>
|
|
224
|
+
사용자 메뉴
|
|
225
|
+
</MenuButton>
|
|
226
|
+
<Menu>
|
|
227
|
+
<MenuItem>
|
|
228
|
+
<PersonIcon sx={{
|
|
229
|
+
mr: 1
|
|
230
|
+
}} />
|
|
231
|
+
프로필 보기
|
|
232
|
+
</MenuItem>
|
|
233
|
+
<MenuItem>
|
|
234
|
+
<SettingsIcon sx={{
|
|
235
|
+
mr: 1
|
|
236
|
+
}} />
|
|
237
|
+
설정
|
|
238
|
+
</MenuItem>
|
|
239
|
+
<ListDivider />
|
|
240
|
+
<MenuItem>
|
|
241
|
+
<LogoutIcon sx={{
|
|
242
|
+
mr: 1
|
|
243
|
+
}} />
|
|
244
|
+
로그아웃
|
|
245
|
+
</MenuItem>
|
|
246
|
+
</Menu>
|
|
247
|
+
</Dropdown>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Actions Menu
|
|
251
|
+
|
|
252
|
+
편집, 삭제 등의 액션 메뉴로 활용할 수 있습니다.
|
|
253
|
+
|
|
254
|
+
```tsx
|
|
255
|
+
<Dropdown>
|
|
256
|
+
<MenuButton variant="plain" color="neutral" endDecorator={<ExpandMoreIcon />} sx={{
|
|
257
|
+
fontSize: 'sm'
|
|
258
|
+
}}>
|
|
259
|
+
작업
|
|
260
|
+
</MenuButton>
|
|
261
|
+
<Menu>
|
|
262
|
+
<MenuItem>
|
|
263
|
+
<EditIcon sx={{
|
|
264
|
+
mr: 1,
|
|
265
|
+
fontSize: 'sm'
|
|
266
|
+
}} />
|
|
267
|
+
편집
|
|
268
|
+
</MenuItem>
|
|
269
|
+
<MenuItem>
|
|
270
|
+
<DeleteIcon sx={{
|
|
271
|
+
mr: 1,
|
|
272
|
+
fontSize: 'sm',
|
|
273
|
+
color: 'danger.500'
|
|
274
|
+
}} />
|
|
275
|
+
<Typography color="danger">삭제</Typography>
|
|
276
|
+
</MenuItem>
|
|
277
|
+
</Menu>
|
|
278
|
+
</Dropdown>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Filter Menu
|
|
282
|
+
|
|
283
|
+
필터링 기능을 위한 드롭다운 메뉴입니다.
|
|
284
|
+
|
|
285
|
+
```tsx
|
|
286
|
+
<Dropdown>
|
|
287
|
+
<MenuButton variant="outlined" startDecorator={<FilterListIcon />} endDecorator={<ExpandMoreIcon />}>
|
|
288
|
+
필터: {selectedFilter}
|
|
289
|
+
</MenuButton>
|
|
290
|
+
<Menu>
|
|
291
|
+
<MenuItem onClick={() => setSelectedFilter('전체')}>전체</MenuItem>
|
|
292
|
+
<MenuItem onClick={() => setSelectedFilter('활성')}>활성</MenuItem>
|
|
293
|
+
<MenuItem onClick={() => setSelectedFilter('비활성')}>비활성</MenuItem>
|
|
294
|
+
<MenuItem onClick={() => setSelectedFilter('대기중')}>대기중</MenuItem>
|
|
295
|
+
</Menu>
|
|
296
|
+
</Dropdown>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Profile Dropdown
|
|
300
|
+
|
|
301
|
+
사용자 프로필 메뉴로 활용할 수 있습니다.
|
|
302
|
+
|
|
303
|
+
```tsx
|
|
304
|
+
<Dropdown>
|
|
305
|
+
<MenuButton variant="plain" color="neutral" startDecorator={<Avatar size="sm" variant="soft" color="primary">
|
|
306
|
+
김
|
|
307
|
+
</Avatar>} endDecorator={<ExpandMoreIcon />} sx={{
|
|
308
|
+
gap: 1,
|
|
309
|
+
padding: 1
|
|
310
|
+
}}>
|
|
311
|
+
김철수
|
|
312
|
+
</MenuButton>
|
|
313
|
+
<Menu sx={{
|
|
314
|
+
minWidth: 200
|
|
315
|
+
}}>
|
|
316
|
+
<Stack px={2} py={1.5} spacing={0.5}>
|
|
317
|
+
<Typography level="title-sm" fontWeight="bold">
|
|
318
|
+
김철수
|
|
319
|
+
</Typography>
|
|
320
|
+
<Typography level="body-xs" color="neutral">
|
|
321
|
+
kim@example.com
|
|
322
|
+
</Typography>
|
|
323
|
+
</Stack>
|
|
324
|
+
|
|
325
|
+
<ListDivider />
|
|
326
|
+
|
|
327
|
+
<MenuItem>
|
|
328
|
+
<PersonIcon sx={{
|
|
329
|
+
mr: 1
|
|
330
|
+
}} />내 프로필
|
|
331
|
+
</MenuItem>
|
|
332
|
+
<MenuItem>
|
|
333
|
+
<SettingsIcon sx={{
|
|
334
|
+
mr: 1
|
|
335
|
+
}} />
|
|
336
|
+
계정 설정
|
|
337
|
+
</MenuItem>
|
|
338
|
+
|
|
339
|
+
<ListDivider />
|
|
340
|
+
|
|
341
|
+
<MenuItem>
|
|
342
|
+
<LogoutIcon sx={{
|
|
343
|
+
mr: 1
|
|
344
|
+
}} />
|
|
345
|
+
로그아웃
|
|
346
|
+
</MenuItem>
|
|
347
|
+
</Menu>
|
|
348
|
+
</Dropdown>
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Nested Menus
|
|
352
|
+
|
|
353
|
+
여러 개의 드롭다운 메뉴를 나란히 배치할 수 있습니다.
|
|
354
|
+
|
|
355
|
+
```tsx
|
|
356
|
+
<Stack direction="row" spacing={3}>
|
|
357
|
+
<Dropdown>
|
|
358
|
+
<MenuButton variant="outlined" endDecorator={<ExpandMoreIcon />}>
|
|
359
|
+
파일
|
|
360
|
+
</MenuButton>
|
|
361
|
+
<Menu>
|
|
362
|
+
<MenuItem>새 파일</MenuItem>
|
|
363
|
+
<MenuItem>열기</MenuItem>
|
|
364
|
+
<MenuItem disabled>최근 파일</MenuItem>
|
|
365
|
+
<ListDivider />
|
|
366
|
+
<MenuItem>저장</MenuItem>
|
|
367
|
+
<MenuItem>다른 이름으로 저장</MenuItem>
|
|
368
|
+
<ListDivider />
|
|
369
|
+
<MenuItem>인쇄</MenuItem>
|
|
370
|
+
</Menu>
|
|
371
|
+
</Dropdown>
|
|
372
|
+
|
|
373
|
+
<Dropdown>
|
|
374
|
+
<MenuButton variant="outlined" endDecorator={<ExpandMoreIcon />}>
|
|
375
|
+
편집
|
|
376
|
+
</MenuButton>
|
|
377
|
+
<Menu>
|
|
378
|
+
<MenuItem>실행 취소</MenuItem>
|
|
379
|
+
<MenuItem>다시 실행</MenuItem>
|
|
380
|
+
<ListDivider />
|
|
381
|
+
<MenuItem>잘라내기</MenuItem>
|
|
382
|
+
<MenuItem>복사</MenuItem>
|
|
383
|
+
<MenuItem>붙여넣기</MenuItem>
|
|
384
|
+
<ListDivider />
|
|
385
|
+
<MenuItem>모두 선택</MenuItem>
|
|
386
|
+
<MenuItem>찾기</MenuItem>
|
|
387
|
+
</Menu>
|
|
388
|
+
</Dropdown>
|
|
389
|
+
</Stack>
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Controlled Dropdown
|
|
393
|
+
|
|
394
|
+
프로그래밍 방식으로 메뉴의 열림/닫힘 상태를 제어할 수 있습니다.
|
|
395
|
+
|
|
396
|
+
```tsx
|
|
397
|
+
<Stack spacing={2}>
|
|
398
|
+
<Typography level="body-sm">메뉴 상태: {open ? '열림' : '닫힘'}</Typography>
|
|
399
|
+
|
|
400
|
+
<Dropdown open={open} onOpenChange={(event, isOpen) => setOpen(isOpen)}>
|
|
401
|
+
<MenuButton variant="outlined" endDecorator={<ExpandMoreIcon />}>
|
|
402
|
+
제어된 메뉴
|
|
403
|
+
</MenuButton>
|
|
404
|
+
<Menu>
|
|
405
|
+
<MenuItem onClick={() => setOpen(false)}>옵션 1</MenuItem>
|
|
406
|
+
<MenuItem onClick={() => setOpen(false)}>옵션 2</MenuItem>
|
|
407
|
+
<MenuItem onClick={() => setOpen(false)}>옵션 3</MenuItem>
|
|
408
|
+
</Menu>
|
|
409
|
+
</Dropdown>
|
|
410
|
+
|
|
411
|
+
<Button variant="soft" size="sm" onClick={() => setOpen(!open)}>
|
|
412
|
+
{open ? '메뉴 닫기' : '메뉴 열기'}
|
|
413
|
+
</Button>
|
|
414
|
+
</Stack>
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Disabled State
|
|
418
|
+
|
|
419
|
+
비활성 상태의 드롭다운과 메뉴 아이템을 표시할 수 있습니다.
|
|
420
|
+
|
|
421
|
+
```tsx
|
|
422
|
+
<Stack direction="row" spacing={2}>
|
|
423
|
+
<Dropdown>
|
|
424
|
+
<MenuButton disabled>비활성 메뉴</MenuButton>
|
|
425
|
+
<Menu>
|
|
426
|
+
<MenuItem>접근 불가</MenuItem>
|
|
427
|
+
</Menu>
|
|
428
|
+
</Dropdown>
|
|
429
|
+
|
|
430
|
+
<Dropdown>
|
|
431
|
+
<MenuButton variant="outlined">일부 옵션 비활성</MenuButton>
|
|
432
|
+
<Menu>
|
|
433
|
+
<MenuItem>활성 옵션</MenuItem>
|
|
434
|
+
<MenuItem disabled>비활성 옵션</MenuItem>
|
|
435
|
+
<MenuItem>활성 옵션 2</MenuItem>
|
|
436
|
+
</Menu>
|
|
437
|
+
</Dropdown>
|
|
438
|
+
</Stack>
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### Long Menu
|
|
442
|
+
|
|
443
|
+
많은 옵션이 있는 메뉴는 스크롤을 적용할 수 있습니다.
|
|
444
|
+
|
|
445
|
+
```tsx
|
|
446
|
+
<Dropdown>
|
|
447
|
+
<MenuButton variant="outlined" endDecorator={<ExpandMoreIcon />}>
|
|
448
|
+
긴 목록 메뉴
|
|
449
|
+
</MenuButton>
|
|
450
|
+
<Menu sx={{
|
|
451
|
+
maxHeight: 300,
|
|
452
|
+
overflow: 'auto'
|
|
453
|
+
}}>
|
|
454
|
+
{Array.from({
|
|
455
|
+
length: 20
|
|
456
|
+
}, (_, index) => <MenuItem key={index}>옵션 {index + 1}</MenuItem>)}
|
|
457
|
+
</Menu>
|
|
458
|
+
</Dropdown>
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### Custom Styling
|
|
462
|
+
|
|
463
|
+
CSS 스타일을 이용해 드롭다운을 커스터마이징할 수 있습니다.
|
|
464
|
+
|
|
465
|
+
```tsx
|
|
466
|
+
<Stack direction="row" spacing={2}>
|
|
467
|
+
<Dropdown>
|
|
468
|
+
<MenuButton variant="soft" color="primary" endDecorator={<ExpandMoreIcon />} sx={{
|
|
469
|
+
borderRadius: 'xl',
|
|
470
|
+
fontWeight: 'bold'
|
|
471
|
+
}}>
|
|
472
|
+
커스텀 버튼
|
|
473
|
+
</MenuButton>
|
|
474
|
+
<Menu sx={{
|
|
475
|
+
borderRadius: 'md',
|
|
476
|
+
boxShadow: 'lg',
|
|
477
|
+
border: '2px solid',
|
|
478
|
+
borderColor: 'primary.200'
|
|
479
|
+
}}>
|
|
480
|
+
<MenuItem sx={{
|
|
481
|
+
borderRadius: 'sm',
|
|
482
|
+
mx: 0.5,
|
|
483
|
+
my: 0.25
|
|
484
|
+
}}>둥근 아이템 1</MenuItem>
|
|
485
|
+
<MenuItem sx={{
|
|
486
|
+
borderRadius: 'sm',
|
|
487
|
+
mx: 0.5,
|
|
488
|
+
my: 0.25
|
|
489
|
+
}}>둥근 아이템 2</MenuItem>
|
|
490
|
+
<MenuItem sx={{
|
|
491
|
+
borderRadius: 'sm',
|
|
492
|
+
mx: 0.5,
|
|
493
|
+
my: 0.25
|
|
494
|
+
}}>둥근 아이템 3</MenuItem>
|
|
495
|
+
</Menu>
|
|
496
|
+
</Dropdown>
|
|
497
|
+
|
|
498
|
+
<Dropdown>
|
|
499
|
+
<MenuButton variant="outlined" sx={{
|
|
500
|
+
background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
|
|
501
|
+
border: 0,
|
|
502
|
+
borderRadius: 3,
|
|
503
|
+
color: 'white',
|
|
504
|
+
'&:hover': {
|
|
505
|
+
background: 'linear-gradient(45deg, #FE6B8B 60%, #FF8E53 100%)'
|
|
506
|
+
}
|
|
507
|
+
}}>
|
|
508
|
+
그라데이션 버튼
|
|
509
|
+
</MenuButton>
|
|
510
|
+
<Menu>
|
|
511
|
+
<MenuItem>스타일링된 메뉴</MenuItem>
|
|
512
|
+
<MenuItem>아이템 2</MenuItem>
|
|
513
|
+
</Menu>
|
|
514
|
+
</Dropdown>
|
|
515
|
+
</Stack>
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
## Component Structure
|
|
519
|
+
|
|
520
|
+
Dropdown은 다음 컴포넌트들과 함께 사용됩니다:
|
|
521
|
+
|
|
522
|
+
```tsx
|
|
523
|
+
<Dropdown>
|
|
524
|
+
<MenuButton>트리거 버튼</MenuButton>
|
|
525
|
+
<Menu>
|
|
526
|
+
<MenuItem>메뉴 아이템 1</MenuItem>
|
|
527
|
+
<MenuItem>메뉴 아이템 2</MenuItem>
|
|
528
|
+
<ListDivider /> {/* 구분선 */}
|
|
529
|
+
<MenuItem>메뉴 아이템 3</MenuItem>
|
|
530
|
+
</Menu>
|
|
531
|
+
</Dropdown>
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### MenuButton Props
|
|
535
|
+
|
|
536
|
+
MenuButton 컴포넌트의 주요 props:
|
|
537
|
+
|
|
538
|
+
- `variant`: `'plain' | 'outlined' | 'soft' | 'solid'`
|
|
539
|
+
- `color`: `'primary' | 'neutral' | 'danger' | 'success' | 'warning'`
|
|
540
|
+
- `size`: `'sm' | 'md' | 'lg'`
|
|
541
|
+
- `startDecorator`: 앞쪽에 표시할 요소
|
|
542
|
+
- `endDecorator`: 뒤쪽에 표시할 요소
|
|
543
|
+
- `disabled`: 비활성 상태
|
|
544
|
+
|
|
545
|
+
### Menu Props
|
|
546
|
+
|
|
547
|
+
Menu 컴포넌트의 주요 props:
|
|
548
|
+
|
|
549
|
+
- `placement`: `'top-start' | 'top' | 'top-end' | 'bottom-start' | 'bottom' | 'bottom-end'`
|
|
550
|
+
- `size`: `'sm' | 'md' | 'lg'`
|
|
551
|
+
- `sx`: 스타일 커스터마이징
|
|
552
|
+
|
|
553
|
+
## Common Use Cases
|
|
554
|
+
|
|
555
|
+
### Navigation Menu
|
|
556
|
+
|
|
557
|
+
```tsx
|
|
558
|
+
<Dropdown>
|
|
559
|
+
<MenuButton variant="plain">메뉴</MenuButton>
|
|
560
|
+
<Menu>
|
|
561
|
+
<MenuItem component="a" href="/home">홈</MenuItem>
|
|
562
|
+
<MenuItem component="a" href="/about">회사소개</MenuItem>
|
|
563
|
+
<MenuItem component="a" href="/products">제품</MenuItem>
|
|
564
|
+
<ListDivider />
|
|
565
|
+
<MenuItem component="a" href="/contact">문의하기</MenuItem>
|
|
566
|
+
</Menu>
|
|
567
|
+
</Dropdown>
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### User Profile Menu
|
|
571
|
+
|
|
572
|
+
```tsx
|
|
573
|
+
<Dropdown>
|
|
574
|
+
<MenuButton
|
|
575
|
+
variant="plain"
|
|
576
|
+
startDecorator={<Avatar size="sm" />}
|
|
577
|
+
endDecorator={<ExpandMoreIcon />}
|
|
578
|
+
>
|
|
579
|
+
사용자명
|
|
580
|
+
</MenuButton>
|
|
581
|
+
<Menu>
|
|
582
|
+
<Stack px={2} py={1}>
|
|
583
|
+
<Typography level="title-sm">사용자명</Typography>
|
|
584
|
+
<Typography level="body-xs" color="neutral">
|
|
585
|
+
user@example.com
|
|
586
|
+
</Typography>
|
|
587
|
+
</Stack>
|
|
588
|
+
<ListDivider />
|
|
589
|
+
<MenuItem>프로필</MenuItem>
|
|
590
|
+
<MenuItem>설정</MenuItem>
|
|
591
|
+
<ListDivider />
|
|
592
|
+
<MenuItem>로그아웃</MenuItem>
|
|
593
|
+
</Menu>
|
|
594
|
+
</Dropdown>
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
### Filter Dropdown
|
|
598
|
+
|
|
599
|
+
```tsx
|
|
600
|
+
const [filter, setFilter] = useState('전체');
|
|
601
|
+
|
|
602
|
+
<Dropdown>
|
|
603
|
+
<MenuButton
|
|
604
|
+
variant="outlined"
|
|
605
|
+
startDecorator={<FilterListIcon />}
|
|
606
|
+
endDecorator={<ExpandMoreIcon />}
|
|
607
|
+
>
|
|
608
|
+
필터: {filter}
|
|
609
|
+
</MenuButton>
|
|
610
|
+
<Menu>
|
|
611
|
+
<MenuItem onClick={() => setFilter('전체')}>전체</MenuItem>
|
|
612
|
+
<MenuItem onClick={() => setFilter('활성')}>활성</MenuItem>
|
|
613
|
+
<MenuItem onClick={() => setFilter('비활성')}>비활성</MenuItem>
|
|
614
|
+
</Menu>
|
|
615
|
+
</Dropdown>
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
### Action Menu
|
|
619
|
+
|
|
620
|
+
```tsx
|
|
621
|
+
<Dropdown>
|
|
622
|
+
<MenuButton variant="plain" size="sm">
|
|
623
|
+
작업
|
|
624
|
+
</MenuButton>
|
|
625
|
+
<Menu>
|
|
626
|
+
<MenuItem>
|
|
627
|
+
<EditIcon sx={{ mr: 1 }} />
|
|
628
|
+
편집
|
|
629
|
+
</MenuItem>
|
|
630
|
+
<MenuItem>
|
|
631
|
+
<CopyIcon sx={{ mr: 1 }} />
|
|
632
|
+
복사
|
|
633
|
+
</MenuItem>
|
|
634
|
+
<MenuItem color="danger">
|
|
635
|
+
<DeleteIcon sx={{ mr: 1 }} />
|
|
636
|
+
삭제
|
|
637
|
+
</MenuItem>
|
|
638
|
+
</Menu>
|
|
639
|
+
</Dropdown>
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
### Language Selector
|
|
643
|
+
|
|
644
|
+
```tsx
|
|
645
|
+
const [language, setLanguage] = useState('한국어');
|
|
646
|
+
|
|
647
|
+
<Dropdown>
|
|
648
|
+
<MenuButton variant="soft" size="sm">
|
|
649
|
+
{language}
|
|
650
|
+
</MenuButton>
|
|
651
|
+
<Menu>
|
|
652
|
+
<MenuItem onClick={() => setLanguage('한국어')}>
|
|
653
|
+
한국어
|
|
654
|
+
</MenuItem>
|
|
655
|
+
<MenuItem onClick={() => setLanguage('English')}>
|
|
656
|
+
English
|
|
657
|
+
</MenuItem>
|
|
658
|
+
<MenuItem onClick={() => setLanguage('日本語')}>
|
|
659
|
+
日本語
|
|
660
|
+
</MenuItem>
|
|
661
|
+
</Menu>
|
|
662
|
+
</Dropdown>
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
### Sort Options
|
|
666
|
+
|
|
667
|
+
```tsx
|
|
668
|
+
const [sortBy, setSortBy] = useState('이름순');
|
|
669
|
+
|
|
670
|
+
<Dropdown>
|
|
671
|
+
<MenuButton
|
|
672
|
+
variant="outlined"
|
|
673
|
+
startDecorator={<SortIcon />}
|
|
674
|
+
endDecorator={<ExpandMoreIcon />}
|
|
675
|
+
>
|
|
676
|
+
정렬: {sortBy}
|
|
677
|
+
</MenuButton>
|
|
678
|
+
<Menu>
|
|
679
|
+
<MenuItem onClick={() => setSortBy('이름순')}>이름순</MenuItem>
|
|
680
|
+
<MenuItem onClick={() => setSortBy('날짜순')}>날짜순</MenuItem>
|
|
681
|
+
<MenuItem onClick={() => setSortBy('크기순')}>크기순</MenuItem>
|
|
682
|
+
</Menu>
|
|
683
|
+
</Dropdown>
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
## Best Practices
|
|
687
|
+
|
|
688
|
+
1. **명확한 라벨**: MenuButton의 텍스트는 메뉴의 내용을 명확히 나타내야 합니다.
|
|
689
|
+
|
|
690
|
+
2. **적절한 아이콘 사용**: 드롭다운임을 나타내는 화살표 아이콘을 사용하세요.
|
|
691
|
+
```tsx
|
|
692
|
+
<MenuButton endDecorator={<ExpandMoreIcon />}>
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
3. **메뉴 아이템 그룹화**: 관련된 메뉴 아이템들은 ListDivider로 구분하세요.
|
|
696
|
+
|
|
697
|
+
4. **키보드 접근성**: 키보드 탐색이 가능하도록 적절한 props를 설정하세요.
|
|
698
|
+
|
|
699
|
+
5. **적절한 배치**: 화면 공간을 고려하여 메뉴의 placement를 설정하세요.
|
|
700
|
+
|
|
701
|
+
6. **로딩 상태**: 필요한 경우 MenuButton에 loading 상태를 표시하세요.
|
|
702
|
+
|
|
703
|
+
7. **일관된 스타일**: 애플리케이션 전반에서 일관된 드롭다운 스타일을 유지하세요.
|
|
704
|
+
|
|
705
|
+
8. **모바일 고려**: 모바일에서도 사용하기 쉽도록 충분한 터치 영역을 확보하세요.
|
|
706
|
+
|
|
707
|
+
## Controlled vs Uncontrolled
|
|
708
|
+
|
|
709
|
+
### Uncontrolled (기본)
|
|
710
|
+
|
|
711
|
+
```tsx
|
|
712
|
+
<Dropdown>
|
|
713
|
+
<MenuButton>메뉴</MenuButton>
|
|
714
|
+
<Menu>
|
|
715
|
+
<MenuItem>옵션</MenuItem>
|
|
716
|
+
</Menu>
|
|
717
|
+
</Dropdown>
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
### Controlled
|
|
721
|
+
|
|
722
|
+
```tsx
|
|
723
|
+
const [open, setOpen] = useState(false);
|
|
724
|
+
|
|
725
|
+
<Dropdown
|
|
726
|
+
open={open}
|
|
727
|
+
onOpenChange={(event, isOpen) => setOpen(isOpen)}
|
|
728
|
+
>
|
|
729
|
+
<MenuButton>메뉴</MenuButton>
|
|
730
|
+
<Menu>
|
|
731
|
+
<MenuItem onClick={() => setOpen(false)}>옵션</MenuItem>
|
|
732
|
+
</Menu>
|
|
733
|
+
</Dropdown>
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
## Accessibility
|
|
737
|
+
|
|
738
|
+
Dropdown은 접근성을 위한 기본적인 기능들을 제공합니다:
|
|
739
|
+
|
|
740
|
+
- **키보드 탐색**: Tab, Enter, Escape, 화살표 키 지원
|
|
741
|
+
- **ARIA 속성**: 적절한 ARIA 라벨과 역할 자동 설정
|
|
742
|
+
- **포커스 관리**: 메뉴가 열릴 때 첫 번째 아이템으로 포커스 이동
|
|
743
|
+
- **스크린 리더**: 메뉴의 상태와 옵션들을 적절히 읽어줌
|
|
744
|
+
|
|
745
|
+
추가적인 접근성을 위해:
|
|
746
|
+
|
|
747
|
+
- 메뉴 아이템에 적절한 라벨 제공
|
|
748
|
+
- 위험한 작업(삭제 등)에 대한 확인 절차 제공
|
|
749
|
+
- 색상에만 의존하지 않는 시각적 피드백
|
|
750
|
+
|
|
751
|
+
## When to Use Dropdown
|
|
752
|
+
|
|
753
|
+
### ✅ 사용하기 좋은 경우
|
|
754
|
+
|
|
755
|
+
- **메뉴 시스템**: 네비게이션이나 컨텍스트 메뉴가 필요할 때
|
|
756
|
+
- **필터링**: 여러 옵션 중 하나를 선택하는 필터가 필요할 때
|
|
757
|
+
- **액션 목록**: 특정 항목에 대한 여러 작업이 있을 때
|
|
758
|
+
- **사용자 메뉴**: 프로필, 설정, 로그아웃 등의 사용자 관련 기능
|
|
759
|
+
- **공간 절약**: 화면 공간이 제한적일 때 여러 옵션을 숨기고 싶을 때
|
|
760
|
+
|
|
761
|
+
### ❌ 사용하지 않는 것이 좋은 경우
|
|
762
|
+
|
|
763
|
+
- **단일 액션**: 하나의 간단한 작업만 있을 때는 일반 Button 사용
|
|
764
|
+
- **긴 폼**: 폼에서는 Select 컴포넌트가 더 적절
|
|
765
|
+
- **항상 보여야 하는 옵션**: 중요한 옵션들은 항상 표시하는 것이 좋음
|
|
766
|
+
- **너무 많은 옵션**: 20개 이상의 옵션이 있다면 다른 UI 패턴 고려
|
|
767
|
+
|
|
768
|
+
Dropdown은 사용자에게 깔끔하고 직관적인 메뉴 경험을 제공하는 강력한 컴포넌트입니다. 적절히 사용하면 공간을 효율적으로 활용하면서도 풍부한 기능을 제공할 수 있습니다.
|