@kood/claude-code 0.1.0
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/index.d.ts +2 -0
- package/dist/index.js +297 -0
- package/package.json +47 -0
- package/templates/hono/CLAUDE.md +376 -0
- package/templates/hono/docs/deployment/cloudflare.md +328 -0
- package/templates/hono/docs/deployment/index.md +291 -0
- package/templates/hono/docs/git/index.md +180 -0
- package/templates/hono/docs/library/hono/error-handling.md +400 -0
- package/templates/hono/docs/library/hono/index.md +241 -0
- package/templates/hono/docs/library/hono/middleware.md +334 -0
- package/templates/hono/docs/library/hono/rpc.md +454 -0
- package/templates/hono/docs/library/hono/validation.md +328 -0
- package/templates/hono/docs/library/prisma/index.md +427 -0
- package/templates/hono/docs/library/zod/index.md +413 -0
- package/templates/hono/docs/mcp/context7.md +106 -0
- package/templates/hono/docs/mcp/index.md +94 -0
- package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
- package/templates/hono/docs/mcp/sgrep.md +105 -0
- package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
- package/templates/tanstack-start/CLAUDE.md +279 -0
- package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
- package/templates/tanstack-start/docs/deployment/index.md +102 -0
- package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
- package/templates/tanstack-start/docs/deployment/railway.md +364 -0
- package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
- package/templates/tanstack-start/docs/design/accessibility.md +433 -0
- package/templates/tanstack-start/docs/design/color.md +235 -0
- package/templates/tanstack-start/docs/design/components.md +409 -0
- package/templates/tanstack-start/docs/design/index.md +107 -0
- package/templates/tanstack-start/docs/design/safe-area.md +317 -0
- package/templates/tanstack-start/docs/design/spacing.md +341 -0
- package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
- package/templates/tanstack-start/docs/design/typography.md +324 -0
- package/templates/tanstack-start/docs/git/index.md +203 -0
- package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
- package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
- package/templates/tanstack-start/docs/guides/prettier.md +189 -0
- package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
- package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
- package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
- package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
- package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
- package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
- package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
- package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
- package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
- package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
- package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
- package/templates/tanstack-start/docs/library/zod/index.md +186 -0
- package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
- package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
- package/templates/tanstack-start/docs/mcp/context7.md +204 -0
- package/templates/tanstack-start/docs/mcp/index.md +116 -0
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
- package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# 컴포넌트 가이드라인
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [UI/UX 디자인 가이드](./index.md)
|
|
4
|
+
|
|
5
|
+
일관된 UI 컴포넌트 사용은 사용자 경험을 향상시키고 개발 효율성을 높입니다.
|
|
6
|
+
|
|
7
|
+
## 버튼 (Button)
|
|
8
|
+
|
|
9
|
+
### 버튼 계층
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Primary (주요) 사용자가 해야 할 주된 행동
|
|
13
|
+
Secondary (보조) 대안적 행동
|
|
14
|
+
Tertiary (3차) 덜 중요한 행동
|
|
15
|
+
Destructive (삭제) 위험한/되돌릴 수 없는 행동
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### 버튼 스타일
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
// Primary - 눈에 띄는 배경색
|
|
22
|
+
<button className="px-4 py-2 bg-blue-600 text-white rounded-lg
|
|
23
|
+
hover:bg-blue-700 active:bg-blue-800
|
|
24
|
+
disabled:bg-gray-300 disabled:cursor-not-allowed">
|
|
25
|
+
저장하기
|
|
26
|
+
</button>
|
|
27
|
+
|
|
28
|
+
// Secondary - 테두리만
|
|
29
|
+
<button className="px-4 py-2 border border-gray-300 rounded-lg
|
|
30
|
+
hover:bg-gray-50 active:bg-gray-100
|
|
31
|
+
dark:border-gray-600 dark:hover:bg-gray-800">
|
|
32
|
+
취소
|
|
33
|
+
</button>
|
|
34
|
+
|
|
35
|
+
// Tertiary - 텍스트만
|
|
36
|
+
<button className="px-4 py-2 text-blue-600
|
|
37
|
+
hover:text-blue-700 hover:underline">
|
|
38
|
+
더 보기
|
|
39
|
+
</button>
|
|
40
|
+
|
|
41
|
+
// Destructive - 빨간색
|
|
42
|
+
<button className="px-4 py-2 bg-red-600 text-white rounded-lg
|
|
43
|
+
hover:bg-red-700">
|
|
44
|
+
삭제
|
|
45
|
+
</button>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 버튼 크기
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
// Small
|
|
52
|
+
<button className="px-3 py-1.5 text-sm">작은 버튼</button>
|
|
53
|
+
|
|
54
|
+
// Medium (기본)
|
|
55
|
+
<button className="px-4 py-2 text-base">기본 버튼</button>
|
|
56
|
+
|
|
57
|
+
// Large
|
|
58
|
+
<button className="px-6 py-3 text-lg">큰 버튼</button>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 버튼 상태
|
|
62
|
+
|
|
63
|
+
| 상태 | 설명 | 시각적 처리 |
|
|
64
|
+
|------|------|------------|
|
|
65
|
+
| Default | 기본 상태 | 기본 색상 |
|
|
66
|
+
| Hover | 마우스 오버 | 약간 어둡게 |
|
|
67
|
+
| Active | 클릭 중 | 더 어둡게 |
|
|
68
|
+
| Focus | 키보드 포커스 | 아웃라인 표시 |
|
|
69
|
+
| Disabled | 비활성화 | 회색, 클릭 불가 |
|
|
70
|
+
| Loading | 로딩 중 | 스피너, 클릭 불가 |
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
// 로딩 상태 버튼
|
|
74
|
+
<button
|
|
75
|
+
disabled={isLoading}
|
|
76
|
+
className="px-4 py-2 bg-blue-600 text-white rounded-lg
|
|
77
|
+
disabled:opacity-50 flex items-center gap-2"
|
|
78
|
+
>
|
|
79
|
+
{isLoading && <Spinner className="w-4 h-4 animate-spin" />}
|
|
80
|
+
{isLoading ? '저장 중...' : '저장하기'}
|
|
81
|
+
</button>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 입력 필드 (Input)
|
|
85
|
+
|
|
86
|
+
### 기본 구조
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
<div>
|
|
90
|
+
{/* 레이블 */}
|
|
91
|
+
<label className="block text-sm font-medium text-gray-700 mb-1">
|
|
92
|
+
이메일
|
|
93
|
+
</label>
|
|
94
|
+
|
|
95
|
+
{/* 입력 필드 */}
|
|
96
|
+
<input
|
|
97
|
+
type="email"
|
|
98
|
+
className="w-full px-3 py-2 border border-gray-300 rounded-lg
|
|
99
|
+
focus:ring-2 focus:ring-blue-500 focus:border-blue-500
|
|
100
|
+
placeholder:text-gray-400"
|
|
101
|
+
placeholder="example@email.com"
|
|
102
|
+
/>
|
|
103
|
+
|
|
104
|
+
{/* 도움말/에러 메시지 */}
|
|
105
|
+
<p className="mt-1 text-sm text-gray-500">
|
|
106
|
+
업무용 이메일을 입력하세요.
|
|
107
|
+
</p>
|
|
108
|
+
</div>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 입력 상태
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
// 기본 상태
|
|
115
|
+
<input className="border border-gray-300 focus:ring-2 focus:ring-blue-500" />
|
|
116
|
+
|
|
117
|
+
// 에러 상태
|
|
118
|
+
<input className="border border-red-500 focus:ring-2 focus:ring-red-500" />
|
|
119
|
+
<p className="mt-1 text-sm text-red-600">올바른 이메일을 입력하세요.</p>
|
|
120
|
+
|
|
121
|
+
// 성공 상태
|
|
122
|
+
<input className="border border-green-500 focus:ring-2 focus:ring-green-500" />
|
|
123
|
+
|
|
124
|
+
// 비활성화 상태
|
|
125
|
+
<input disabled className="border border-gray-200 bg-gray-50 cursor-not-allowed" />
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 입력 변형
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
// 아이콘 포함 (왼쪽)
|
|
132
|
+
<div className="relative">
|
|
133
|
+
<SearchIcon className="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-gray-400" />
|
|
134
|
+
<input className="pl-10 pr-3 py-2 ..." />
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
// 아이콘 포함 (오른쪽)
|
|
138
|
+
<div className="relative">
|
|
139
|
+
<input className="pl-3 pr-10 py-2 ..." type="password" />
|
|
140
|
+
<button className="absolute right-3 top-1/2 -translate-y-1/2">
|
|
141
|
+
<EyeIcon className="w-5 h-5 text-gray-400" />
|
|
142
|
+
</button>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
// 접두사/접미사
|
|
146
|
+
<div className="flex">
|
|
147
|
+
<span className="px-3 py-2 bg-gray-100 border border-r-0 rounded-l-lg">
|
|
148
|
+
https://
|
|
149
|
+
</span>
|
|
150
|
+
<input className="flex-1 px-3 py-2 border rounded-r-lg" />
|
|
151
|
+
</div>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## 카드 (Card)
|
|
155
|
+
|
|
156
|
+
### 기본 카드
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
<div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200
|
|
160
|
+
dark:border-gray-700 shadow-sm overflow-hidden">
|
|
161
|
+
{/* 카드 헤더 (선택) */}
|
|
162
|
+
<div className="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
|
|
163
|
+
<h3 className="text-lg font-semibold">카드 제목</h3>
|
|
164
|
+
</div>
|
|
165
|
+
|
|
166
|
+
{/* 카드 본문 */}
|
|
167
|
+
<div className="px-6 py-4">
|
|
168
|
+
<p>카드 내용이 여기에 들어갑니다.</p>
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
{/* 카드 푸터 (선택) */}
|
|
172
|
+
<div className="px-6 py-4 bg-gray-50 dark:bg-gray-900">
|
|
173
|
+
<button>액션</button>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 카드 변형
|
|
179
|
+
|
|
180
|
+
```tsx
|
|
181
|
+
// 클릭 가능한 카드
|
|
182
|
+
<div className="... cursor-pointer hover:shadow-md transition-shadow">
|
|
183
|
+
|
|
184
|
+
// 선택된 카드
|
|
185
|
+
<div className="... ring-2 ring-blue-500">
|
|
186
|
+
|
|
187
|
+
// 이미지 카드
|
|
188
|
+
<div className="... overflow-hidden">
|
|
189
|
+
<img src="..." className="w-full h-48 object-cover" />
|
|
190
|
+
<div className="p-4">...</div>
|
|
191
|
+
</div>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## 모달/다이얼로그 (Modal)
|
|
195
|
+
|
|
196
|
+
### 기본 구조
|
|
197
|
+
|
|
198
|
+
```tsx
|
|
199
|
+
// 오버레이
|
|
200
|
+
<div className="fixed inset-0 bg-black/50 z-50 flex items-center justify-center">
|
|
201
|
+
|
|
202
|
+
{/* 모달 컨테이너 */}
|
|
203
|
+
<div className="bg-white dark:bg-gray-800 rounded-lg shadow-xl
|
|
204
|
+
w-full max-w-md mx-4 overflow-hidden">
|
|
205
|
+
|
|
206
|
+
{/* 헤더 */}
|
|
207
|
+
<div className="px-6 py-4 border-b flex items-center justify-between">
|
|
208
|
+
<h2 className="text-lg font-semibold">모달 제목</h2>
|
|
209
|
+
<button className="p-1 hover:bg-gray-100 rounded">
|
|
210
|
+
<XIcon className="w-5 h-5" />
|
|
211
|
+
</button>
|
|
212
|
+
</div>
|
|
213
|
+
|
|
214
|
+
{/* 본문 */}
|
|
215
|
+
<div className="px-6 py-4">
|
|
216
|
+
<p>모달 내용</p>
|
|
217
|
+
</div>
|
|
218
|
+
|
|
219
|
+
{/* 푸터 */}
|
|
220
|
+
<div className="px-6 py-4 bg-gray-50 flex justify-end gap-3">
|
|
221
|
+
<button className="px-4 py-2 border rounded-lg">취소</button>
|
|
222
|
+
<button className="px-4 py-2 bg-blue-600 text-white rounded-lg">
|
|
223
|
+
확인
|
|
224
|
+
</button>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### 모달 크기
|
|
231
|
+
|
|
232
|
+
```tsx
|
|
233
|
+
// Small - 간단한 확인
|
|
234
|
+
<div className="max-w-sm">
|
|
235
|
+
|
|
236
|
+
// Medium - 기본 (폼 등)
|
|
237
|
+
<div className="max-w-md">
|
|
238
|
+
|
|
239
|
+
// Large - 복잡한 내용
|
|
240
|
+
<div className="max-w-lg">
|
|
241
|
+
|
|
242
|
+
// Extra Large - 테이블, 대시보드
|
|
243
|
+
<div className="max-w-2xl">
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 알림/토스트 (Alert/Toast)
|
|
247
|
+
|
|
248
|
+
### 알림 유형
|
|
249
|
+
|
|
250
|
+
```tsx
|
|
251
|
+
// 정보 (파란색)
|
|
252
|
+
<div className="p-4 bg-blue-50 border border-blue-200 rounded-lg flex gap-3">
|
|
253
|
+
<InfoIcon className="w-5 h-5 text-blue-600 shrink-0" />
|
|
254
|
+
<p className="text-blue-800">안내 메시지입니다.</p>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
// 성공 (초록색)
|
|
258
|
+
<div className="p-4 bg-green-50 border border-green-200 rounded-lg flex gap-3">
|
|
259
|
+
<CheckIcon className="w-5 h-5 text-green-600 shrink-0" />
|
|
260
|
+
<p className="text-green-800">성공적으로 저장되었습니다.</p>
|
|
261
|
+
</div>
|
|
262
|
+
|
|
263
|
+
// 경고 (노란색)
|
|
264
|
+
<div className="p-4 bg-yellow-50 border border-yellow-200 rounded-lg flex gap-3">
|
|
265
|
+
<WarningIcon className="w-5 h-5 text-yellow-600 shrink-0" />
|
|
266
|
+
<p className="text-yellow-800">주의가 필요합니다.</p>
|
|
267
|
+
</div>
|
|
268
|
+
|
|
269
|
+
// 오류 (빨간색)
|
|
270
|
+
<div className="p-4 bg-red-50 border border-red-200 rounded-lg flex gap-3">
|
|
271
|
+
<ErrorIcon className="w-5 h-5 text-red-600 shrink-0" />
|
|
272
|
+
<p className="text-red-800">오류가 발생했습니다.</p>
|
|
273
|
+
</div>
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 토스트 위치
|
|
277
|
+
|
|
278
|
+
```tsx
|
|
279
|
+
// 우측 하단 (기본)
|
|
280
|
+
<div className="fixed bottom-4 right-4 z-50">
|
|
281
|
+
<div className="bg-gray-900 text-white px-4 py-3 rounded-lg shadow-lg">
|
|
282
|
+
저장되었습니다
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
|
|
286
|
+
// 상단 중앙
|
|
287
|
+
<div className="fixed top-4 left-1/2 -translate-x-1/2 z-50">
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## 배지/태그 (Badge)
|
|
291
|
+
|
|
292
|
+
```tsx
|
|
293
|
+
// 상태 배지
|
|
294
|
+
<span className="px-2 py-0.5 text-xs font-medium rounded-full
|
|
295
|
+
bg-green-100 text-green-800">
|
|
296
|
+
활성
|
|
297
|
+
</span>
|
|
298
|
+
|
|
299
|
+
<span className="px-2 py-0.5 text-xs font-medium rounded-full
|
|
300
|
+
bg-yellow-100 text-yellow-800">
|
|
301
|
+
대기중
|
|
302
|
+
</span>
|
|
303
|
+
|
|
304
|
+
<span className="px-2 py-0.5 text-xs font-medium rounded-full
|
|
305
|
+
bg-red-100 text-red-800">
|
|
306
|
+
오류
|
|
307
|
+
</span>
|
|
308
|
+
|
|
309
|
+
// 숫자 배지 (알림)
|
|
310
|
+
<div className="relative">
|
|
311
|
+
<BellIcon className="w-6 h-6" />
|
|
312
|
+
<span className="absolute -top-1 -right-1 w-5 h-5 bg-red-500
|
|
313
|
+
text-white text-xs rounded-full flex items-center justify-center">
|
|
314
|
+
3
|
|
315
|
+
</span>
|
|
316
|
+
</div>
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## 테이블 (Table)
|
|
320
|
+
|
|
321
|
+
```tsx
|
|
322
|
+
<div className="overflow-x-auto">
|
|
323
|
+
<table className="w-full">
|
|
324
|
+
{/* 헤더 */}
|
|
325
|
+
<thead className="bg-gray-50 dark:bg-gray-800">
|
|
326
|
+
<tr>
|
|
327
|
+
<th className="px-6 py-3 text-left text-xs font-medium
|
|
328
|
+
text-gray-500 uppercase tracking-wider">
|
|
329
|
+
이름
|
|
330
|
+
</th>
|
|
331
|
+
<th className="px-6 py-3 text-left text-xs font-medium
|
|
332
|
+
text-gray-500 uppercase tracking-wider">
|
|
333
|
+
이메일
|
|
334
|
+
</th>
|
|
335
|
+
<th className="px-6 py-3 text-left text-xs font-medium
|
|
336
|
+
text-gray-500 uppercase tracking-wider">
|
|
337
|
+
상태
|
|
338
|
+
</th>
|
|
339
|
+
</tr>
|
|
340
|
+
</thead>
|
|
341
|
+
|
|
342
|
+
{/* 본문 */}
|
|
343
|
+
<tbody className="divide-y divide-gray-200 dark:divide-gray-700">
|
|
344
|
+
<tr className="hover:bg-gray-50 dark:hover:bg-gray-800">
|
|
345
|
+
<td className="px-6 py-4 whitespace-nowrap">홍길동</td>
|
|
346
|
+
<td className="px-6 py-4 whitespace-nowrap">hong@email.com</td>
|
|
347
|
+
<td className="px-6 py-4 whitespace-nowrap">
|
|
348
|
+
<span className="px-2 py-0.5 text-xs bg-green-100 text-green-800 rounded-full">
|
|
349
|
+
활성
|
|
350
|
+
</span>
|
|
351
|
+
</td>
|
|
352
|
+
</tr>
|
|
353
|
+
</tbody>
|
|
354
|
+
</table>
|
|
355
|
+
</div>
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## 컴포넌트 조합 원칙
|
|
359
|
+
|
|
360
|
+
### 1. 일관된 크기 체계
|
|
361
|
+
|
|
362
|
+
```
|
|
363
|
+
컴포넌트 크기는 서로 어울려야 합니다:
|
|
364
|
+
|
|
365
|
+
Small 버튼 + Small 입력 + text-sm
|
|
366
|
+
Medium 버튼 + Medium 입력 + text-base
|
|
367
|
+
Large 버튼 + Large 입력 + text-lg
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### 2. 시각적 무게 균형
|
|
371
|
+
|
|
372
|
+
```tsx
|
|
373
|
+
// ✅ 좋은 예 - Primary가 하나만
|
|
374
|
+
<div className="flex gap-2">
|
|
375
|
+
<button className="border">취소</button>
|
|
376
|
+
<button className="bg-blue-600 text-white">저장</button>
|
|
377
|
+
</div>
|
|
378
|
+
|
|
379
|
+
// ❌ 나쁜 예 - Primary가 여러 개
|
|
380
|
+
<div className="flex gap-2">
|
|
381
|
+
<button className="bg-blue-600 text-white">취소</button>
|
|
382
|
+
<button className="bg-green-600 text-white">저장</button>
|
|
383
|
+
</div>
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### 3. 예측 가능한 위치
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
확인/저장 버튼: 오른쪽
|
|
390
|
+
취소/닫기 버튼: 왼쪽
|
|
391
|
+
주요 액션: 눈에 잘 띄는 위치
|
|
392
|
+
파괴적 액션: 분리 또는 경고 표시
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## 체크리스트
|
|
396
|
+
|
|
397
|
+
### 반드시 지켜야 할 것
|
|
398
|
+
|
|
399
|
+
- [ ] 버튼 계층 구분 (Primary는 화면당 1개)
|
|
400
|
+
- [ ] 입력 필드에 레이블 필수
|
|
401
|
+
- [ ] 에러 상태 시각적 표시
|
|
402
|
+
- [ ] 로딩 상태 표시
|
|
403
|
+
|
|
404
|
+
### 권장 사항
|
|
405
|
+
|
|
406
|
+
- [ ] 일관된 컴포넌트 크기 사용
|
|
407
|
+
- [ ] 포커스 스타일 명확히
|
|
408
|
+
- [ ] 비활성화 상태 구분
|
|
409
|
+
- [ ] 반응형 대응
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# UI/UX 디자인 가이드
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [홈](../index.md)
|
|
4
|
+
|
|
5
|
+
TanStack Start + Tailwind CSS 프로젝트를 위한 UI/UX 디자인 가이드입니다.
|
|
6
|
+
|
|
7
|
+
## 왜 디자인 시스템이 필요한가?
|
|
8
|
+
|
|
9
|
+
디자인 시스템은 **일관된 사용자 경험**을 만들기 위한 규칙과 컴포넌트의 모음입니다.
|
|
10
|
+
|
|
11
|
+
### 디자인 시스템의 장점
|
|
12
|
+
|
|
13
|
+
| 장점 | 설명 |
|
|
14
|
+
|------|------|
|
|
15
|
+
| **일관성** | 모든 페이지에서 동일한 룩앤필 제공 |
|
|
16
|
+
| **효율성** | 재사용 가능한 컴포넌트로 개발 속도 향상 |
|
|
17
|
+
| **유지보수** | 한 곳에서 수정하면 전체에 반영 |
|
|
18
|
+
| **협업** | 디자이너-개발자 간 명확한 기준 공유 |
|
|
19
|
+
|
|
20
|
+
## 가이드 구성
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
docs/design/
|
|
24
|
+
├── index.md # 이 문서 (개요)
|
|
25
|
+
├── color.md # 색상 시스템
|
|
26
|
+
├── typography.md # 타이포그래피 (폰트)
|
|
27
|
+
├── spacing.md # 간격과 레이아웃
|
|
28
|
+
├── components.md # 컴포넌트 가이드라인
|
|
29
|
+
├── accessibility.md # 접근성
|
|
30
|
+
├── safe-area.md # iOS Safe Area
|
|
31
|
+
└── tailwind-setup.md # Tailwind CSS 설정
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 핵심 원칙
|
|
35
|
+
|
|
36
|
+
### 1. 일관성 (Consistency)
|
|
37
|
+
|
|
38
|
+
> 같은 요소는 항상 같은 모습과 동작을 가져야 합니다.
|
|
39
|
+
|
|
40
|
+
- 버튼은 항상 같은 스타일
|
|
41
|
+
- 같은 종류의 텍스트는 같은 크기와 색상
|
|
42
|
+
- 동일한 간격 규칙 적용
|
|
43
|
+
|
|
44
|
+
### 2. 계층 구조 (Hierarchy)
|
|
45
|
+
|
|
46
|
+
> 중요한 것이 먼저 눈에 들어와야 합니다.
|
|
47
|
+
|
|
48
|
+
- 제목 > 부제목 > 본문 순서로 크기 차이
|
|
49
|
+
- 주요 버튼은 눈에 띄는 색상
|
|
50
|
+
- 여백으로 콘텐츠 그룹 구분
|
|
51
|
+
|
|
52
|
+
### 3. 단순함 (Simplicity)
|
|
53
|
+
|
|
54
|
+
> 불필요한 요소는 제거합니다.
|
|
55
|
+
|
|
56
|
+
- 색상은 3-5가지만 사용
|
|
57
|
+
- 폰트는 2-3개만 사용
|
|
58
|
+
- 여백을 충분히 활용
|
|
59
|
+
|
|
60
|
+
### 4. 접근성 (Accessibility)
|
|
61
|
+
|
|
62
|
+
> 모든 사용자가 사용할 수 있어야 합니다.
|
|
63
|
+
|
|
64
|
+
- 충분한 색상 대비
|
|
65
|
+
- 읽기 쉬운 폰트 크기
|
|
66
|
+
- 키보드로도 조작 가능
|
|
67
|
+
|
|
68
|
+
## 빠른 참조
|
|
69
|
+
|
|
70
|
+
### 색상 (60-30-10 규칙)
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
60% - 배경색 (흰색, 회색 등 중립적인 색)
|
|
74
|
+
30% - 보조색 (카드, 섹션 배경)
|
|
75
|
+
10% - 강조색 (버튼, 링크, CTA)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 폰트 크기
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
제목 (h1): 32-48px
|
|
82
|
+
부제목 (h2): 24-32px
|
|
83
|
+
소제목 (h3): 18-24px
|
|
84
|
+
본문: 16-18px
|
|
85
|
+
작은 텍스트: 12-14px
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 간격 (8px 단위)
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
xs: 4px (0.25rem)
|
|
92
|
+
sm: 8px (0.5rem)
|
|
93
|
+
md: 16px (1rem)
|
|
94
|
+
lg: 24px (1.5rem)
|
|
95
|
+
xl: 32px (2rem)
|
|
96
|
+
2xl: 48px (3rem)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 다음 단계
|
|
100
|
+
|
|
101
|
+
1. [색상 시스템](./color.md) - 색상 팔레트와 사용 규칙
|
|
102
|
+
2. [타이포그래피](./typography.md) - 폰트 선택과 텍스트 스타일
|
|
103
|
+
3. [간격과 레이아웃](./spacing.md) - 여백과 그리드 시스템
|
|
104
|
+
4. [컴포넌트 가이드](./components.md) - UI 컴포넌트 규칙
|
|
105
|
+
5. [접근성](./accessibility.md) - WCAG 가이드라인
|
|
106
|
+
6. [iOS Safe Area](./safe-area.md) - 노치, 홈 인디케이터 대응
|
|
107
|
+
7. [Tailwind 설정](./tailwind-setup.md) - 실제 구현 방법
|