@designbasekorea/ui 0.1.0 → 0.1.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/README.md ADDED
@@ -0,0 +1,477 @@
1
+ # @designbasekorea/ui
2
+
3
+ Designbase UI 컴포넌트 라이브러리 - 피그마 플러그인에 최적화된 React 컴포넌트입니다.
4
+
5
+ ![npm](https://img.shields.io/npm/v/@designbasekorea/ui)
6
+ ![license](https://img.shields.io/npm/l/@designbasekorea/ui)
7
+
8
+ ## 📦 설치
9
+
10
+ ### NPM
11
+ ```bash
12
+ # UI 컴포넌트 + 필수 의존성
13
+ npm install @designbasekorea/ui @designbasekorea/tokens @designbasekorea/theme
14
+ ```
15
+
16
+ ### Yarn
17
+ ```bash
18
+ yarn add @designbasekorea/ui @designbasekorea/tokens @designbasekorea/theme
19
+ ```
20
+
21
+ ### pnpm
22
+ ```bash
23
+ pnpm add @designbasekorea/ui @designbasekorea/tokens @designbasekorea/theme
24
+ ```
25
+
26
+ ⚠️ **필수 의존성**:
27
+ - `@designbasekorea/tokens` - 디자인 토큰
28
+ - `@designbasekorea/theme` - 테마 시스템
29
+
30
+ ## 🚀 빠른 시작
31
+
32
+ ### React/Next.js에서
33
+
34
+ ```tsx
35
+ // 1. 토큰 CSS (필수 - 가장 먼저!)
36
+ import '@designbasekorea/tokens/dist/css/tokens.css';
37
+
38
+ // 2. 테마 CSS (필수)
39
+ import '@designbasekorea/theme/dist/css/theme.css';
40
+
41
+ // 3. UI 컴포넌트 import
42
+ import { Button, Card, Input, Accordion } from '@designbasekorea/ui';
43
+
44
+ function App() {
45
+ return (
46
+ <div>
47
+ <Button variant="primary" size="lg">
48
+ 클릭하세요
49
+ </Button>
50
+
51
+ <Card>
52
+ <Card.Header>카드 제목</Card.Header>
53
+ <Card.Body>
54
+ <Input placeholder="이름을 입력하세요" />
55
+ </Card.Body>
56
+ </Card>
57
+
58
+ <Accordion>
59
+ <Accordion.Item value="item-1">
60
+ <Accordion.Header>제목 1</Accordion.Header>
61
+ <Accordion.Content>내용 1</Accordion.Content>
62
+ </Accordion.Item>
63
+ </Accordion>
64
+ </div>
65
+ );
66
+ }
67
+
68
+ export default App;
69
+ ```
70
+
71
+ ### CDN 사용
72
+
73
+ ```html
74
+ <!DOCTYPE html>
75
+ <html lang="ko">
76
+ <head>
77
+ <meta charset="UTF-8">
78
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
79
+
80
+ <!-- 1. 토큰 CSS (필수 - 가장 먼저!) -->
81
+ <link rel="stylesheet" href="https://unpkg.com/@designbasekorea/tokens@latest/dist/css/tokens.css">
82
+
83
+ <!-- 2. 테마 CSS (필수) -->
84
+ <link rel="stylesheet" href="https://unpkg.com/@designbasekorea/theme@latest/dist/css/theme.css">
85
+
86
+ <title>Designbase UI</title>
87
+ </head>
88
+ <body>
89
+ <div id="root"></div>
90
+
91
+ <!-- React & ReactDOM -->
92
+ <script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
93
+ <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
94
+
95
+ <!-- Designbase UI -->
96
+ <script src="https://unpkg.com/@designbasekorea/ui@latest/dist/index.umd.js"></script>
97
+
98
+ <script>
99
+ const { Button, Card, Input } = DesignbaseUI;
100
+
101
+ const App = () => {
102
+ return React.createElement('div', { style: { padding: '20px' } },
103
+ React.createElement(Button, {
104
+ variant: 'primary',
105
+ onClick: () => alert('클릭!')
106
+ }, '클릭하세요'),
107
+
108
+ React.createElement(Card, null,
109
+ React.createElement('h2', null, '카드 제목'),
110
+ React.createElement(Input, { placeholder: '입력하세요' })
111
+ )
112
+ );
113
+ };
114
+
115
+ ReactDOM.render(React.createElement(App), document.getElementById('root'));
116
+ </script>
117
+ </body>
118
+ </html>
119
+ ```
120
+
121
+ ## 📚 컴포넌트 목록
122
+
123
+ ### Form 컴포넌트
124
+ - **Button** - 버튼
125
+ - **Input** - 텍스트 입력
126
+ - **Textarea** - 여러 줄 텍스트 입력
127
+ - **Checkbox** - 체크박스
128
+ - **Radio** - 라디오 버튼
129
+ - **Toggle** - 토글 스위치
130
+ - **Select** - 선택 박스
131
+
132
+ ### Layout 컴포넌트
133
+ - **Card** - 카드
134
+ - **Modal** - 모달
135
+ - **Drawer** - 드로어
136
+ - **Tabs** - 탭
137
+ - **Accordion** - 아코디언
138
+ - **Divider** - 구분선
139
+
140
+ ### Feedback 컴포넌트
141
+ - **Alert** - 알림
142
+ - **Toast** - 토스트 알림
143
+ - **Tooltip** - 툴팁
144
+ - **Badge** - 뱃지
145
+ - **Spinner** - 로딩 스피너
146
+ - **Progress** - 진행 표시줄
147
+ - **Skeleton** - 스켈레톤 로더
148
+
149
+ ### Navigation 컴포넌트
150
+ - **Breadcrumb** - 브레드크럼
151
+ - **Pagination** - 페이지네이션
152
+ - **Dropdown** - 드롭다운
153
+
154
+ ### Data Display 컴포넌트
155
+ - **Table** - 테이블
156
+ - **Chip** - 칩
157
+ - **Avatar** - 아바타
158
+
159
+ ### Date & Time 컴포넌트
160
+ - **Calendar** - 캘린더
161
+ - **DatePicker** - 날짜 선택기
162
+ - **TimePicker** - 시간 선택기
163
+
164
+ ### 기타
165
+ - **Rating** - 별점
166
+ - **Stepper** - 단계 표시
167
+ - **Popover** - 팝오버
168
+
169
+ ## 🎯 컴포넌트 사용 예시
170
+
171
+ ### Button
172
+
173
+ ```tsx
174
+ import { Button } from '@designbasekorea/ui';
175
+
176
+ <Button variant="primary" size="lg" onClick={() => console.log('클릭!')}>
177
+ Primary 버튼
178
+ </Button>
179
+
180
+ <Button variant="secondary" size="md" disabled>
181
+ 비활성 버튼
182
+ </Button>
183
+
184
+ <Button variant="outline" size="sm" fullWidth>
185
+ 전체 너비 버튼
186
+ </Button>
187
+ ```
188
+
189
+ **Props**:
190
+ - `variant`: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger'
191
+ - `size`: 'sm' | 'md' | 'lg'
192
+ - `fullWidth`: boolean
193
+ - `disabled`: boolean
194
+ - `onClick`: () => void
195
+
196
+ ### Input
197
+
198
+ ```tsx
199
+ import { Input } from '@designbasekorea/ui';
200
+
201
+ <Input
202
+ placeholder="이름을 입력하세요"
203
+ value={name}
204
+ onChange={(e) => setName(e.target.value)}
205
+ />
206
+
207
+ <Input
208
+ type="email"
209
+ label="이메일"
210
+ error="올바른 이메일을 입력하세요"
211
+ />
212
+
213
+ <Input
214
+ prefix={<SearchIcon />}
215
+ suffix={<ClearIcon onClick={clearInput} />}
216
+ />
217
+ ```
218
+
219
+ **Props**:
220
+ - `type`: 'text' | 'email' | 'password' | 'number' | ...
221
+ - `label`: string
222
+ - `placeholder`: string
223
+ - `error`: string
224
+ - `disabled`: boolean
225
+ - `prefix`: ReactNode
226
+ - `suffix`: ReactNode
227
+
228
+ ### Card
229
+
230
+ ```tsx
231
+ import { Card } from '@designbasekorea/ui';
232
+
233
+ <Card>
234
+ <Card.Header>
235
+ <h2>카드 제목</h2>
236
+ </Card.Header>
237
+ <Card.Body>
238
+ <p>카드 내용입니다.</p>
239
+ </Card.Body>
240
+ <Card.Footer>
241
+ <Button>확인</Button>
242
+ </Card.Footer>
243
+ </Card>
244
+ ```
245
+
246
+ ### Modal
247
+
248
+ ```tsx
249
+ import { Modal } from '@designbasekorea/ui';
250
+
251
+ function MyComponent() {
252
+ const [isOpen, setIsOpen] = useState(false);
253
+
254
+ return (
255
+ <>
256
+ <Button onClick={() => setIsOpen(true)}>
257
+ 모달 열기
258
+ </Button>
259
+
260
+ <Modal
261
+ isOpen={isOpen}
262
+ onClose={() => setIsOpen(false)}
263
+ title="모달 제목"
264
+ >
265
+ <p>모달 내용입니다.</p>
266
+
267
+ <Modal.Footer>
268
+ <Button onClick={() => setIsOpen(false)}>닫기</Button>
269
+ <Button variant="primary">확인</Button>
270
+ </Modal.Footer>
271
+ </Modal>
272
+ </>
273
+ );
274
+ }
275
+ ```
276
+
277
+ ### Accordion
278
+
279
+ ```tsx
280
+ import { Accordion } from '@designbasekorea/ui';
281
+
282
+ <Accordion>
283
+ <Accordion.Item value="item-1">
284
+ <Accordion.Header>첫 번째 항목</Accordion.Header>
285
+ <Accordion.Content>
286
+ 첫 번째 항목의 내용입니다.
287
+ </Accordion.Content>
288
+ </Accordion.Item>
289
+
290
+ <Accordion.Item value="item-2">
291
+ <Accordion.Header>두 번째 항목</Accordion.Header>
292
+ <Accordion.Content>
293
+ 두 번째 항목의 내용입니다.
294
+ </Accordion.Content>
295
+ </Accordion.Item>
296
+ </Accordion>
297
+ ```
298
+
299
+ ### Toast
300
+
301
+ ```tsx
302
+ import { toast } from '@designbasekorea/ui';
303
+
304
+ // 성공 토스트
305
+ toast.success('저장되었습니다!');
306
+
307
+ // 에러 토스트
308
+ toast.error('오류가 발생했습니다.');
309
+
310
+ // 경고 토스트
311
+ toast.warning('주의하세요!');
312
+
313
+ // 정보 토스트
314
+ toast.info('새로운 알림이 있습니다.');
315
+
316
+ // 커스텀 토스트
317
+ toast({
318
+ title: '제목',
319
+ description: '설명',
320
+ duration: 5000,
321
+ variant: 'success'
322
+ });
323
+ ```
324
+
325
+ ## 🎨 테마 커스터마이징
326
+
327
+ ### CSS 변수 오버라이드
328
+
329
+ ```css
330
+ :root {
331
+ /* 버튼 색상 변경 */
332
+ --db-color-primary: #ff6b6b;
333
+ --db-color-primary-hover: #ff5252;
334
+
335
+ /* 모서리 둥글기 변경 */
336
+ --db-radius-button: 16px;
337
+ --db-radius-card-m: 20px;
338
+
339
+ /* 간격 변경 */
340
+ --db-padding-m: 20px;
341
+ }
342
+ ```
343
+
344
+ ### 컴포넌트별 스타일 오버라이드
345
+
346
+ ```css
347
+ /* Button 커스터마이징 */
348
+ .db-button {
349
+ text-transform: uppercase;
350
+ letter-spacing: 0.5px;
351
+ }
352
+
353
+ /* Card 커스터마이징 */
354
+ .db-card {
355
+ border-width: 2px;
356
+ }
357
+ ```
358
+
359
+ ## 📦 Export 형식
360
+
361
+ | 형식 | 경로 | 설명 |
362
+ |------|------|------|
363
+ | ESM | `dist/index.esm.js` | ES Module (React) |
364
+ | CJS | `dist/index.js` | CommonJS |
365
+ | UMD | `dist/index.umd.js` | Universal (CDN) |
366
+ | CSS | `dist/index.css` | 컴포넌트 스타일 |
367
+ | Types | `dist/index.d.ts` | TypeScript 타입 |
368
+
369
+ ## 🔧 고급 사용법
370
+
371
+ ### Tree Shaking
372
+
373
+ ```tsx
374
+ // 개별 import로 번들 크기 최적화
375
+ import Button from '@designbasekorea/ui/dist/components/Button';
376
+ import Card from '@designbasekorea/ui/dist/components/Card';
377
+ ```
378
+
379
+ ### TypeScript
380
+
381
+ ```tsx
382
+ import { ButtonProps, CardProps } from '@designbasekorea/ui';
383
+
384
+ const MyButton: React.FC<ButtonProps> = (props) => {
385
+ return <Button {...props} />;
386
+ };
387
+ ```
388
+
389
+ ### 접근성 (a11y)
390
+
391
+ 모든 컴포넌트는 WCAG 2.1 AA 수준을 준수합니다:
392
+ - 키보드 네비게이션 지원
393
+ - ARIA 속성 포함
394
+ - 스크린 리더 호환
395
+ - 포커스 관리
396
+
397
+ ```tsx
398
+ <Button aria-label="검색">
399
+ <SearchIcon />
400
+ </Button>
401
+
402
+ <Input
403
+ aria-describedby="email-error"
404
+ aria-invalid={!!error}
405
+ />
406
+ ```
407
+
408
+ ## 🔗 관련 패키지
409
+
410
+ - [@designbasekorea/tokens](../tokens) - 디자인 토큰 (필수)
411
+ - [@designbasekorea/theme](../theme) - 테마 시스템 (필수)
412
+ - [@designbasekorea/icons](../icons) - 아이콘 컴포넌트
413
+ - [@designbasekorea/icons-webfont](../icons-webfont) - 아이콘 웹폰트
414
+
415
+ ## 📖 문서 및 예제
416
+
417
+ ### Storybook
418
+
419
+ 모든 컴포넌트의 라이브 예제를 확인하세요:
420
+
421
+ ```bash
422
+ npm run storybook
423
+ ```
424
+
425
+ 브라우저에서 `http://localhost:6006` 접속
426
+
427
+ ### 온라인 문서
428
+
429
+ - [Storybook (배포됨)]() - 모든 컴포넌트 예제
430
+ - [GitHub Repository]() - 소스 코드
431
+
432
+ ## 🔄 버전 히스토리
433
+
434
+ ### 0.1.0 (Latest)
435
+ - ✅ 20+ React 컴포넌트 제공
436
+ - ✅ 테마 시스템 통합
437
+ - ✅ TypeScript 지원
438
+ - ✅ 접근성 준수
439
+
440
+ ## ⚠️ 주의사항
441
+
442
+ ### 1. CSS 로드 순서
443
+
444
+ 반드시 이 순서대로 CSS를 로드하세요:
445
+
446
+ ```tsx
447
+ // 1. 토큰 (필수 - 가장 먼저!)
448
+ import '@designbasekorea/tokens/dist/css/tokens.css';
449
+
450
+ // 2. 테마 (필수)
451
+ import '@designbasekorea/theme/dist/css/theme.css';
452
+
453
+ // 3. UI 컴포넌트 (자동으로 테마 CSS 포함)
454
+ import { Button } from '@designbasekorea/ui';
455
+ ```
456
+
457
+ ### 2. 버전 호환성
458
+
459
+ | UI | Tokens | Theme |
460
+ |----|--------|-------|
461
+ | 0.1.0+ | 0.1.7+ | 0.1.11+ |
462
+
463
+ 호환되는 버전을 함께 사용하세요.
464
+
465
+ ### 3. React 버전
466
+
467
+ - React `18.0.0+` 필요
468
+ - React DOM `18.0.0+` 필요
469
+
470
+ ## 🤝 기여
471
+
472
+ 버그 리포트나 기능 제안은 GitHub Issues로 부탁드립니다.
473
+
474
+ ## 📄 라이선스
475
+
476
+ MIT
477
+