@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,39 @@
|
|
|
1
|
+
# Modal
|
|
2
|
+
|
|
3
|
+
## Introduction
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
<Modal aria-labelledby="modal-title" aria-describedby="modal-desc" open sx={{
|
|
7
|
+
display: 'flex',
|
|
8
|
+
justifyContent: 'center',
|
|
9
|
+
alignItems: 'center'
|
|
10
|
+
}}>
|
|
11
|
+
<Sheet variant="outlined" sx={{
|
|
12
|
+
maxWidth: 500,
|
|
13
|
+
borderRadius: 'md',
|
|
14
|
+
p: 3,
|
|
15
|
+
boxShadow: 'lg'
|
|
16
|
+
}}>
|
|
17
|
+
<ModalClose variant="plain" sx={{
|
|
18
|
+
m: 1
|
|
19
|
+
}} />
|
|
20
|
+
<Typography component="h2" id="modal-title" level="h4" textColor="inherit" fontWeight="lg" mb={2}>
|
|
21
|
+
This is the modal title
|
|
22
|
+
</Typography>
|
|
23
|
+
<Typography id="modal-desc" textColor="text.tertiary">
|
|
24
|
+
Make sure to use <code>aria-labelledby</code> on the modal dialog with an optional{' '}
|
|
25
|
+
<code>aria-describedby</code> attribute.
|
|
26
|
+
</Typography>
|
|
27
|
+
</Sheet>
|
|
28
|
+
</Modal>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Field | Description | Default |
|
|
32
|
+
| ---------------------------- | ----------- | ------- |
|
|
33
|
+
| Controls resolved at runtime | — | — |
|
|
34
|
+
|
|
35
|
+
## Usage
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import { Modal } from '@ceed/ads';
|
|
39
|
+
```
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Autocomplete
|
|
2
|
+
|
|
3
|
+
## Introduction
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
<Autocomplete options={['Option1', 'Option2']} />
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
| Field | Description | Default |
|
|
10
|
+
| ------- | ----------- | ------- |
|
|
11
|
+
| label | — | — |
|
|
12
|
+
| loading | — | — |
|
|
13
|
+
|
|
14
|
+
### Sizes
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
<div style={{
|
|
18
|
+
display: 'flex',
|
|
19
|
+
gap: '10px'
|
|
20
|
+
}}>
|
|
21
|
+
<Autocomplete {...args} size="sm" />
|
|
22
|
+
<Autocomplete {...args} size="md" />
|
|
23
|
+
<Autocomplete {...args} size="lg" />
|
|
24
|
+
</div>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Option Groups
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
<Autocomplete
|
|
31
|
+
options={[{
|
|
32
|
+
value: "Diaper: Johnson's baby",
|
|
33
|
+
label: "Johnson's baby",
|
|
34
|
+
startDecorator: <Chip color="success">Active</Chip>
|
|
35
|
+
}, {
|
|
36
|
+
value: 'Diaper: Haggis Magic',
|
|
37
|
+
label: 'Haggis Magic',
|
|
38
|
+
startDecorator: <Chip color="danger">Terminated</Chip>
|
|
39
|
+
}, {
|
|
40
|
+
value: 'Wiki: Wiki How',
|
|
41
|
+
label: 'Wiki How',
|
|
42
|
+
startDecorator: <Chip color="success">Active</Chip>
|
|
43
|
+
}, {
|
|
44
|
+
value: 'Wiki: Wikipedia',
|
|
45
|
+
label: 'Wikipedia',
|
|
46
|
+
startDecorator: <Chip color="danger">Terminated</Chip>
|
|
47
|
+
}]}
|
|
48
|
+
groupBy={(option: any) => option.value.split(':')[0]}
|
|
49
|
+
defaultValue="Wiki: Wiki How"
|
|
50
|
+
/>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### WithCustomOptions
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
<Autocomplete
|
|
57
|
+
options={[{
|
|
58
|
+
value: "Johnson's baby",
|
|
59
|
+
label: "Johnson's baby",
|
|
60
|
+
startDecorator: <Chip color="success">Active</Chip>
|
|
61
|
+
// endDecorator: <Chip color='neutral'>inbound</Chip>,
|
|
62
|
+
}, {
|
|
63
|
+
value: 'Haggis Magic',
|
|
64
|
+
label: 'Haggis Magic',
|
|
65
|
+
startDecorator: <Chip color="danger">Terminated</Chip>
|
|
66
|
+
// endDecorator: <Chip color='neutral'>outbound</Chip>,
|
|
67
|
+
}]}
|
|
68
|
+
value="Johnson's baby"
|
|
69
|
+
/>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Loading
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
<Autocomplete
|
|
76
|
+
options={[]}
|
|
77
|
+
loading
|
|
78
|
+
/>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Controlled
|
|
82
|
+
|
|
83
|
+
```tsx
|
|
84
|
+
<Stack gap={4}>
|
|
85
|
+
<Autocomplete value={value} label="Select a brand" options={[{
|
|
86
|
+
value: "Johnson's baby",
|
|
87
|
+
label: "Johnson's baby",
|
|
88
|
+
startDecorator: <Chip color="success">Active</Chip>,
|
|
89
|
+
endDecorator: <Chip color="neutral">inbound</Chip>
|
|
90
|
+
}, {
|
|
91
|
+
value: 'Haggis Magic',
|
|
92
|
+
label: 'Haggis Magic',
|
|
93
|
+
startDecorator: <Chip color="danger">Terminated</Chip>,
|
|
94
|
+
endDecorator: <Chip color="neutral">outbound</Chip>
|
|
95
|
+
}, {
|
|
96
|
+
value: 'Hogwarts Magic',
|
|
97
|
+
label: 'Hogwarts Magic',
|
|
98
|
+
startDecorator: <Chip color="danger">Magic</Chip>,
|
|
99
|
+
endDecorator: <Chip color="neutral">Muggle</Chip>
|
|
100
|
+
}]} onChange={e => setValue(e.target.value)} />
|
|
101
|
+
<Button onClick={() => setValue("Johnson's baby")}>Set Johnson's baby</Button>
|
|
102
|
+
</Stack>
|
|
103
|
+
```
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
# Button
|
|
2
|
+
|
|
3
|
+
## Introduction
|
|
4
|
+
|
|
5
|
+
Button 컴포넌트는 사용자가 클릭하여 특정 작업을 수행할 수 있는 기본적인 UI 요소입니다. Joy UI의 Button을 기반으로 하며, Framer Motion 애니메이션 지원이 추가되었습니다. 폼 제출, 페이지 이동, 모달 열기/닫기, 데이터 처리 등 다양한 상호작용에 사용됩니다.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<>
|
|
9
|
+
{/* @ts-ignore */}
|
|
10
|
+
<Button {...props} startDecorator={<Add />} />
|
|
11
|
+
<IconButton {...props} aria-label="Add">
|
|
12
|
+
<Add />
|
|
13
|
+
</IconButton>
|
|
14
|
+
</>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
| Field | Description | Default |
|
|
18
|
+
| ------- | ----------- | --------- |
|
|
19
|
+
| color | — | "primary" |
|
|
20
|
+
| size | — | "md" |
|
|
21
|
+
| variant | — | "solid" |
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
import { Button } from '@ceed/ads';
|
|
27
|
+
|
|
28
|
+
function MyComponent() {
|
|
29
|
+
return <Button onClick={() => console.log('클릭됨!')}>클릭하세요</Button>;
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Examples
|
|
34
|
+
|
|
35
|
+
### Basic Usage
|
|
36
|
+
|
|
37
|
+
가장 기본적인 버튼 사용법입니다.
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
<>
|
|
41
|
+
<Button {...props} />
|
|
42
|
+
<Button {...props} disabled />
|
|
43
|
+
<Button {...props} loading />
|
|
44
|
+
</>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Disabled State
|
|
48
|
+
|
|
49
|
+
비활성 상태의 버튼입니다. 사용자가 클릭할 수 없으며 시각적으로도 비활성 상태임을 나타냅니다.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<>
|
|
53
|
+
<Button {...props} startDecorator={<Add />} variant="solid">
|
|
54
|
+
Solid
|
|
55
|
+
</Button>
|
|
56
|
+
<Button {...props} startDecorator={<Add />} variant="soft">
|
|
57
|
+
Soft
|
|
58
|
+
</Button>
|
|
59
|
+
<Button {...props} startDecorator={<Add />} variant="outlined">
|
|
60
|
+
Outlined
|
|
61
|
+
</Button>
|
|
62
|
+
<Button {...props} startDecorator={<Add />} variant="plain">
|
|
63
|
+
Plain
|
|
64
|
+
</Button>
|
|
65
|
+
</>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Loading State
|
|
69
|
+
|
|
70
|
+
로딩 중일 때 사용하는 버튼입니다. 비동기 작업 수행 중에 사용자에게 진행 상태를 알려줍니다.
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
<Button
|
|
74
|
+
children="Button"
|
|
75
|
+
disabled={false}
|
|
76
|
+
loading
|
|
77
|
+
color="primary"
|
|
78
|
+
size="md"
|
|
79
|
+
variant="solid"
|
|
80
|
+
/>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Customization
|
|
84
|
+
|
|
85
|
+
### Variants
|
|
86
|
+
|
|
87
|
+
버튼의 시각적 스타일을 다양하게 변경할 수 있습니다.
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
<>
|
|
91
|
+
<Button {...props} variant="solid">
|
|
92
|
+
Solid
|
|
93
|
+
</Button>
|
|
94
|
+
<Button {...props} variant="soft">
|
|
95
|
+
Soft
|
|
96
|
+
</Button>
|
|
97
|
+
<Button {...props} variant="outlined">
|
|
98
|
+
Outlined
|
|
99
|
+
</Button>
|
|
100
|
+
<Button {...props} variant="plain">
|
|
101
|
+
Plain
|
|
102
|
+
</Button>
|
|
103
|
+
</>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
- **solid**: 강조가 필요한 주요 액션 (기본값)
|
|
107
|
+
- **soft**: 부드러운 배경의 보조 액션
|
|
108
|
+
- **outlined**: 테두리만 있는 중요도가 낮은 액션
|
|
109
|
+
- **plain**: 텍스트만 있는 최소한의 스타일
|
|
110
|
+
|
|
111
|
+
### Sizes
|
|
112
|
+
|
|
113
|
+
버튼의 크기를 조절할 수 있습니다.
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
<>
|
|
117
|
+
<Button {...props} size="sm">
|
|
118
|
+
Small
|
|
119
|
+
</Button>
|
|
120
|
+
<Button {...props} size="md">
|
|
121
|
+
Medium
|
|
122
|
+
</Button>
|
|
123
|
+
<Button {...props} size="lg">
|
|
124
|
+
Large
|
|
125
|
+
</Button>
|
|
126
|
+
</>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
- **sm**: 작은 크기 (제한된 공간에서 사용)
|
|
130
|
+
- **md**: 중간 크기 (기본값)
|
|
131
|
+
- **lg**: 큰 크기 (강조가 필요한 경우)
|
|
132
|
+
|
|
133
|
+
### Colors
|
|
134
|
+
|
|
135
|
+
다양한 색상 테마를 적용할 수 있습니다.
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
<>
|
|
139
|
+
<Button {...props} color="primary">
|
|
140
|
+
Primary
|
|
141
|
+
</Button>
|
|
142
|
+
<Button {...props} color="neutral">
|
|
143
|
+
Neutral
|
|
144
|
+
</Button>
|
|
145
|
+
<Button {...props} color="danger">
|
|
146
|
+
Danger
|
|
147
|
+
</Button>
|
|
148
|
+
<Button {...props} color="success">
|
|
149
|
+
Success
|
|
150
|
+
</Button>
|
|
151
|
+
<Button {...props} color="warning">
|
|
152
|
+
Warning
|
|
153
|
+
</Button>
|
|
154
|
+
</>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- **primary**: 주요 액션 (기본값)
|
|
158
|
+
- **neutral**: 중립적인 액션
|
|
159
|
+
- **success**: 성공/확인 액션
|
|
160
|
+
- **warning**: 주의가 필요한 액션
|
|
161
|
+
- **danger**: 위험한/삭제 액션
|
|
162
|
+
|
|
163
|
+
### Decorators
|
|
164
|
+
|
|
165
|
+
버튼에 아이콘이나 다른 요소를 추가할 수 있습니다.
|
|
166
|
+
|
|
167
|
+
```tsx
|
|
168
|
+
<>
|
|
169
|
+
<Button {...props} startDecorator={<Add />}>
|
|
170
|
+
Add to cart
|
|
171
|
+
</Button>
|
|
172
|
+
<Button {...props} endDecorator={<Add />} color="success">
|
|
173
|
+
Go to checkout
|
|
174
|
+
</Button>
|
|
175
|
+
</>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Loading Indicator
|
|
179
|
+
|
|
180
|
+
로딩 표시기를 커스터마이징할 수 있습니다.
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
<>
|
|
184
|
+
<Button {...props} loading>
|
|
185
|
+
Default
|
|
186
|
+
</Button>
|
|
187
|
+
<Button {...props} loading loadingIndicator="Loading…">
|
|
188
|
+
Custom
|
|
189
|
+
</Button>
|
|
190
|
+
</>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Loading Position
|
|
194
|
+
|
|
195
|
+
로딩 표시기의 위치를 조절할 수 있습니다.
|
|
196
|
+
|
|
197
|
+
```tsx
|
|
198
|
+
<>
|
|
199
|
+
<Button {...props} loading loadingPosition="start">
|
|
200
|
+
Start
|
|
201
|
+
</Button>
|
|
202
|
+
<Button {...props} loading loadingPosition="end" endDecorator={<Add />}>
|
|
203
|
+
End
|
|
204
|
+
</Button>
|
|
205
|
+
</>
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Common Use Cases
|
|
209
|
+
|
|
210
|
+
### Form Submission
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
<form onSubmit={handleSubmit}>
|
|
214
|
+
<Stack spacing={2}>
|
|
215
|
+
<Input placeholder="이름을 입력하세요" />
|
|
216
|
+
<Input placeholder="이메일을 입력하세요" />
|
|
217
|
+
|
|
218
|
+
<Stack direction="row" spacing={2} justifyContent="flex-end">
|
|
219
|
+
<Button variant="outlined" type="button" onClick={handleCancel}>
|
|
220
|
+
취소
|
|
221
|
+
</Button>
|
|
222
|
+
<Button type="submit" loading={isSubmitting}>
|
|
223
|
+
{isSubmitting ? '저장 중...' : '저장'}
|
|
224
|
+
</Button>
|
|
225
|
+
</Stack>
|
|
226
|
+
</Stack>
|
|
227
|
+
</form>
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Modal Actions
|
|
231
|
+
|
|
232
|
+
```tsx
|
|
233
|
+
<Modal open={open}>
|
|
234
|
+
<ModalDialog>
|
|
235
|
+
<ModalClose />
|
|
236
|
+
<DialogTitle>삭제 확인</DialogTitle>
|
|
237
|
+
<DialogContent>정말로 이 항목을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.</DialogContent>
|
|
238
|
+
|
|
239
|
+
<DialogActions>
|
|
240
|
+
<Button variant="outlined" onClick={handleClose}>
|
|
241
|
+
취소
|
|
242
|
+
</Button>
|
|
243
|
+
<Button color="danger" onClick={handleDelete}>
|
|
244
|
+
삭제
|
|
245
|
+
</Button>
|
|
246
|
+
</DialogActions>
|
|
247
|
+
</ModalDialog>
|
|
248
|
+
</Modal>
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Action Buttons with Icons
|
|
252
|
+
|
|
253
|
+
```tsx
|
|
254
|
+
<Stack direction="row" spacing={2}>
|
|
255
|
+
<Button startDecorator={<AddIcon />}>새로 만들기</Button>
|
|
256
|
+
|
|
257
|
+
<Button variant="outlined" startDecorator={<DownloadIcon />} onClick={handleDownload}>
|
|
258
|
+
다운로드
|
|
259
|
+
</Button>
|
|
260
|
+
|
|
261
|
+
<Button variant="soft" color="success" startDecorator={<ShareIcon />}>
|
|
262
|
+
공유
|
|
263
|
+
</Button>
|
|
264
|
+
</Stack>
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Async Operations
|
|
268
|
+
|
|
269
|
+
```tsx
|
|
270
|
+
function AsyncButton() {
|
|
271
|
+
const [loading, setLoading] = useState(false);
|
|
272
|
+
|
|
273
|
+
const handleAsyncAction = async () => {
|
|
274
|
+
setLoading(true);
|
|
275
|
+
try {
|
|
276
|
+
await api.processData();
|
|
277
|
+
// 성공 처리
|
|
278
|
+
} catch (error) {
|
|
279
|
+
// 에러 처리
|
|
280
|
+
} finally {
|
|
281
|
+
setLoading(false);
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
return (
|
|
286
|
+
<Button loading={loading} onClick={handleAsyncAction} startDecorator={<ProcessIcon />}>
|
|
287
|
+
데이터 처리
|
|
288
|
+
</Button>
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Button Groups
|
|
294
|
+
|
|
295
|
+
```tsx
|
|
296
|
+
<Stack direction="row" spacing={1}>
|
|
297
|
+
<Button variant="soft" size="sm">
|
|
298
|
+
전체
|
|
299
|
+
</Button>
|
|
300
|
+
<Button variant="outlined" size="sm">
|
|
301
|
+
진행중
|
|
302
|
+
</Button>
|
|
303
|
+
<Button variant="outlined" size="sm">
|
|
304
|
+
완료
|
|
305
|
+
</Button>
|
|
306
|
+
</Stack>
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
## Best Practices
|
|
310
|
+
|
|
311
|
+
1. **명확한 라벨**: 버튼의 기능을 명확하게 나타내는 텍스트를 사용하세요.
|
|
312
|
+
|
|
313
|
+
2. **적절한 변형 선택**:
|
|
314
|
+
- 주요 액션: `solid`
|
|
315
|
+
- 보조 액션: `outlined` 또는 `soft`
|
|
316
|
+
- 최소한의 액션: `plain`
|
|
317
|
+
|
|
318
|
+
3. **색상 의미 일관성**:
|
|
319
|
+
- 위험한 작업: `danger`
|
|
320
|
+
- 성공/확인: `success`
|
|
321
|
+
- 주의 필요: `warning`
|
|
322
|
+
|
|
323
|
+
4. **로딩 상태 표시**: 비동기 작업 시 사용자에게 피드백을 제공하세요.
|
|
324
|
+
|
|
325
|
+
5. **접근성**: 적절한 ARIA 라벨과 키보드 탐색을 지원하세요.
|
|
326
|
+
|
|
327
|
+
## Accessibility
|
|
328
|
+
|
|
329
|
+
- 키보드로 접근 가능 (Tab, Space, Enter)
|
|
330
|
+
- 스크린 리더 지원
|
|
331
|
+
- 적절한 색상 대비
|
|
332
|
+
- 비활성 상태에서 포커스 불가
|
|
333
|
+
|
|
334
|
+
Button은 사용자 인터페이스에서 가장 기본적이면서도 중요한 상호작용 요소입니다. 적절한 스타일과 상태 관리를 통해 직관적이고 접근 가능한 사용자 경험을 제공할 수 있습니다.
|