@kood/claude-code 0.3.14 → 0.3.15

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.
@@ -0,0 +1,180 @@
1
+ # 아이콘 가이드
2
+
3
+ <size_system>
4
+
5
+ | 크기 | 용도 | 터치 영역 |
6
+ |------|------|----------|
7
+ | 16px, 20px | 텍스트와 함께 | - |
8
+ | 24px | 기본 시스템 아이콘 | 44-48px |
9
+ | 32-48px | 강조 | 그대로 |
10
+
11
+ **규칙:** 4px/8px 배수 | ✅ 16, 20, 24, 32, 48 | ❌ 홀수, 소수점
12
+
13
+ </size_system>
14
+
15
+ ---
16
+
17
+ <touch_target>
18
+
19
+ **최소 터치 영역:** Apple 44px | Google 48px | 한국 44-48px
20
+
21
+ ```tsx
22
+ {/* ✅ 충분한 터치 영역 */}
23
+ <button className="w-12 h-12 flex items-center justify-center">
24
+ <svg className="w-6 h-6" />
25
+ </button>
26
+
27
+ {/* ❌ 부족 */}
28
+ <button className="w-8 h-8"><svg className="w-4 h-4" /></button>
29
+ ```
30
+
31
+ </touch_target>
32
+
33
+ ---
34
+
35
+ <styles>
36
+
37
+ **Outline (기본):** 깔끔, 미니멀, 비활성 상태
38
+ **Filled (활성):** 선택/활성 상태, 강조
39
+
40
+ **선 두께 (KRDS):**
41
+ - 16px: 1.2-1.5px
42
+ - 20px: 1.5-1.8px
43
+ - 24px: 1.6-2px
44
+ - 32px: 2-2.5px
45
+ - 48px: 3px
46
+
47
+ ```tsx
48
+ {/* Outline */}
49
+ <svg className="w-6 h-6 stroke-current text-gray-600" fill="none" />
50
+
51
+ {/* Filled */}
52
+ <svg className="w-6 h-6 fill-current text-primary-500" />
53
+ ```
54
+
55
+ </styles>
56
+
57
+ ---
58
+
59
+ <libraries>
60
+
61
+ | 라이브러리 | 특징 | 적합성 |
62
+ |-----------|------|--------|
63
+ | **Heroicons** | Tailwind, 라인/채움 | ⭐⭐⭐⭐⭐ |
64
+ | **Lucide** | Feather 후속, 깔끔 | ⭐⭐⭐⭐⭐ |
65
+ | **Phosphor** | 다양한 웨이트 | ⭐⭐⭐⭐ |
66
+ | **Material Icons** | Google, 다양 스타일 | ⭐⭐⭐⭐ |
67
+ | **Tabler Icons** | 미니멀 라인 | ⭐⭐⭐⭐ |
68
+
69
+ ```tsx
70
+ import { HomeIcon } from '@heroicons/react/24/outline';
71
+ import { HomeIcon as HomeSolid } from '@heroicons/react/24/solid';
72
+ ```
73
+
74
+ </libraries>
75
+
76
+ ---
77
+
78
+ <colors>
79
+
80
+ ```tsx
81
+ {/* 비활성 */}
82
+ <svg className="w-6 h-6 text-gray-600" />
83
+
84
+ {/* 활성 */}
85
+ <svg className="w-6 h-6 text-primary-500" />
86
+
87
+ {/* 호버 */}
88
+ <svg className="w-6 h-6 text-gray-600 hover:text-gray-900 transition-colors" />
89
+
90
+ {/* Semantic */}
91
+ <svg className="w-5 h-5 text-green-500" /> {/* Success */}
92
+ <svg className="w-5 h-5 text-red-500" /> {/* Error */}
93
+ ```
94
+
95
+ </colors>
96
+
97
+ ---
98
+
99
+ <component_sizes>
100
+
101
+ ```tsx
102
+ {/* Small Button: 아이콘 16px */}
103
+ <button className="h-8 px-3 flex items-center gap-1.5">
104
+ <svg className="w-4 h-4" /><span>버튼</span>
105
+ </button>
106
+
107
+ {/* Medium Button: 아이콘 20px */}
108
+ <button className="h-11 px-4 flex items-center gap-2">
109
+ <svg className="w-5 h-5" /><span>버튼</span>
110
+ </button>
111
+
112
+ {/* Icon Only: 터치 영역 44px + 아이콘 24px */}
113
+ <button className="w-11 h-11 flex items-center justify-center">
114
+ <svg className="w-6 h-6" />
115
+ </button>
116
+
117
+ {/* 인풋 좌측 */}
118
+ <div className="relative">
119
+ <div className="absolute left-3 top-1/2 -translate-y-1/2">
120
+ <svg className="w-5 h-5 text-gray-400" />
121
+ </div>
122
+ <input className="w-full h-11 pl-10 pr-3" />
123
+ </div>
124
+
125
+ {/* 빈 상태 */}
126
+ <div className="w-20 h-20 rounded-full bg-gray-100 flex items-center justify-center">
127
+ <svg className="w-10 h-10 text-gray-400" />
128
+ </div>
129
+ ```
130
+
131
+ </component_sizes>
132
+
133
+ ---
134
+
135
+ <accessibility>
136
+
137
+ ```tsx
138
+ {/* ✅ aria-label */}
139
+ <button aria-label="알림">
140
+ <svg className="w-6 h-6" aria-hidden="true" />
141
+ </button>
142
+
143
+ {/* ✅ 텍스트와 함께 */}
144
+ <button>
145
+ <svg className="w-5 h-5" aria-hidden="true" />
146
+ <span>검색</span>
147
+ </button>
148
+
149
+ {/* ❌ 레이블 없음 */}
150
+ <button><svg className="w-6 h-6" /></button>
151
+ ```
152
+
153
+ </accessibility>
154
+
155
+ ---
156
+
157
+ <animation>
158
+
159
+ ```tsx
160
+ {/* 호버 */}
161
+ <svg className="w-6 h-6 text-gray-600 hover:text-gray-900 transition-colors" />
162
+ <svg className="w-6 h-6 hover:scale-110 transition-transform" />
163
+
164
+ {/* 로딩 */}
165
+ <svg className="w-6 h-6 animate-spin text-primary-500" />
166
+ <svg className="w-6 h-6 animate-pulse text-gray-400" />
167
+ ```
168
+
169
+ </animation>
170
+
171
+ ---
172
+
173
+ <sources>
174
+
175
+ - [KRDS 아이콘 가이드](https://www.krds.go.kr/html/site/style/style_06.html)
176
+ - [Gmarket Design System - Iconography](https://gds.gmarket.co.kr/foundation/iconography)
177
+ - [Heroicons](https://heroicons.com)
178
+ - [Lucide Icons](https://lucide.dev)
179
+
180
+ </sources>
@@ -0,0 +1,259 @@
1
+ # 마이크로 인터랙션
2
+
3
+ <principles>
4
+
5
+ **시간:** 150-250ms 적절 | <100ms 너무 빠름 | >300ms 너무 느림
6
+ **이징:** ease-out, cubic-bezier(0.4, 0, 0.2, 1)
7
+ **목적:** 피드백 제공, 상태 변화 명확, 주의 집중
8
+
9
+ ✅ 피드백/상태/집중 | ❌ 장식/과도한 움직임/불필요한 딜레이
10
+
11
+ </principles>
12
+
13
+ ---
14
+
15
+ <button>
16
+
17
+ ```tsx
18
+ {/* 호버: 배경색 */}
19
+ <button className="bg-primary-500 hover:bg-primary-600 transition-colors duration-200">버튼</button>
20
+
21
+ {/* 호버: 그림자 */}
22
+ <button className="shadow-sm hover:shadow-md transition-shadow duration-200">버튼</button>
23
+
24
+ {/* 호버: 크기 */}
25
+ <button className="hover:scale-105 transition-transform duration-200">버튼</button>
26
+
27
+ {/* 클릭: Scale down */}
28
+ <button className="active:scale-95 transition-transform duration-150">버튼</button>
29
+
30
+ {/* 로딩 */}
31
+ <button disabled className="bg-primary-500 text-white flex items-center gap-2">
32
+ <svg className="w-5 h-5 animate-spin" />{isLoading ? '처리 중...' : '저장하기'}
33
+ </button>
34
+ ```
35
+
36
+ </button>
37
+
38
+ ---
39
+
40
+ <input>
41
+
42
+ ```tsx
43
+ {/* 포커스: 링 */}
44
+ <input className="border focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-all duration-200" />
45
+
46
+ {/* 플로팅 레이블 */}
47
+ <div className="relative">
48
+ <input
49
+ id="email"
50
+ className="peer w-full h-12 px-3 pt-5 pb-1 border rounded-lg focus:border-primary-500 transition-colors"
51
+ placeholder=" "
52
+ />
53
+ <label
54
+ htmlFor="email"
55
+ className="absolute left-3 top-1/2 -translate-y-1/2 transition-all duration-200 peer-focus:top-2 peer-focus:text-xs peer-focus:text-primary-500 peer-[:not(:placeholder-shown)]:top-2 peer-[:not(:placeholder-shown)]:text-xs"
56
+ >
57
+ 이메일
58
+ </label>
59
+ </div>
60
+
61
+ {/* 에러 Shake */}
62
+ <input className={hasError ? 'animate-shake border-red-500' : 'border-gray-300'} />
63
+
64
+ @keyframes shake {
65
+ 0%, 100% { transform: translateX(0); }
66
+ 25% { transform: translateX(-8px); }
67
+ 75% { transform: translateX(8px); }
68
+ }
69
+ ```
70
+
71
+ </input>
72
+
73
+ ---
74
+
75
+ <card>
76
+
77
+ ```tsx
78
+ {/* 미세한 그림자 */}
79
+ <div className="border rounded-xl hover:shadow-md transition-shadow duration-300" />
80
+
81
+ {/* 들어올리기 */}
82
+ <div className="border rounded-xl hover:-translate-y-1 hover:shadow-lg transition-all duration-300" />
83
+
84
+ {/* 테두리 색상 */}
85
+ <div className="border border-gray-200 rounded-xl hover:border-primary-500 transition-colors duration-300" />
86
+
87
+ {/* 클릭 가능 */}
88
+ <button className="w-full text-left p-4 border rounded-xl hover:border-primary-500 hover:shadow-md active:scale-[0.98] transition-all duration-200" />
89
+ ```
90
+
91
+ </card>
92
+
93
+ ---
94
+
95
+ <toggle>
96
+
97
+ ```tsx
98
+ {/* 스위치 */}
99
+ <button
100
+ onClick={() => setEnabled(!enabled)}
101
+ className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors duration-200 ${
102
+ enabled ? 'bg-primary-500' : 'bg-gray-300'
103
+ }`}
104
+ >
105
+ <span
106
+ className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform duration-200 ${
107
+ enabled ? 'translate-x-6' : 'translate-x-1'
108
+ }`}
109
+ />
110
+ </button>
111
+
112
+ {/* 체크박스 */}
113
+ <label className="flex items-center gap-2 cursor-pointer">
114
+ <input type="checkbox" className="peer sr-only" />
115
+ <div className="w-5 h-5 border-2 border-gray-300 rounded peer-checked:bg-primary-500 peer-checked:border-primary-500 transition-all duration-200 flex items-center justify-center">
116
+ <svg className="w-3 h-3 text-white scale-0 peer-checked:scale-100 transition-transform duration-200" />
117
+ </div>
118
+ <span>옵션</span>
119
+ </label>
120
+ ```
121
+
122
+ </toggle>
123
+
124
+ ---
125
+
126
+ <modal>
127
+
128
+ ```tsx
129
+ {/* 페이드 인 */}
130
+ <div className={`fixed inset-0 bg-black/50 transition-opacity duration-300 ${
131
+ isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'
132
+ }`}>
133
+ <div className={`fixed inset-0 flex items-center justify-center transition-transform duration-300 ${
134
+ isOpen ? 'scale-100' : 'scale-95'
135
+ }`}>
136
+ <div className="bg-white rounded-2xl p-6 max-w-md" />
137
+ </div>
138
+ </div>
139
+
140
+ {/* 슬라이드 업 (바텀시트) */}
141
+ <div className={`fixed bottom-0 inset-x-0 bg-white rounded-t-2xl transition-transform duration-300 ${
142
+ isOpen ? 'translate-y-0' : 'translate-y-full'
143
+ }`} />
144
+ ```
145
+
146
+ </modal>
147
+
148
+ ---
149
+
150
+ <loading>
151
+
152
+ ```tsx
153
+ {/* 스켈레톤 */}
154
+ <div className="space-y-3 animate-pulse">
155
+ <div className="h-4 bg-gray-200 rounded w-3/4" />
156
+ <div className="h-4 bg-gray-200 rounded w-1/2" />
157
+ </div>
158
+
159
+ {/* 스피너 */}
160
+ <svg className="w-6 h-6 animate-spin text-primary-500">
161
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" fill="none" />
162
+ <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" />
163
+ </svg>
164
+
165
+ {/* 프로그레스 바 */}
166
+ <div className="fixed top-0 left-0 right-0 h-1 bg-gray-200">
167
+ <div className="h-full bg-primary-500 transition-all duration-300" style={{ width: `${progress}%` }} />
168
+ </div>
169
+ ```
170
+
171
+ </loading>
172
+
173
+ ---
174
+
175
+ <toast>
176
+
177
+ ```tsx
178
+ {/* 하단 슬라이드 업 */}
179
+ <div className={`fixed bottom-4 left-1/2 -translate-x-1/2 transition-all duration-300 ${
180
+ isVisible ? 'translate-y-0 opacity-100' : 'translate-y-4 opacity-0 pointer-events-none'
181
+ }`}>
182
+ <div className="bg-gray-900 text-white px-4 py-3 rounded-lg shadow-lg">
183
+ 저장되었습니다
184
+ </div>
185
+ </div>
186
+
187
+ {/* 우측 슬라이드 인 */}
188
+ <div className={`fixed top-4 right-4 transition-all duration-300 ${
189
+ isVisible ? 'translate-x-0 opacity-100' : 'translate-x-4 opacity-0 pointer-events-none'
190
+ }`}>
191
+ <div className="bg-white border px-4 py-3 rounded-lg shadow-lg">
192
+ 작업이 완료되었습니다
193
+ </div>
194
+ </div>
195
+ ```
196
+
197
+ </toast>
198
+
199
+ ---
200
+
201
+ <page_transition>
202
+
203
+ ```tsx
204
+ {/* Fade */}
205
+ <div className="animate-fadeIn" />
206
+
207
+ @keyframes fadeIn {
208
+ from { opacity: 0; }
209
+ to { opacity: 1; }
210
+ }
211
+
212
+ {/* Slide Up */}
213
+ <div className="animate-slideUp" />
214
+
215
+ @keyframes slideUp {
216
+ from { opacity: 0; transform: translateY(20px); }
217
+ to { opacity: 1; transform: translateY(0); }
218
+ }
219
+ ```
220
+
221
+ </page_transition>
222
+
223
+ ---
224
+
225
+ <avoid>
226
+
227
+ ❌ 모든 요소에 애니메이션
228
+ ❌ 300ms+ 느린 전환
229
+ ❌ 복잡한 3D 효과
230
+ ❌ 자동 재생 애니메이션 (접근성)
231
+
232
+ **Reduced Motion:**
233
+ ```css
234
+ @media (prefers-reduced-motion: reduce) {
235
+ * {
236
+ animation-duration: 0.01ms !important;
237
+ animation-iteration-count: 1 !important;
238
+ transition-duration: 0.01ms !important;
239
+ }
240
+ }
241
+ ```
242
+
243
+ ```tsx
244
+ const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
245
+ <button className={prefersReducedMotion ? '' : 'hover:scale-105 transition-transform'}>버튼</button>
246
+ ```
247
+
248
+ </avoid>
249
+
250
+ ---
251
+
252
+ <sources>
253
+
254
+ - [디자인베이스 - 마이크로인터랙션](https://designbase.co.kr/dictionary/microinteractions/)
255
+ - [디자인키트 - Micro Interactions](https://www.designkits.co.kr/blog/web-terminology/Micro-Interactions)
256
+ - [Micron.js](https://webkul.github.io/micron/)
257
+ - [CSS 애니메이션으로 UX 향상](https://velog.io/@jiheon788/Micro-Interactions의-도입-CSS-애니메이션으로-사용자-경험UX-향상하기)
258
+
259
+ </sources>
@@ -0,0 +1,115 @@
1
+ # 반응형 패턴
2
+
3
+ <breakpoints>
4
+
5
+ ```
6
+ sm: 640px | md: 768px | lg: 1024px | xl: 1280px
7
+ 모바일 | 태블릿 | 소형 데스크톱 | 데스크톱
8
+ ```
9
+
10
+ </breakpoints>
11
+
12
+ ---
13
+
14
+ <navigation>
15
+
16
+ **데스크톱:** 상단 헤더 + 좌측 사이드바
17
+ **태블릿:** 상단 헤더 + 햄버거 메뉴 (오버레이)
18
+ **모바일:** 상단 헤더 + 하단 탭바
19
+
20
+ ```tsx
21
+ {/* 사이드바: 데스크톱만 */}
22
+ <aside className="hidden lg:block w-60" />
23
+
24
+ {/* 하단 탭바: 모바일만 */}
25
+ <nav className="lg:hidden fixed bottom-0 w-full" />
26
+ ```
27
+
28
+ </navigation>
29
+
30
+ ---
31
+
32
+ <grid>
33
+
34
+ **데스크톱:** 3-4 컬럼 | **태블릿:** 2 컬럼 | **모바일:** 1-2 컬럼
35
+
36
+ ```tsx
37
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
38
+ {items.map(item => <Card key={item.id} {...item} />)}
39
+ </div>
40
+ ```
41
+
42
+ </grid>
43
+
44
+ ---
45
+
46
+ <table_to_card>
47
+
48
+ ```tsx
49
+ {/* 데스크톱: 테이블 */}
50
+ <table className="hidden md:table w-full">
51
+ <thead><tr><th>이름</th><th>이메일</th></tr></thead>
52
+ <tbody>
53
+ {users.map(user => <tr key={user.id}><td>{user.name}</td></tr>)}
54
+ </tbody>
55
+ </table>
56
+
57
+ {/* 모바일: 카드 */}
58
+ <div className="md:hidden space-y-3">
59
+ {users.map(user => (
60
+ <div key={user.id} className="p-4 border rounded-lg">
61
+ <div className="font-semibold">{user.name}</div>
62
+ <div className="text-sm text-gray-600">{user.email}</div>
63
+ </div>
64
+ ))}
65
+ </div>
66
+ ```
67
+
68
+ </table_to_card>
69
+
70
+ ---
71
+
72
+ <touch_optimization>
73
+
74
+ **최소 터치 타겟:** 44px × 44px
75
+ **버튼 간 간격:** 최소 8px
76
+
77
+ ```tsx
78
+ {/* ✅ 충분한 터치 영역 */}
79
+ <button className="h-11 px-4">버튼</button>
80
+
81
+ {/* ❌ 너무 작음 */}
82
+ <button className="h-6 px-2 text-xs">버튼</button>
83
+ ```
84
+
85
+ </touch_optimization>
86
+
87
+ ---
88
+
89
+ <container_width>
90
+
91
+ | 용도 | max-w | 패딩 |
92
+ |------|-------|------|
93
+ | 대시보드 | max-w-7xl | px-4 md:px-6 lg:px-8 |
94
+ | 콘텐츠 | max-w-3xl | px-4 md:px-6 |
95
+ | 폼/설정 | max-w-md | px-4 |
96
+
97
+ </container_width>
98
+
99
+ ---
100
+
101
+ <spacing>
102
+
103
+ **패딩:** 모바일 px-4 (16px) | 태블릿 px-6 (24px) | 데스크톱 px-8 (32px)
104
+ **섹션 간:** space-y-8 md:space-y-12 (32px → 48px)
105
+ **카드 내부:** p-4 md:p-6 (16px → 24px)
106
+
107
+ ```tsx
108
+ <div className="px-4 md:px-6 lg:px-8">
109
+ <div className="space-y-8 md:space-y-12">
110
+ <section className="p-4 md:p-6 border rounded-lg" />
111
+ </div>
112
+ </div>
113
+ ```
114
+
115
+ </spacing>