@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,444 @@
|
|
|
1
|
+
# Tooltip
|
|
2
|
+
|
|
3
|
+
## Introduction
|
|
4
|
+
|
|
5
|
+
Tooltip 컴포넌트는 사용자가 요소에 마우스를 올렸을 때 추가적인 정보나 도움말을 제공하는 오버레이입니다. Joy UI의 Tooltip을 기반으로 하며, 사용자 경험을 향상시키기 위해 간결하고 유용한 정보를 표시하는 데 사용됩니다. 버튼 설명, 아이콘 의미, 잘린 텍스트의 전체 내용 표시 등에 활용됩니다.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Tooltip
|
|
9
|
+
title="I am Tooltip"
|
|
10
|
+
arrow={false}
|
|
11
|
+
children={<Button>Hover me</Button>}
|
|
12
|
+
/>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| Field | Description | Default |
|
|
16
|
+
| -------- | ----------- | --------------------------- |
|
|
17
|
+
| variant | — | — |
|
|
18
|
+
| color | — | — |
|
|
19
|
+
| size | — | — |
|
|
20
|
+
| arrow | — | false |
|
|
21
|
+
| open | — | — |
|
|
22
|
+
| children | — | \<Button>Hover me\</Button> |
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { Tooltip, Button } from '@ceed/ads';
|
|
28
|
+
|
|
29
|
+
function MyComponent() {
|
|
30
|
+
return (
|
|
31
|
+
<Tooltip title="이 버튼을 클릭하면 저장됩니다">
|
|
32
|
+
<Button>저장</Button>
|
|
33
|
+
</Tooltip>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Examples
|
|
39
|
+
|
|
40
|
+
### Basic Usage
|
|
41
|
+
|
|
42
|
+
가장 기본적인 Tooltip 사용법입니다.
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<Tooltip
|
|
46
|
+
title="I am Tooltip"
|
|
47
|
+
arrow={false}
|
|
48
|
+
children={<Button>Hover me</Button>}
|
|
49
|
+
/>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Controlled Tooltip
|
|
53
|
+
|
|
54
|
+
프로그래밍적으로 제어되는 Tooltip입니다.
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
<Tooltip
|
|
58
|
+
title="I am Tooltip"
|
|
59
|
+
arrow={false}
|
|
60
|
+
children={<Button>Hover me</Button>}
|
|
61
|
+
open
|
|
62
|
+
/>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Common Use Cases
|
|
66
|
+
|
|
67
|
+
### Icon Button Descriptions
|
|
68
|
+
|
|
69
|
+
아이콘 버튼의 의미를 설명할 때 사용합니다.
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
<Stack direction="row" spacing={1}>
|
|
73
|
+
<Tooltip title="편집">
|
|
74
|
+
<IconButton size="sm">
|
|
75
|
+
<EditIcon />
|
|
76
|
+
</IconButton>
|
|
77
|
+
</Tooltip>
|
|
78
|
+
|
|
79
|
+
<Tooltip title="삭제">
|
|
80
|
+
<IconButton size="sm" color="danger">
|
|
81
|
+
<DeleteIcon />
|
|
82
|
+
</IconButton>
|
|
83
|
+
</Tooltip>
|
|
84
|
+
|
|
85
|
+
<Tooltip title="공유">
|
|
86
|
+
<IconButton size="sm">
|
|
87
|
+
<ShareIcon />
|
|
88
|
+
</IconButton>
|
|
89
|
+
</Tooltip>
|
|
90
|
+
</Stack>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Truncated Text
|
|
94
|
+
|
|
95
|
+
잘린 텍스트의 전체 내용을 표시할 때 사용합니다.
|
|
96
|
+
|
|
97
|
+
```tsx
|
|
98
|
+
function TruncatedText({ text }: { text: string }) {
|
|
99
|
+
const shouldTruncate = text.length > 50;
|
|
100
|
+
const displayText = shouldTruncate ? `${text.substring(0, 50)}...` : text;
|
|
101
|
+
|
|
102
|
+
const content = (
|
|
103
|
+
<Typography
|
|
104
|
+
level="body-md"
|
|
105
|
+
sx={{
|
|
106
|
+
maxWidth: 300,
|
|
107
|
+
overflow: 'hidden',
|
|
108
|
+
textOverflow: 'ellipsis',
|
|
109
|
+
whiteSpace: 'nowrap',
|
|
110
|
+
}}
|
|
111
|
+
>
|
|
112
|
+
{displayText}
|
|
113
|
+
</Typography>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
return shouldTruncate ? <Tooltip title={text}>{content}</Tooltip> : content;
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Form Field Help
|
|
121
|
+
|
|
122
|
+
폼 필드에 추가 도움말을 제공할 때 사용합니다.
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
<Stack spacing={2}>
|
|
126
|
+
<FormControl>
|
|
127
|
+
<FormLabel>
|
|
128
|
+
비밀번호
|
|
129
|
+
<Tooltip title="최소 8자 이상, 대소문자와 숫자를 포함해야 합니다">
|
|
130
|
+
<IconButton size="sm" variant="plain" color="neutral">
|
|
131
|
+
<InfoIcon />
|
|
132
|
+
</IconButton>
|
|
133
|
+
</Tooltip>
|
|
134
|
+
</FormLabel>
|
|
135
|
+
<Input type="password" />
|
|
136
|
+
</FormControl>
|
|
137
|
+
</Stack>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Status Indicators
|
|
141
|
+
|
|
142
|
+
상태나 진행률 정보를 표시할 때 사용합니다.
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
<Stack direction="row" spacing={2} alignItems="center">
|
|
146
|
+
<Tooltip title="성공적으로 완료됨">
|
|
147
|
+
<Chip color="success" variant="soft">
|
|
148
|
+
<CheckCircleIcon sx={{ mr: 1 }} />
|
|
149
|
+
완료
|
|
150
|
+
</Chip>
|
|
151
|
+
</Tooltip>
|
|
152
|
+
|
|
153
|
+
<Tooltip title="진행 중... 예상 완료 시간: 5분">
|
|
154
|
+
<Chip color="warning" variant="soft">
|
|
155
|
+
<AccessTimeIcon sx={{ mr: 1 }} />
|
|
156
|
+
진행중
|
|
157
|
+
</Chip>
|
|
158
|
+
</Tooltip>
|
|
159
|
+
|
|
160
|
+
<Tooltip title="오류가 발생했습니다. 다시 시도해주세요">
|
|
161
|
+
<Chip color="danger" variant="soft">
|
|
162
|
+
<ErrorIcon sx={{ mr: 1 }} />
|
|
163
|
+
실패
|
|
164
|
+
</Chip>
|
|
165
|
+
</Tooltip>
|
|
166
|
+
</Stack>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Navigation Hints
|
|
170
|
+
|
|
171
|
+
네비게이션 요소에 도움말을 제공할 때 사용합니다.
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
<Stack direction="row" spacing={2}>
|
|
175
|
+
<Tooltip title="홈페이지로 이동">
|
|
176
|
+
<Button variant="plain" startDecorator={<HomeIcon />}>
|
|
177
|
+
홈
|
|
178
|
+
</Button>
|
|
179
|
+
</Tooltip>
|
|
180
|
+
|
|
181
|
+
<Tooltip title="사용자 프로필 및 설정">
|
|
182
|
+
<Button variant="plain" startDecorator={<PersonIcon />}>
|
|
183
|
+
프로필
|
|
184
|
+
</Button>
|
|
185
|
+
</Tooltip>
|
|
186
|
+
|
|
187
|
+
<Tooltip title="알림 및 메시지 확인">
|
|
188
|
+
<Badge badgeContent={3} color="danger">
|
|
189
|
+
<Button variant="plain" startDecorator={<NotificationsIcon />}>
|
|
190
|
+
알림
|
|
191
|
+
</Button>
|
|
192
|
+
</Badge>
|
|
193
|
+
</Tooltip>
|
|
194
|
+
</Stack>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Complex Content
|
|
198
|
+
|
|
199
|
+
복잡한 내용을 가진 Tooltip입니다.
|
|
200
|
+
|
|
201
|
+
```tsx
|
|
202
|
+
<Tooltip
|
|
203
|
+
title={
|
|
204
|
+
<Stack spacing={1} sx={{ maxWidth: 250 }}>
|
|
205
|
+
<Typography level="title-sm">사용자 정보</Typography>
|
|
206
|
+
<Typography level="body-sm">
|
|
207
|
+
이름: 김철수
|
|
208
|
+
<br />
|
|
209
|
+
부서: 개발팀
|
|
210
|
+
<br />
|
|
211
|
+
직급: 선임연구원
|
|
212
|
+
<br />
|
|
213
|
+
연락처: kim@example.com
|
|
214
|
+
</Typography>
|
|
215
|
+
</Stack>
|
|
216
|
+
}
|
|
217
|
+
variant="outlined"
|
|
218
|
+
>
|
|
219
|
+
<Avatar>김</Avatar>
|
|
220
|
+
</Tooltip>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Interactive Elements
|
|
224
|
+
|
|
225
|
+
상호작용이 가능한 요소들과 함께 사용합니다.
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
<Stack direction="row" spacing={2}>
|
|
229
|
+
<Tooltip title="이 기능은 프리미엄 사용자만 이용할 수 있습니다">
|
|
230
|
+
<Button disabled>프리미엄 기능</Button>
|
|
231
|
+
</Tooltip>
|
|
232
|
+
|
|
233
|
+
<Tooltip title="현재 선택됨">
|
|
234
|
+
<Chip variant="solid" color="primary">
|
|
235
|
+
활성 필터
|
|
236
|
+
</Chip>
|
|
237
|
+
</Tooltip>
|
|
238
|
+
|
|
239
|
+
<Tooltip title="클릭하여 정렬 순서 변경">
|
|
240
|
+
<Button variant="plain" endDecorator={<ArrowDropDownIcon />}>
|
|
241
|
+
이름순
|
|
242
|
+
</Button>
|
|
243
|
+
</Tooltip>
|
|
244
|
+
</Stack>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Props and Customization
|
|
248
|
+
|
|
249
|
+
### Title Prop
|
|
250
|
+
|
|
251
|
+
Tooltip에 표시될 내용을 지정합니다.
|
|
252
|
+
|
|
253
|
+
```tsx
|
|
254
|
+
// 간단한 텍스트
|
|
255
|
+
<Tooltip title="간단한 도움말">
|
|
256
|
+
<Button>버튼</Button>
|
|
257
|
+
</Tooltip>
|
|
258
|
+
|
|
259
|
+
// React 요소
|
|
260
|
+
<Tooltip
|
|
261
|
+
title={
|
|
262
|
+
<div>
|
|
263
|
+
<strong>제목</strong><br />
|
|
264
|
+
상세 설명이 들어갑니다.
|
|
265
|
+
</div>
|
|
266
|
+
}
|
|
267
|
+
>
|
|
268
|
+
<Button>버튼</Button>
|
|
269
|
+
</Tooltip>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Placement
|
|
273
|
+
|
|
274
|
+
Tooltip이 나타나는 위치를 조정할 수 있습니다.
|
|
275
|
+
|
|
276
|
+
```tsx
|
|
277
|
+
<Stack direction="row" spacing={2} sx={{ mt: 4 }}>
|
|
278
|
+
<Tooltip title="위쪽" placement="top">
|
|
279
|
+
<Button>Top</Button>
|
|
280
|
+
</Tooltip>
|
|
281
|
+
|
|
282
|
+
<Tooltip title="아래쪽" placement="bottom">
|
|
283
|
+
<Button>Bottom</Button>
|
|
284
|
+
</Tooltip>
|
|
285
|
+
|
|
286
|
+
<Tooltip title="왼쪽" placement="left">
|
|
287
|
+
<Button>Left</Button>
|
|
288
|
+
</Tooltip>
|
|
289
|
+
|
|
290
|
+
<Tooltip title="오른쪽" placement="right">
|
|
291
|
+
<Button>Right</Button>
|
|
292
|
+
</Tooltip>
|
|
293
|
+
</Stack>
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Colors and Variants
|
|
297
|
+
|
|
298
|
+
다양한 색상과 변형을 적용할 수 있습니다.
|
|
299
|
+
|
|
300
|
+
```tsx
|
|
301
|
+
<Stack direction="row" spacing={2}>
|
|
302
|
+
<Tooltip title="Primary 색상" color="primary" variant="solid">
|
|
303
|
+
<Button>Primary</Button>
|
|
304
|
+
</Tooltip>
|
|
305
|
+
|
|
306
|
+
<Tooltip title="Success 색상" color="success" variant="soft">
|
|
307
|
+
<Button>Success</Button>
|
|
308
|
+
</Tooltip>
|
|
309
|
+
|
|
310
|
+
<Tooltip title="Warning 색상" color="warning" variant="outlined">
|
|
311
|
+
<Button>Warning</Button>
|
|
312
|
+
</Tooltip>
|
|
313
|
+
|
|
314
|
+
<Tooltip title="Danger 색상" color="danger" variant="plain">
|
|
315
|
+
<Button>Danger</Button>
|
|
316
|
+
</Tooltip>
|
|
317
|
+
</Stack>
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Arrow
|
|
321
|
+
|
|
322
|
+
화살표를 표시하여 Tooltip이 어느 요소를 가리키는지 명확히 할 수 있습니다.
|
|
323
|
+
|
|
324
|
+
```tsx
|
|
325
|
+
<Stack direction="row" spacing={2}>
|
|
326
|
+
<Tooltip title="화살표 없음" arrow={false}>
|
|
327
|
+
<Button>No Arrow</Button>
|
|
328
|
+
</Tooltip>
|
|
329
|
+
|
|
330
|
+
<Tooltip title="화살표 있음" arrow={true}>
|
|
331
|
+
<Button>With Arrow</Button>
|
|
332
|
+
</Tooltip>
|
|
333
|
+
</Stack>
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Controlled Mode
|
|
337
|
+
|
|
338
|
+
프로그래밍적으로 Tooltip의 표시/숨김을 제어할 수 있습니다.
|
|
339
|
+
|
|
340
|
+
```tsx
|
|
341
|
+
function ControlledTooltip() {
|
|
342
|
+
const [open, setOpen] = useState(false);
|
|
343
|
+
|
|
344
|
+
return (
|
|
345
|
+
<Stack spacing={2}>
|
|
346
|
+
<Tooltip title="이 Tooltip은 버튼으로 제어됩니다" open={open} onClose={() => setOpen(false)}>
|
|
347
|
+
<Button variant="outlined">제어되는 요소</Button>
|
|
348
|
+
</Tooltip>
|
|
349
|
+
|
|
350
|
+
<Button onClick={() => setOpen(!open)}>Tooltip {open ? '숨기기' : '보이기'}</Button>
|
|
351
|
+
</Stack>
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Accessibility
|
|
357
|
+
|
|
358
|
+
Tooltip 컴포넌트는 다음과 같은 접근성 기능을 제공합니다:
|
|
359
|
+
|
|
360
|
+
### ARIA 속성
|
|
361
|
+
|
|
362
|
+
자동으로 적절한 ARIA 속성이 적용됩니다.
|
|
363
|
+
|
|
364
|
+
```tsx
|
|
365
|
+
<Tooltip title="저장 버튼">
|
|
366
|
+
<Button aria-label="문서 저장">
|
|
367
|
+
<SaveIcon />
|
|
368
|
+
</Button>
|
|
369
|
+
</Tooltip>
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### 키보드 지원
|
|
373
|
+
|
|
374
|
+
키보드 사용자도 Tooltip을 사용할 수 있습니다.
|
|
375
|
+
|
|
376
|
+
- **Tab**: 포커스 가능한 요소로 이동
|
|
377
|
+
- **Escape**: 열린 Tooltip 닫기
|
|
378
|
+
|
|
379
|
+
### 터치 기기 지원
|
|
380
|
+
|
|
381
|
+
터치 기기에서도 Tooltip을 사용할 수 있도록 탭 제스처를 지원합니다.
|
|
382
|
+
|
|
383
|
+
```tsx
|
|
384
|
+
<Tooltip title="터치 기기에서도 동작합니다" touchTapDelay={0}>
|
|
385
|
+
<Button>터치 지원</Button>
|
|
386
|
+
</Tooltip>
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## Best Practices
|
|
390
|
+
|
|
391
|
+
1. **간결한 내용**: Tooltip 내용은 간결하고 이해하기 쉽게 작성하세요.
|
|
392
|
+
|
|
393
|
+
```tsx
|
|
394
|
+
// ✅ 좋은 예
|
|
395
|
+
<Tooltip title="삭제">
|
|
396
|
+
<IconButton><DeleteIcon /></IconButton>
|
|
397
|
+
</Tooltip>
|
|
398
|
+
|
|
399
|
+
// ❌ 나쁜 예
|
|
400
|
+
<Tooltip title="이 버튼을 클릭하면 선택된 항목이 영구적으로 삭제되며 복구할 수 없습니다">
|
|
401
|
+
<IconButton><DeleteIcon /></IconButton>
|
|
402
|
+
</Tooltip>
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
2. **중요한 정보는 다른 방법으로**: 핵심적인 정보는 Tooltip에만 의존하지 마세요.
|
|
406
|
+
|
|
407
|
+
3. **적절한 타이밍**: 사용자가 도움이 필요할 때만 표시되도록 하세요.
|
|
408
|
+
|
|
409
|
+
4. **일관된 배치**: 애플리케이션 전체에서 일관된 placement를 사용하세요.
|
|
410
|
+
|
|
411
|
+
5. **성능 고려**: 많은 수의 Tooltip이 있는 페이지에서는 필요시에만 렌더링하세요.
|
|
412
|
+
|
|
413
|
+
```tsx
|
|
414
|
+
// 조건부 Tooltip
|
|
415
|
+
{
|
|
416
|
+
(needsTooltip && (
|
|
417
|
+
<Tooltip title="도움말">
|
|
418
|
+
<Button>버튼</Button>
|
|
419
|
+
</Tooltip>
|
|
420
|
+
)) || <Button>버튼</Button>;
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
6. **모바일 고려**: 모바일 환경에서는 대안적인 정보 제공 방법을 고려하세요.
|
|
425
|
+
|
|
426
|
+
7. **색상 의존 금지**: 색상에만 의존하지 말고 텍스트나 아이콘으로도 정보를 전달하세요.
|
|
427
|
+
|
|
428
|
+
## Performance Considerations
|
|
429
|
+
|
|
430
|
+
1. **지연 렌더링**: 많은 Tooltip이 있는 경우 필요시에만 렌더링하세요.
|
|
431
|
+
|
|
432
|
+
2. **메모이제이션**: 복잡한 title 내용은 메모이제이션을 고려하세요.
|
|
433
|
+
|
|
434
|
+
```tsx
|
|
435
|
+
const tooltipContent = useMemo(() => <ComplexTooltipContent data={data} />, [data]);
|
|
436
|
+
|
|
437
|
+
<Tooltip title={tooltipContent}>
|
|
438
|
+
<Button>복잡한 Tooltip</Button>
|
|
439
|
+
</Tooltip>;
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
3. **이벤트 리스너 최적화**: 커스텀 이벤트 핸들러를 사용할 때는 적절히 정리하세요.
|
|
443
|
+
|
|
444
|
+
Tooltip은 사용자에게 추가적인 맥락과 도움을 제공하는 중요한 UI 컴포넌트입니다. 적절히 사용하면 사용자 경험을 크게 향상시킬 수 있습니다.
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Typography
|
|
2
|
+
|
|
3
|
+
## Introduction
|
|
4
|
+
|
|
5
|
+
Typography 컴포넌트는 텍스트를 표시하기 위한 핵심 컴포넌트입니다. Joy UI의 Typography를 기반으로 하며, 다양한 텍스트 레벨과 스타일을 제공합니다. 제목, 본문, 라벨 등 모든 텍스트 요소에 일관된 타이포그래피를 적용할 수 있습니다.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Typography children="Typography" />
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
| Field | Description | Default |
|
|
12
|
+
| ----- | ----------- | ------- |
|
|
13
|
+
| level | — | — |
|
|
14
|
+
| color | — | — |
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { Typography } from '@ceed/ads';
|
|
20
|
+
|
|
21
|
+
function MyComponent() {
|
|
22
|
+
return (
|
|
23
|
+
<div>
|
|
24
|
+
<Typography level="h1">메인 제목</Typography>
|
|
25
|
+
<Typography level="body-md">본문 텍스트입니다.</Typography>
|
|
26
|
+
<Typography level="body-sm" color="neutral">
|
|
27
|
+
보조 설명 텍스트입니다.
|
|
28
|
+
</Typography>
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Typography Levels
|
|
35
|
+
|
|
36
|
+
### Headings
|
|
37
|
+
|
|
38
|
+
제목을 위한 레벨들입니다. 페이지 구조를 명확하게 나타내는 데 사용됩니다.
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
<Typography level="h1">H1 - 페이지 메인 제목</Typography>
|
|
42
|
+
<Typography level="h2">H2 - 섹션 제목</Typography>
|
|
43
|
+
<Typography level="h3">H3 - 하위 섹션 제목</Typography>
|
|
44
|
+
<Typography level="h4">H4 - 세부 제목</Typography>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Titles
|
|
48
|
+
|
|
49
|
+
중요한 제목이나 강조할 텍스트에 사용됩니다.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<Typography level="title-lg">Large Title</Typography>
|
|
53
|
+
<Typography level="title-md">Medium Title</Typography>
|
|
54
|
+
<Typography level="title-sm">Small Title</Typography>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Body Text
|
|
58
|
+
|
|
59
|
+
본문 텍스트를 위한 레벨들입니다. 대부분의 읽기 내용에 사용됩니다.
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
<Typography level="body-lg">큰 본문 텍스트</Typography>
|
|
63
|
+
<Typography level="body-md">일반 본문 텍스트</Typography>
|
|
64
|
+
<Typography level="body-sm">작은 본문 텍스트</Typography>
|
|
65
|
+
<Typography level="body-xs">매우 작은 텍스트</Typography>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Common Use Cases
|
|
69
|
+
|
|
70
|
+
### Page Structure
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
function ArticlePage() {
|
|
74
|
+
return (
|
|
75
|
+
<article>
|
|
76
|
+
<Typography level="h1" sx={{ mb: 2 }}>
|
|
77
|
+
기사 제목
|
|
78
|
+
</Typography>
|
|
79
|
+
|
|
80
|
+
<Typography level="body-sm" color="neutral" sx={{ mb: 3 }}>
|
|
81
|
+
2024년 1월 15일 · 김철수 작성
|
|
82
|
+
</Typography>
|
|
83
|
+
|
|
84
|
+
<Typography level="body-md" sx={{ mb: 2 }}>
|
|
85
|
+
기사의 본문 내용이 여기에 들어갑니다. 이 텍스트는 읽기 쉬운
|
|
86
|
+
크기와 줄 간격을 가지고 있습니다.
|
|
87
|
+
</Typography>
|
|
88
|
+
|
|
89
|
+
<Typography level="h2" sx={{ mt: 4, mb: 2 }}>
|
|
90
|
+
섹션 제목
|
|
91
|
+
</Typography>
|
|
92
|
+
|
|
93
|
+
<Typography level="body-md">
|
|
94
|
+
섹션의 내용이 계속됩니다.
|
|
95
|
+
</Typography>
|
|
96
|
+
</article>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Card Content
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<Card>
|
|
105
|
+
<CardContent>
|
|
106
|
+
<Typography level="title-md" sx={{ mb: 1 }}>
|
|
107
|
+
제품명
|
|
108
|
+
</Typography>
|
|
109
|
+
|
|
110
|
+
<Typography level="body-sm" color="neutral" sx={{ mb: 2 }}>
|
|
111
|
+
카테고리: 전자제품
|
|
112
|
+
</Typography>
|
|
113
|
+
|
|
114
|
+
<Typography level="body-md" sx={{ mb: 2 }}>
|
|
115
|
+
제품에 대한 상세 설명이 여기에 들어갑니다.
|
|
116
|
+
</Typography>
|
|
117
|
+
|
|
118
|
+
<Typography level="title-lg" color="primary">
|
|
119
|
+
₩199,000
|
|
120
|
+
</Typography>
|
|
121
|
+
</CardContent>
|
|
122
|
+
</Card>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Form Labels and Help Text
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
<Stack spacing={2}>
|
|
129
|
+
<FormControl>
|
|
130
|
+
<Typography level="title-sm" component="label">
|
|
131
|
+
사용자 이름
|
|
132
|
+
</Typography>
|
|
133
|
+
<Input placeholder="이름을 입력하세요" />
|
|
134
|
+
<Typography level="body-xs" color="neutral">
|
|
135
|
+
실명으로 입력해 주세요.
|
|
136
|
+
</Typography>
|
|
137
|
+
</FormControl>
|
|
138
|
+
|
|
139
|
+
<FormControl error>
|
|
140
|
+
<Typography level="title-sm" component="label">
|
|
141
|
+
이메일 주소
|
|
142
|
+
</Typography>
|
|
143
|
+
<Input placeholder="email@example.com" />
|
|
144
|
+
<Typography level="body-xs" color="danger">
|
|
145
|
+
올바른 이메일 형식이 아닙니다.
|
|
146
|
+
</Typography>
|
|
147
|
+
</FormControl>
|
|
148
|
+
</Stack>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Status and Indicators
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
<Stack spacing={2}>
|
|
155
|
+
<Box>
|
|
156
|
+
<Typography level="body-md">서버 상태:</Typography>
|
|
157
|
+
<Typography level="body-md" color="success">
|
|
158
|
+
정상 운영 중
|
|
159
|
+
</Typography>
|
|
160
|
+
</Box>
|
|
161
|
+
|
|
162
|
+
<Box>
|
|
163
|
+
<Typography level="body-md">마지막 업데이트:</Typography>
|
|
164
|
+
<Typography level="body-sm" color="neutral">
|
|
165
|
+
2분 전
|
|
166
|
+
</Typography>
|
|
167
|
+
</Box>
|
|
168
|
+
</Stack>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### List Content
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
<Stack spacing={1}>
|
|
175
|
+
<Typography level="title-md">할 일 목록</Typography>
|
|
176
|
+
|
|
177
|
+
{todoItems.map((item) => (
|
|
178
|
+
<Box key={item.id} sx={{ pl: 2 }}>
|
|
179
|
+
<Typography
|
|
180
|
+
level="body-md"
|
|
181
|
+
sx={{
|
|
182
|
+
textDecoration: item.completed ? 'line-through' : 'none',
|
|
183
|
+
color: item.completed ? 'neutral.500' : 'text.primary'
|
|
184
|
+
}}
|
|
185
|
+
>
|
|
186
|
+
{item.text}
|
|
187
|
+
</Typography>
|
|
188
|
+
<Typography level="body-xs" color="neutral">
|
|
189
|
+
{item.dueDate}
|
|
190
|
+
</Typography>
|
|
191
|
+
</Box>
|
|
192
|
+
))}
|
|
193
|
+
</Stack>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Colors
|
|
197
|
+
|
|
198
|
+
Typography는 다양한 색상을 지원합니다:
|
|
199
|
+
|
|
200
|
+
```tsx
|
|
201
|
+
<Stack spacing={1}>
|
|
202
|
+
<Typography color="primary">Primary 색상</Typography>
|
|
203
|
+
<Typography color="neutral">Neutral 색상</Typography>
|
|
204
|
+
<Typography color="danger">Danger 색상</Typography>
|
|
205
|
+
<Typography color="success">Success 색상</Typography>
|
|
206
|
+
<Typography color="warning">Warning 색상</Typography>
|
|
207
|
+
</Stack>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Component Prop
|
|
211
|
+
|
|
212
|
+
다른 HTML 요소나 React 컴포넌트로 렌더링할 수 있습니다:
|
|
213
|
+
|
|
214
|
+
```tsx
|
|
215
|
+
<Typography level="h1" component="h2">
|
|
216
|
+
h2 태그로 렌더링되는 h1 스타일
|
|
217
|
+
</Typography>
|
|
218
|
+
|
|
219
|
+
<Typography level="body-md" component="span">
|
|
220
|
+
인라인 텍스트
|
|
221
|
+
</Typography>
|
|
222
|
+
|
|
223
|
+
<Typography level="title-md" component={Link} href="/page">
|
|
224
|
+
링크 컴포넌트로 렌더링
|
|
225
|
+
</Typography>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Responsive Typography
|
|
229
|
+
|
|
230
|
+
반응형 레벨을 사용할 수 있습니다:
|
|
231
|
+
|
|
232
|
+
```tsx
|
|
233
|
+
<Typography
|
|
234
|
+
level={{ xs: 'h3', sm: 'h2', md: 'h1' }}
|
|
235
|
+
sx={{
|
|
236
|
+
fontSize: { xs: '1.5rem', sm: '2rem', md: '2.5rem' }
|
|
237
|
+
}}
|
|
238
|
+
>
|
|
239
|
+
반응형 제목
|
|
240
|
+
</Typography>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Best Practices
|
|
244
|
+
|
|
245
|
+
1. **의미적 구조**: 제목 레벨을 순서대로 사용하여 명확한 문서 구조를 만드세요.
|
|
246
|
+
|
|
247
|
+
```tsx
|
|
248
|
+
// ✅ 올바른 순서
|
|
249
|
+
<Typography level="h1">메인 제목</Typography>
|
|
250
|
+
<Typography level="h2">섹션 제목</Typography>
|
|
251
|
+
<Typography level="h3">하위 섹션</Typography>
|
|
252
|
+
|
|
253
|
+
// ❌ 잘못된 순서
|
|
254
|
+
<Typography level="h1">메인 제목</Typography>
|
|
255
|
+
<Typography level="h3">섹션 제목</Typography>
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
2. **일관성**: 같은 용도의 텍스트에는 같은 레벨을 사용하세요.
|
|
259
|
+
|
|
260
|
+
3. **가독성**: 본문 텍스트에는 적절한 줄 간격과 문단 구분을 제공하세요.
|
|
261
|
+
|
|
262
|
+
4. **색상 대비**: 충분한 색상 대비를 유지하여 접근성을 보장하세요.
|
|
263
|
+
|
|
264
|
+
## Accessibility
|
|
265
|
+
|
|
266
|
+
- 적절한 HTML 시맨틱 태그 사용
|
|
267
|
+
- 스크린 리더 지원
|
|
268
|
+
- 키보드 탐색 가능 (링크나 버튼으로 사용될 때)
|
|
269
|
+
- 충분한 색상 대비
|
|
270
|
+
|
|
271
|
+
Typography는 사용자 인터페이스에서 정보를 효과적으로 전달하고 시각적 계층 구조를 만드는 데 핵심적인 역할을 합니다. 적절한 레벨과 스타일을 선택하여 읽기 쉽고 접근 가능한 콘텐츠를 만들 수 있습니다.
|