@ceed/ads 1.13.4 → 1.15.0-next.1

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.
Files changed (70) hide show
  1. package/dist/Overview.md +11 -0
  2. package/dist/components/Menu/Menu.d.ts +2 -5
  3. package/dist/components/Stepper/Stepper.d.ts +6 -0
  4. package/dist/components/data-display/Avatar.md +428 -0
  5. package/dist/components/data-display/Badge.md +315 -0
  6. package/dist/components/data-display/Chip.md +301 -0
  7. package/dist/components/data-display/DataTable.md +452 -0
  8. package/dist/components/data-display/InfoSign.md +160 -0
  9. package/dist/components/data-display/Markdown.md +17 -0
  10. package/dist/components/data-display/Table.md +1330 -0
  11. package/dist/components/data-display/Tooltip.md +444 -0
  12. package/dist/components/data-display/Typography.md +271 -0
  13. package/dist/components/data-display/llms.txt +17 -0
  14. package/dist/components/feedback/Alert.md +663 -0
  15. package/dist/components/feedback/Dialog.md +33 -0
  16. package/dist/components/feedback/Modal.md +39 -0
  17. package/dist/components/feedback/llms.txt +11 -0
  18. package/dist/components/inputs/Autocomplete.md +103 -0
  19. package/dist/components/inputs/Button.md +334 -0
  20. package/dist/components/inputs/ButtonGroup.md +382 -0
  21. package/dist/components/inputs/Calendar.md +19 -0
  22. package/dist/components/inputs/Checkbox.md +649 -0
  23. package/dist/components/inputs/CurrencyInput.md +91 -0
  24. package/dist/components/inputs/DatePicker.md +67 -0
  25. package/dist/components/inputs/DateRangePicker.md +55 -0
  26. package/dist/components/inputs/FilterMenu.md +210 -0
  27. package/dist/components/inputs/IconButton.md +361 -0
  28. package/dist/components/inputs/Input.md +283 -0
  29. package/dist/components/inputs/MonthPicker.md +72 -0
  30. package/dist/components/inputs/MonthRangePicker.md +70 -0
  31. package/dist/components/inputs/PercentageInput.md +116 -0
  32. package/dist/components/inputs/RadioButton.md +350 -0
  33. package/dist/components/inputs/RadioTileGroup.md +418 -0
  34. package/dist/components/inputs/Select.md +56 -0
  35. package/dist/components/inputs/Switch.md +577 -0
  36. package/dist/components/inputs/Textarea.md +64 -0
  37. package/dist/components/inputs/Uploader/Uploader.md +238 -0
  38. package/dist/components/inputs/Uploader/llms.txt +9 -0
  39. package/dist/components/inputs/llms.txt +31 -0
  40. package/dist/components/layout/Box.md +997 -0
  41. package/dist/components/layout/Container.md +23 -0
  42. package/dist/components/layout/Grid.md +728 -0
  43. package/dist/components/layout/Stack.md +937 -0
  44. package/dist/components/layout/llms.txt +12 -0
  45. package/dist/components/llms.txt +14 -0
  46. package/dist/components/navigation/Breadcrumbs.md +51 -0
  47. package/dist/components/navigation/Dropdown.md +768 -0
  48. package/dist/components/navigation/IconMenuButton.md +35 -0
  49. package/dist/components/navigation/InsetDrawer.md +133 -0
  50. package/dist/components/navigation/Link.md +24 -0
  51. package/dist/components/navigation/Menu.md +957 -0
  52. package/dist/components/navigation/MenuButton.md +39 -0
  53. package/dist/components/navigation/NavigationGroup.md +17 -0
  54. package/dist/components/navigation/NavigationItem.md +17 -0
  55. package/dist/components/navigation/Navigator.md +17 -0
  56. package/dist/components/navigation/Pagination.md +17 -0
  57. package/dist/components/navigation/ProfileMenu.md +34 -0
  58. package/dist/components/navigation/Stepper.md +108 -0
  59. package/dist/components/navigation/Tabs.md +34 -0
  60. package/dist/components/navigation/llms.txt +22 -0
  61. package/dist/components/surfaces/Accordions.md +96 -0
  62. package/dist/components/surfaces/Card.md +786 -0
  63. package/dist/components/surfaces/Divider.md +762 -0
  64. package/dist/components/surfaces/Sheet.md +900 -0
  65. package/dist/components/surfaces/llms.txt +12 -0
  66. package/dist/index.cjs +22 -10
  67. package/dist/index.js +22 -10
  68. package/dist/llms.txt +75 -0
  69. package/framer/index.js +36 -36
  70. package/package.json +8 -4
@@ -0,0 +1,957 @@
1
+ # Menu
2
+
3
+ ## Introduction
4
+
5
+ Menu와 MenuItem 컴포넌트는 드롭다운 메뉴의 콘텐츠를 구성하는 컴포넌트입니다. Joy UI의 Menu와 MenuItem을 기반으로 합니다.. Dropdown 컴포넌트와 함께 사용하여 사용자에게 선택 가능한 옵션들을 제공합니다. 네비게이션, 액션 메뉴, 컨텍스트 메뉴 등 다양한 용도로 활용할 수 있습니다.
6
+
7
+ ```tsx
8
+ <Box sx={{
9
+ p: 2
10
+ }}>
11
+ <Dropdown>
12
+ <MenuButton variant="outlined">메뉴 열기</MenuButton>
13
+ <Menu>
14
+ <MenuItem>첫 번째 옵션</MenuItem>
15
+ <MenuItem>두 번째 옵션</MenuItem>
16
+ <MenuItem>세 번째 옵션</MenuItem>
17
+ </Menu>
18
+ </Dropdown>
19
+ </Box>
20
+ ```
21
+
22
+ | Field | Description | Default |
23
+ | ---------------------------- | ----------- | ------- |
24
+ | Controls resolved at runtime | — | — |
25
+
26
+ ## Usage
27
+
28
+ ```tsx
29
+ import { Dropdown, MenuButton, Menu, MenuItem } from '@ceed/ads';
30
+
31
+ function MyComponent() {
32
+ return (
33
+ <Dropdown>
34
+ <MenuButton>메뉴 열기</MenuButton>
35
+ <Menu>
36
+ <MenuItem>옵션 1</MenuItem>
37
+ <MenuItem>옵션 2</MenuItem>
38
+ <MenuItem>옵션 3</MenuItem>
39
+ </Menu>
40
+ </Dropdown>
41
+ );
42
+ }
43
+ ```
44
+
45
+ ## Examples
46
+
47
+ ### Basic Menu
48
+
49
+ 가장 기본적인 Menu 사용법입니다.
50
+
51
+ ```tsx
52
+ <Stack direction="row" spacing={3}>
53
+ <Dropdown>
54
+ <MenuButton variant="outlined">기본 메뉴</MenuButton>
55
+ <Menu>
56
+ <MenuItem>홈</MenuItem>
57
+ <MenuItem>제품</MenuItem>
58
+ <MenuItem>서비스</MenuItem>
59
+ <MenuItem>문의</MenuItem>
60
+ </Menu>
61
+ </Dropdown>
62
+
63
+ <Dropdown>
64
+ <MenuButton variant="soft">구분선 포함</MenuButton>
65
+ <Menu>
66
+ <MenuItem>새 파일</MenuItem>
67
+ <MenuItem>열기</MenuItem>
68
+ <ListDivider />
69
+ <MenuItem>저장</MenuItem>
70
+ <MenuItem>다른 이름으로 저장</MenuItem>
71
+ <ListDivider />
72
+ <MenuItem>종료</MenuItem>
73
+ </Menu>
74
+ </Dropdown>
75
+ </Stack>
76
+ ```
77
+
78
+ ### Menu Sizes
79
+
80
+ 다양한 크기의 메뉴를 사용할 수 있습니다.
81
+
82
+ ```tsx
83
+ <Stack direction="row" spacing={3}>
84
+ <Dropdown>
85
+ <MenuButton size="sm" variant="outlined">
86
+ Small Menu
87
+ </MenuButton>
88
+ <Menu size="sm">
89
+ <MenuItem>작은 아이템 1</MenuItem>
90
+ <MenuItem>작은 아이템 2</MenuItem>
91
+ <MenuItem>작은 아이템 3</MenuItem>
92
+ </Menu>
93
+ </Dropdown>
94
+
95
+ <Dropdown>
96
+ <MenuButton size="md" variant="outlined">
97
+ Medium Menu
98
+ </MenuButton>
99
+ <Menu size="md">
100
+ <MenuItem>중간 아이템 1</MenuItem>
101
+ <MenuItem>중간 아이템 2</MenuItem>
102
+ <MenuItem>중간 아이템 3</MenuItem>
103
+ </Menu>
104
+ </Dropdown>
105
+
106
+ <Dropdown>
107
+ <MenuButton size="lg" variant="outlined">
108
+ Large Menu
109
+ </MenuButton>
110
+ <Menu size="lg">
111
+ <MenuItem>큰 아이템 1</MenuItem>
112
+ <MenuItem>큰 아이템 2</MenuItem>
113
+ <MenuItem>큰 아이템 3</MenuItem>
114
+ </Menu>
115
+ </Dropdown>
116
+ </Stack>
117
+ ```
118
+
119
+ ### MenuItem States
120
+
121
+ MenuItem의 다양한 상태를 표현할 수 있습니다.
122
+
123
+ ```tsx
124
+ <Dropdown>
125
+ <MenuButton variant="outlined">다양한 상태</MenuButton>
126
+ <Menu>
127
+ <MenuItem>일반 아이템</MenuItem>
128
+ <MenuItem selected>선택된 아이템</MenuItem>
129
+ <MenuItem disabled>비활성 아이템</MenuItem>
130
+ <MenuItem color="primary">Primary 색상</MenuItem>
131
+ <MenuItem color="danger">Danger 색상</MenuItem>
132
+ <MenuItem color="success">Success 색상</MenuItem>
133
+ <MenuItem color="warning">Warning 색상</MenuItem>
134
+ </Menu>
135
+ </Dropdown>
136
+ ```
137
+
138
+ ### MenuItem with Icons
139
+
140
+ 메뉴 아이템에 아이콘을 추가할 수 있습니다.
141
+
142
+ ```tsx
143
+ <Dropdown>
144
+ <MenuButton variant="outlined" startDecorator={<PersonIcon />} endDecorator={<ExpandMoreIcon />}>
145
+ 아이콘 메뉴
146
+ </MenuButton>
147
+ <Menu>
148
+ <MenuItem>
149
+ <PersonIcon sx={{
150
+ mr: 1.5,
151
+ fontSize: 'lg'
152
+ }} />
153
+ 프로필 보기
154
+ </MenuItem>
155
+ <MenuItem>
156
+ <SettingsIcon sx={{
157
+ mr: 1.5,
158
+ fontSize: 'lg'
159
+ }} />
160
+ 설정
161
+ </MenuItem>
162
+ <MenuItem>
163
+ <BookmarkIcon sx={{
164
+ mr: 1.5,
165
+ fontSize: 'lg'
166
+ }} />
167
+ 북마크
168
+ </MenuItem>
169
+ <ListDivider />
170
+ <MenuItem>
171
+ <LogoutIcon sx={{
172
+ mr: 1.5,
173
+ fontSize: 'lg'
174
+ }} />
175
+ 로그아웃
176
+ </MenuItem>
177
+ </Menu>
178
+ </Dropdown>
179
+ ```
180
+
181
+ ### Actions Menu
182
+
183
+ 편집, 삭제 등의 액션 메뉴로 활용할 수 있습니다.
184
+
185
+ ```tsx
186
+ <Dropdown>
187
+ <MenuButton variant="plain" size="sm">
188
+ 작업
189
+ </MenuButton>
190
+ <Menu>
191
+ <MenuItem>
192
+ <EditIcon sx={{
193
+ mr: 1,
194
+ fontSize: 'md'
195
+ }} />
196
+ 편집
197
+ </MenuItem>
198
+ <MenuItem>
199
+ <CopyIcon sx={{
200
+ mr: 1,
201
+ fontSize: 'md'
202
+ }} />
203
+ 복사
204
+ </MenuItem>
205
+ <MenuItem>
206
+ <ShareIcon sx={{
207
+ mr: 1,
208
+ fontSize: 'md'
209
+ }} />
210
+ 공유
211
+ </MenuItem>
212
+ <ListDivider />
213
+ <MenuItem color="danger">
214
+ <DeleteIcon sx={{
215
+ mr: 1,
216
+ fontSize: 'md'
217
+ }} />
218
+ <Typography color="danger">삭제</Typography>
219
+ </MenuItem>
220
+ </Menu>
221
+ </Dropdown>
222
+ ```
223
+
224
+ ### Clickable Menu Items
225
+
226
+ 메뉴 아이템에 클릭 이벤트를 연결할 수 있습니다.
227
+
228
+ ```tsx
229
+ <Stack spacing={2}>
230
+ <Typography level="body-sm">상태: {message}</Typography>
231
+
232
+ <Dropdown>
233
+ <MenuButton variant="outlined">클릭 이벤트</MenuButton>
234
+ <Menu>
235
+ <MenuItem onClick={() => setMessage('홈을 클릭했습니다')}>홈</MenuItem>
236
+ <MenuItem onClick={() => setMessage('프로필을 클릭했습니다')}>프로필</MenuItem>
237
+ <MenuItem onClick={() => setMessage('설정을 클릭했습니다')}>설정</MenuItem>
238
+ </Menu>
239
+ </Dropdown>
240
+ </Stack>
241
+ ```
242
+
243
+ ### Menu as Links
244
+
245
+ 메뉴 아이템을 링크로 사용할 수 있습니다.
246
+
247
+ ```tsx
248
+ <Dropdown>
249
+ <MenuButton variant="outlined">링크 메뉴</MenuButton>
250
+ <Menu>
251
+ <MenuItem component="a" href="#home">
252
+ 홈 (링크)
253
+ </MenuItem>
254
+ <MenuItem component="a" href="#about">
255
+ 회사소개 (링크)
256
+ </MenuItem>
257
+ <MenuItem component="a" href="#products">
258
+ 제품 (링크)
259
+ </MenuItem>
260
+ <MenuItem component="a" href="https://example.com" target="_blank" rel="noopener noreferrer">
261
+ 외부 링크
262
+ </MenuItem>
263
+ </Menu>
264
+ </Dropdown>
265
+ ```
266
+
267
+ ### Profile Menu
268
+
269
+ 사용자 프로필 메뉴의 완성된 예제입니다.
270
+
271
+ ```tsx
272
+ <Dropdown>
273
+ <MenuButton variant="plain" color="neutral" startDecorator={<Avatar size="sm" variant="soft" color="primary">
274
+
275
+ </Avatar>} endDecorator={<ExpandMoreIcon />} sx={{
276
+ gap: 1,
277
+ padding: 1
278
+ }}>
279
+ 김철수
280
+ </MenuButton>
281
+ <Menu sx={{
282
+ minWidth: 240
283
+ }}>
284
+ {/* 사용자 정보 헤더 */}
285
+ <Box sx={{
286
+ px: 2,
287
+ py: 1.5,
288
+ borderBottom: '1px solid',
289
+ borderColor: 'divider'
290
+ }}>
291
+ <Stack direction="row" spacing={2} alignItems="center">
292
+ <Avatar size="md" variant="soft" color="primary">
293
+ 김철수
294
+ </Avatar>
295
+ <Stack spacing={0}>
296
+ <Typography level="title-sm" fontWeight="bold">
297
+ 김철수
298
+ </Typography>
299
+ <Typography level="body-xs" color="neutral">
300
+ kim@example.com
301
+ </Typography>
302
+ </Stack>
303
+ </Stack>
304
+ </Box>
305
+
306
+ {/* 메뉴 항목들 */}
307
+ <MenuItem>
308
+ <PersonIcon sx={{
309
+ mr: 1.5
310
+ }} />내 프로필
311
+ </MenuItem>
312
+ <MenuItem>
313
+ <BookmarkIcon sx={{
314
+ mr: 1.5
315
+ }} />
316
+ 저장된 항목
317
+ </MenuItem>
318
+ <MenuItem>
319
+ <SettingsIcon sx={{
320
+ mr: 1.5
321
+ }} />
322
+ 계정 설정
323
+ </MenuItem>
324
+
325
+ <ListDivider />
326
+
327
+ <MenuItem>
328
+ <LogoutIcon sx={{
329
+ mr: 1.5
330
+ }} />
331
+ 로그아웃
332
+ </MenuItem>
333
+ </Menu>
334
+ </Dropdown>
335
+ ```
336
+
337
+ ### Menu Placements
338
+
339
+ 메뉴가 나타나는 위치를 다양하게 설정할 수 있습니다.
340
+
341
+ ```tsx
342
+ <Stack spacing={4} alignItems="center" sx={{
343
+ mt: 6,
344
+ mb: 6
345
+ }}>
346
+ <Stack direction="row" spacing={2}>
347
+ <Dropdown>
348
+ <MenuButton variant="outlined">Top Start</MenuButton>
349
+ <Menu placement="top-start">
350
+ <MenuItem>위쪽 시작</MenuItem>
351
+ <MenuItem>옵션 2</MenuItem>
352
+ <MenuItem>옵션 3</MenuItem>
353
+ </Menu>
354
+ </Dropdown>
355
+
356
+ <Dropdown>
357
+ <MenuButton variant="outlined">Top</MenuButton>
358
+ <Menu placement="top">
359
+ <MenuItem>위쪽 중앙</MenuItem>
360
+ <MenuItem>옵션 2</MenuItem>
361
+ <MenuItem>옵션 3</MenuItem>
362
+ </Menu>
363
+ </Dropdown>
364
+
365
+ <Dropdown>
366
+ <MenuButton variant="outlined">Top End</MenuButton>
367
+ <Menu placement="top-end">
368
+ <MenuItem>위쪽 끝</MenuItem>
369
+ <MenuItem>옵션 2</MenuItem>
370
+ <MenuItem>옵션 3</MenuItem>
371
+ </Menu>
372
+ </Dropdown>
373
+ </Stack>
374
+
375
+ <Stack direction="row" spacing={2}>
376
+ <Dropdown>
377
+ <MenuButton variant="outlined">Bottom Start</MenuButton>
378
+ <Menu placement="bottom-start">
379
+ <MenuItem>아래쪽 시작</MenuItem>
380
+ <MenuItem>옵션 2</MenuItem>
381
+ <MenuItem>옵션 3</MenuItem>
382
+ </Menu>
383
+ </Dropdown>
384
+
385
+ <Dropdown>
386
+ <MenuButton variant="outlined">Bottom</MenuButton>
387
+ <Menu placement="bottom">
388
+ <MenuItem>아래쪽 중앙</MenuItem>
389
+ <MenuItem>옵션 2</MenuItem>
390
+ <MenuItem>옵션 3</MenuItem>
391
+ </Menu>
392
+ </Dropdown>
393
+
394
+ <Dropdown>
395
+ <MenuButton variant="outlined">Bottom End</MenuButton>
396
+ <Menu placement="bottom-end">
397
+ <MenuItem>아래쪽 끝</MenuItem>
398
+ <MenuItem>옵션 2</MenuItem>
399
+ <MenuItem>옵션 3</MenuItem>
400
+ </Menu>
401
+ </Dropdown>
402
+ </Stack>
403
+ </Stack>
404
+ ```
405
+
406
+ ### Long Scrollable Menu
407
+
408
+ 많은 옵션이 있는 메뉴는 스크롤을 적용할 수 있습니다.
409
+
410
+ ```tsx
411
+ <Dropdown>
412
+ <MenuButton variant="outlined">긴 메뉴 (스크롤)</MenuButton>
413
+ <Menu sx={{
414
+ maxHeight: 300,
415
+ overflow: 'auto'
416
+ }}>
417
+ {Array.from({
418
+ length: 30
419
+ }, (_, index) => <MenuItem key={index}>메뉴 항목 {index + 1}</MenuItem>)}
420
+ </Menu>
421
+ </Dropdown>
422
+ ```
423
+
424
+ ### Custom Styled Menu
425
+
426
+ CSS 스타일을 이용해 메뉴를 커스터마이징할 수 있습니다.
427
+
428
+ ```tsx
429
+ <Stack direction="row" spacing={3}>
430
+ <Dropdown>
431
+ <MenuButton variant="soft" color="primary">
432
+ 둥근 메뉴
433
+ </MenuButton>
434
+ <Menu sx={{
435
+ borderRadius: 'lg',
436
+ boxShadow: 'lg',
437
+ border: '2px solid',
438
+ borderColor: 'primary.200',
439
+ p: 0.5
440
+ }}>
441
+ <MenuItem sx={{
442
+ borderRadius: 'md',
443
+ my: 0.25
444
+ }}>둥근 아이템 1</MenuItem>
445
+ <MenuItem sx={{
446
+ borderRadius: 'md',
447
+ my: 0.25
448
+ }}>둥근 아이템 2</MenuItem>
449
+ <MenuItem sx={{
450
+ borderRadius: 'md',
451
+ my: 0.25
452
+ }}>둥근 아이템 3</MenuItem>
453
+ </Menu>
454
+ </Dropdown>
455
+
456
+ <Dropdown>
457
+ <MenuButton variant="outlined">그림자 메뉴</MenuButton>
458
+ <Menu sx={{
459
+ boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
460
+ border: 'none',
461
+ borderRadius: 'xl'
462
+ }}>
463
+ <MenuItem sx={{
464
+ px: 3,
465
+ py: 1.5
466
+ }}>
467
+ <StarIcon sx={{
468
+ mr: 2,
469
+ color: 'warning.500'
470
+ }} />
471
+ 특별한 아이템 1
472
+ </MenuItem>
473
+ <MenuItem sx={{
474
+ px: 3,
475
+ py: 1.5
476
+ }}>
477
+ <StarIcon sx={{
478
+ mr: 2,
479
+ color: 'warning.500'
480
+ }} />
481
+ 특별한 아이템 2
482
+ </MenuItem>
483
+ </Menu>
484
+ </Dropdown>
485
+ </Stack>
486
+ ```
487
+
488
+ ### Menu in Card
489
+
490
+ 카드나 다른 컴포넌트 내에서 메뉴를 사용할 수 있습니다.
491
+
492
+ ```tsx
493
+ <Sheet variant="outlined" sx={{
494
+ maxWidth: 400,
495
+ p: 3,
496
+ borderRadius: 'lg'
497
+ }}>
498
+ <Stack direction="row" justifyContent="space-between" alignItems="flex-start">
499
+ <Stack spacing={1}>
500
+ <Typography level="title-lg">프로젝트 카드</Typography>
501
+ <Typography level="body-sm" color="neutral">
502
+ 이 카드에는 메뉴가 포함되어 있습니다.
503
+ </Typography>
504
+ <Typography level="body-xs" color="neutral">
505
+ 2024.01.15 생성
506
+ </Typography>
507
+ </Stack>
508
+
509
+ <Dropdown>
510
+ <MenuButton variant="plain" color="neutral" size="sm" sx={{
511
+ minHeight: 'auto',
512
+ p: 1
513
+ }}>
514
+
515
+ </MenuButton>
516
+ <Menu placement="bottom-end">
517
+ <MenuItem>
518
+ <EditIcon sx={{
519
+ mr: 1
520
+ }} />
521
+ 편집
522
+ </MenuItem>
523
+ <MenuItem>
524
+ <CopyIcon sx={{
525
+ mr: 1
526
+ }} />
527
+ 복제
528
+ </MenuItem>
529
+ <MenuItem>
530
+ <ShareIcon sx={{
531
+ mr: 1
532
+ }} />
533
+ 공유
534
+ </MenuItem>
535
+ <ListDivider />
536
+ <MenuItem color="danger">
537
+ <DeleteIcon sx={{
538
+ mr: 1
539
+ }} />
540
+ 삭제
541
+ </MenuItem>
542
+ </Menu>
543
+ </Dropdown>
544
+ </Stack>
545
+ </Sheet>
546
+ ```
547
+
548
+ ### Nested Content
549
+
550
+ 메뉴 내에 복잡한 콘텐츠를 구성할 수 있습니다.
551
+
552
+ ```tsx
553
+ <Dropdown>
554
+ <MenuButton variant="outlined">복합 콘텐츠</MenuButton>
555
+ <Menu sx={{
556
+ minWidth: 280
557
+ }}>
558
+ {/* 사용자 정보 섹션 */}
559
+ <Box sx={{
560
+ px: 2,
561
+ py: 2
562
+ }}>
563
+ <Stack direction="row" spacing={2} alignItems="center">
564
+ <Avatar variant="soft" color="primary">
565
+ A
566
+ </Avatar>
567
+ <Stack>
568
+ <Typography level="title-sm">Admin 사용자</Typography>
569
+ <Typography level="body-xs" color="neutral">
570
+ admin@example.com
571
+ </Typography>
572
+ </Stack>
573
+ </Stack>
574
+ </Box>
575
+
576
+ <ListDivider />
577
+
578
+ {/* 일반 메뉴 항목들 */}
579
+ <MenuItem>
580
+ <PersonIcon sx={{
581
+ mr: 1.5
582
+ }} />
583
+ 프로필 관리
584
+ </MenuItem>
585
+ <MenuItem>
586
+ <SettingsIcon sx={{
587
+ mr: 1.5
588
+ }} />
589
+ 시스템 설정
590
+ </MenuItem>
591
+
592
+ <ListDivider />
593
+
594
+ {/* 상태 정보 */}
595
+ <Box sx={{
596
+ px: 2,
597
+ py: 1.5
598
+ }}>
599
+ <Stack spacing={1}>
600
+ <Stack direction="row" justifyContent="space-between">
601
+ <Typography level="body-xs" color="neutral">
602
+ 저장 공간
603
+ </Typography>
604
+ <Typography level="body-xs">75%</Typography>
605
+ </Stack>
606
+ <Box sx={{
607
+ height: 4,
608
+ bgcolor: 'neutral.200',
609
+ borderRadius: 'sm',
610
+ position: 'relative'
611
+ }}>
612
+ <Box sx={{
613
+ width: '75%',
614
+ height: '100%',
615
+ bgcolor: 'primary.500',
616
+ borderRadius: 'sm'
617
+ }} />
618
+ </Box>
619
+ </Stack>
620
+ </Box>
621
+
622
+ <ListDivider />
623
+
624
+ <MenuItem>
625
+ <LogoutIcon sx={{
626
+ mr: 1.5
627
+ }} />
628
+ 로그아웃
629
+ </MenuItem>
630
+ </Menu>
631
+ </Dropdown>
632
+ ```
633
+
634
+ ## Component Structure
635
+
636
+ Menu는 다음과 같은 구조로 구성됩니다:
637
+
638
+ ```tsx
639
+ <Dropdown>
640
+ <MenuButton>트리거</MenuButton>
641
+ <Menu>
642
+ {/* 기본 메뉴 아이템 */}
643
+ <MenuItem>기본 아이템</MenuItem>
644
+
645
+ {/* 아이콘이 있는 메뉴 아이템 */}
646
+ <MenuItem>
647
+ <Icon sx={{ mr: 1 }} />
648
+ 아이콘 아이템
649
+ </MenuItem>
650
+
651
+ {/* 구분선 */}
652
+ <ListDivider />
653
+
654
+ {/* 색상이 있는 메뉴 아이템 */}
655
+ <MenuItem color="danger">위험한 작업</MenuItem>
656
+
657
+ {/* 비활성 메뉴 아이템 */}
658
+ <MenuItem disabled>비활성 아이템</MenuItem>
659
+
660
+ {/* 링크 메뉴 아이템 */}
661
+ <MenuItem component="a" href="/link">
662
+ 링크 아이템
663
+ </MenuItem>
664
+
665
+ {/* 클릭 핸들러가 있는 메뉴 아이템 */}
666
+ <MenuItem onClick={handleClick}>클릭 가능한 아이템</MenuItem>
667
+ </Menu>
668
+ </Dropdown>
669
+ ```
670
+
671
+ ## Common Use Cases
672
+
673
+ ### Navigation Menu
674
+
675
+ ```tsx
676
+ <Dropdown>
677
+ <MenuButton>네비게이션</MenuButton>
678
+ <Menu>
679
+ <MenuItem component="a" href="/home">
680
+
681
+ </MenuItem>
682
+ <MenuItem component="a" href="/products">
683
+ 제품
684
+ </MenuItem>
685
+ <MenuItem component="a" href="/services">
686
+ 서비스
687
+ </MenuItem>
688
+ <ListDivider />
689
+ <MenuItem component="a" href="/contact">
690
+ 문의하기
691
+ </MenuItem>
692
+ </Menu>
693
+ </Dropdown>
694
+ ```
695
+
696
+ ### Action Menu with Icons
697
+
698
+ ```tsx
699
+ <Dropdown>
700
+ <MenuButton variant="plain" size="sm">
701
+ 작업
702
+ </MenuButton>
703
+ <Menu>
704
+ <MenuItem onClick={handleEdit}>
705
+ <EditIcon sx={{ mr: 1 }} />
706
+ 편집
707
+ </MenuItem>
708
+ <MenuItem onClick={handleCopy}>
709
+ <CopyIcon sx={{ mr: 1 }} />
710
+ 복사
711
+ </MenuItem>
712
+ <MenuItem onClick={handleShare}>
713
+ <ShareIcon sx={{ mr: 1 }} />
714
+ 공유
715
+ </MenuItem>
716
+ <ListDivider />
717
+ <MenuItem color="danger" onClick={handleDelete}>
718
+ <DeleteIcon sx={{ mr: 1 }} />
719
+ 삭제
720
+ </MenuItem>
721
+ </Menu>
722
+ </Dropdown>
723
+ ```
724
+
725
+ ### User Profile Menu
726
+
727
+ ```tsx
728
+ <Dropdown>
729
+ <MenuButton startDecorator={<Avatar size="sm" src="/avatar.jpg" />} endDecorator={<ExpandMoreIcon />}>
730
+ 사용자명
731
+ </MenuButton>
732
+ <Menu>
733
+ {/* 프로필 헤더 */}
734
+ <Box sx={{ px: 2, py: 1.5 }}>
735
+ <Typography level="title-sm">사용자명</Typography>
736
+ <Typography level="body-xs" color="neutral">
737
+ user@example.com
738
+ </Typography>
739
+ </Box>
740
+
741
+ <ListDivider />
742
+
743
+ <MenuItem>
744
+ <PersonIcon sx={{ mr: 1 }} />
745
+ 프로필 보기
746
+ </MenuItem>
747
+ <MenuItem>
748
+ <SettingsIcon sx={{ mr: 1 }} />
749
+ 설정
750
+ </MenuItem>
751
+
752
+ <ListDivider />
753
+
754
+ <MenuItem>
755
+ <LogoutIcon sx={{ mr: 1 }} />
756
+ 로그아웃
757
+ </MenuItem>
758
+ </Menu>
759
+ </Dropdown>
760
+ ```
761
+
762
+ ### Filter Menu
763
+
764
+ ```tsx
765
+ const [filter, setFilter] = useState('전체');
766
+
767
+ <Dropdown>
768
+ <MenuButton startDecorator={<FilterListIcon />} endDecorator={<ExpandMoreIcon />}>
769
+ 필터: {filter}
770
+ </MenuButton>
771
+ <Menu>
772
+ <MenuItem selected={filter === '전체'} onClick={() => setFilter('전체')}>
773
+ 전체
774
+ </MenuItem>
775
+ <MenuItem selected={filter === '활성'} onClick={() => setFilter('활성')}>
776
+ 활성
777
+ </MenuItem>
778
+ <MenuItem selected={filter === '비활성'} onClick={() => setFilter('비활성')}>
779
+ 비활성
780
+ </MenuItem>
781
+ </Menu>
782
+ </Dropdown>;
783
+ ```
784
+
785
+ ### Context Menu (Right-click Menu)
786
+
787
+ ```tsx
788
+ const [contextMenu, setContextMenu] = useState(null);
789
+
790
+ const handleContextMenu = (event) => {
791
+ event.preventDefault();
792
+ setContextMenu({
793
+ mouseX: event.clientX - 2,
794
+ mouseY: event.clientY - 4,
795
+ });
796
+ };
797
+
798
+ <div onContextMenu={handleContextMenu}>
799
+ 우클릭 가능한 영역
800
+ {contextMenu && (
801
+ <Menu
802
+ open
803
+ anchorReference="anchorPosition"
804
+ anchorPosition={{
805
+ top: contextMenu.mouseY,
806
+ left: contextMenu.mouseX,
807
+ }}
808
+ onClose={() => setContextMenu(null)}
809
+ >
810
+ <MenuItem>복사</MenuItem>
811
+ <MenuItem>붙여넣기</MenuItem>
812
+ <MenuItem>삭제</MenuItem>
813
+ </Menu>
814
+ )}
815
+ </div>;
816
+ ```
817
+
818
+ ### Submenu Pattern
819
+
820
+ ```tsx
821
+ <Dropdown>
822
+ <MenuButton>파일</MenuButton>
823
+ <Menu>
824
+ <MenuItem>새 파일</MenuItem>
825
+ <MenuItem>열기</MenuItem>
826
+
827
+ {/* 서브메뉴는 별도 Dropdown으로 구현 */}
828
+ <MenuItem>
829
+ 최근 파일
830
+ <Dropdown>
831
+ <MenuButton variant="plain" size="sm" sx={{ ml: 'auto' }}>
832
+
833
+ </MenuButton>
834
+ <Menu placement="right-start">
835
+ <MenuItem>파일1.txt</MenuItem>
836
+ <MenuItem>파일2.txt</MenuItem>
837
+ <MenuItem>파일3.txt</MenuItem>
838
+ </Menu>
839
+ </Dropdown>
840
+ </MenuItem>
841
+
842
+ <ListDivider />
843
+ <MenuItem>저장</MenuItem>
844
+ <MenuItem>종료</MenuItem>
845
+ </Menu>
846
+ </Dropdown>
847
+ ```
848
+
849
+ ## Menu Placement
850
+
851
+ 메뉴의 위치는 `placement` prop으로 조정할 수 있습니다:
852
+
853
+ ```tsx
854
+ <Menu placement="top-start"> {/* 위쪽 왼쪽 정렬 */}
855
+ <Menu placement="top"> {/* 위쪽 중앙 정렬 */}
856
+ <Menu placement="top-end"> {/* 위쪽 오른쪽 정렬 */}
857
+ <Menu placement="bottom-start"> {/* 아래쪽 왼쪽 정렬 (기본값) */}
858
+ <Menu placement="bottom"> {/* 아래쪽 중앙 정렬 */}
859
+ <Menu placement="bottom-end"> {/* 아래쪽 오른쪽 정렬 */}
860
+ ```
861
+
862
+ ## Accessibility
863
+
864
+ Menu 컴포넌트는 다음과 같은 접근성 기능을 제공합니다:
865
+
866
+ ### 키보드 탐색
867
+
868
+ - **Tab**: 메뉴 버튼으로 포커스 이동
869
+ - **Enter/Space**: 메뉴 열기/닫기
870
+ - **↑/↓**: 메뉴 아이템 간 이동
871
+ - **Escape**: 메뉴 닫기
872
+ - **Enter**: 메뉴 아이템 선택
873
+
874
+ ### ARIA 속성
875
+
876
+ - `role="menu"`: 메뉴 역할 정의
877
+ - `role="menuitem"`: 메뉴 아이템 역할 정의
878
+ - `aria-expanded`: 메뉴 열림/닫힘 상태
879
+ - `aria-haspopup`: 팝업 메뉴 존재 표시
880
+
881
+ ### 추가 접근성 고려사항
882
+
883
+ ```tsx
884
+ <MenuItem aria-label="사용자 프로필 편집">
885
+ <EditIcon />
886
+ 편집
887
+ </MenuItem>
888
+
889
+ <MenuItem disabled aria-label="현재 사용할 수 없는 기능">
890
+ 사용 불가
891
+ </MenuItem>
892
+ ```
893
+
894
+ ## Best Practices
895
+
896
+ 1. **명확한 라벨링**: 메뉴 아이템은 명확하고 이해하기 쉬운 텍스트를 사용하세요.
897
+
898
+ 2. **아이콘 일관성**: 아이콘을 사용할 때는 일관된 크기와 스타일을 유지하세요.
899
+
900
+ ```tsx
901
+ <MenuItem>
902
+ <EditIcon sx={{ mr: 1.5, fontSize: 'lg' }} />
903
+ 편집
904
+ </MenuItem>
905
+ ```
906
+
907
+ 3. **논리적 그룹화**: 관련된 메뉴 아이템들은 ListDivider로 구분하세요.
908
+
909
+ 4. **위험한 작업 구분**: 삭제와 같은 위험한 작업은 색상으로 구분하세요.
910
+
911
+ ```tsx
912
+ <MenuItem color="danger">
913
+ <DeleteIcon sx={{ mr: 1 }} />
914
+ 삭제
915
+ </MenuItem>
916
+ ```
917
+
918
+ 5. **적절한 메뉴 크기**: 너무 긴 메뉴는 스크롤을 적용하거나 서브메뉴로 나누세요.
919
+
920
+ ```tsx
921
+ <Menu sx={{ maxHeight: 300, overflow: 'auto' }}>
922
+ ```
923
+
924
+ 6. **상태 피드백**: 선택된 아이템이나 현재 상태를 명확히 표시하세요.
925
+
926
+ 7. **모바일 고려**: 터치 기기에서 사용하기 쉽도록 충분한 터치 영역을 제공하세요.
927
+
928
+ ## Performance Considerations
929
+
930
+ 1. **메뉴 지연 로딩**: 복잡한 메뉴는 필요할 때만 렌더링하세요.
931
+
932
+ 2. **가상화**: 매우 긴 메뉴 목록에는 가상화를 고려하세요.
933
+
934
+ 3. **메모이제이션**: 정적인 메뉴 아이템들은 메모이제이션을 활용하세요.
935
+
936
+ ## Troubleshooting
937
+
938
+ ### 흔한 문제들
939
+
940
+ 1. **메뉴가 화면을 벗어남**
941
+
942
+ ```tsx
943
+ <Menu placement="top-end"> {/* placement 조정 */}
944
+ ```
945
+
946
+ 2. **긴 메뉴 스크롤 문제**
947
+
948
+ ```tsx
949
+ <Menu sx={{ maxHeight: 400, overflow: 'auto' }}>
950
+ ```
951
+
952
+ 3. **모바일에서 터치 영역 부족**
953
+ ```tsx
954
+ <MenuItem sx={{ minHeight: 44 }}> {/* 최소 터치 영역 보장 */}
955
+ ```
956
+
957
+ Menu와 MenuItem은 사용자 친화적이고 접근성이 뛰어난 메뉴 시스템을 구축하는 핵심 컴포넌트입니다. 적절히 활용하면 직관적이고 효율적인 사용자 인터페이스를 만들 수 있습니다.