@kood/claude-code 0.3.12 → 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.
- package/dist/index.js +30 -8
- package/package.json +4 -4
- package/templates/.claude/skills/korea-uiux-design/SKILL.md +444 -0
- package/templates/.claude/skills/korea-uiux-design/references/accessibility.md +298 -0
- package/templates/.claude/skills/korea-uiux-design/references/checklist.md +107 -0
- package/templates/.claude/skills/korea-uiux-design/references/color-system.md +156 -0
- package/templates/.claude/skills/korea-uiux-design/references/design-philosophy.md +25 -0
- package/templates/.claude/skills/korea-uiux-design/references/icon-guide.md +180 -0
- package/templates/.claude/skills/korea-uiux-design/references/micro-interactions.md +259 -0
- package/templates/.claude/skills/korea-uiux-design/references/responsive-patterns.md +115 -0
- package/templates/.claude/skills/korea-uiux-design/references/service-patterns.md +206 -0
- package/templates/.claude/skills/korea-uiux-design/references/state-patterns.md +320 -0
- package/templates/.claude/skills/korea-uiux-design/references/typography.md +70 -0
- package/templates/.claude/skills/nextjs-react-best-practices/AGENTS.md +663 -0
- package/templates/.claude/skills/nextjs-react-best-practices/SKILL.md +269 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +751 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +431 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-defer-await.md +80 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-dependencies.md +36 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-loader.md +44 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-parallel.md +28 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-conditional.md +31 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-lazy-routes.md +67 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-preload.md +50 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-event-listeners.md +74 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-tanstack-query.md +77 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-storage.md +70 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-early-exit.md +50 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-index-maps.md +37 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-length-check-first.md +49 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-memo.md +44 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-transitions.md +40 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-cache-lru.md +41 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +67 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-parallel-fetching.md +60 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +38 -0
- package/templates/.claude/skills/vercel-react-best-practices/AGENTS.md +0 -2249
- package/templates/.claude/skills/vercel-react-best-practices/SKILL.md +0 -125
- package/templates/.claude/skills/vs-design-diverge/SKILL.md +0 -307
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/advanced-event-handler-refs.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/advanced-use-latest.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/async-api-routes.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/async-defer-await.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/async-dependencies.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/async-parallel.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/async-suspense-boundaries.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/bundle-barrel-imports.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/bundle-conditional.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/bundle-defer-third-party.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/bundle-dynamic-imports.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/bundle-preload.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/client-event-listeners.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/client-swr-dedup.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-batch-dom-css.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-cache-function-results.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-cache-property-access.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-cache-storage.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-combine-iterations.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-early-exit.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-hoist-regexp.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-index-maps.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-length-check-first.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-min-max-loop.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-set-map-lookups.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/js-tosorted-immutable.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rendering-activity.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rendering-conditional-render.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rendering-content-visibility.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rendering-hoist-jsx.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rendering-svg-precision.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rerender-defer-reads.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rerender-dependencies.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rerender-derived-state.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rerender-functional-setstate.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rerender-lazy-state-init.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rerender-memo.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/rerender-transitions.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/server-after-nonblocking.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/server-cache-lru.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/server-cache-react.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/server-parallel-fetching.md +0 -0
- /package/templates/.claude/skills/{vercel-react-best-practices → nextjs-react-best-practices}/rules/server-serialization.md +0 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# 접근성
|
|
2
|
+
|
|
3
|
+
<legal_basis>
|
|
4
|
+
|
|
5
|
+
**법적 근거:** 지능정보화기본법 제47조, 시행규칙 제5조
|
|
6
|
+
**국가표준:** KWCAG 2.2 (한국형 웹 콘텐츠 접근성 지침)
|
|
7
|
+
**국제표준:** WCAG 2.1/2.2
|
|
8
|
+
**인증:** 한국디지털접근성진흥원
|
|
9
|
+
|
|
10
|
+
</legal_basis>
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<contrast>
|
|
15
|
+
|
|
16
|
+
**WCAG AA (필수):** 일반 텍스트 4.5:1+ | 큰 텍스트 3:1+ (18pt/24px+ 또는 14pt/18.66px+ Bold)
|
|
17
|
+
**WCAG AAA (권장):** 일반 텍스트 7:1+ | 큰 텍스트 4.5:1+
|
|
18
|
+
**척도:** 1:1 (구분 불가) ~ 21:1 (최대 대비)
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
{/* ✅ AA 충족 (4.5:1+) */}
|
|
22
|
+
<p className="text-gray-900 bg-white">일반 텍스트</p>
|
|
23
|
+
|
|
24
|
+
{/* ✅ 큰 텍스트 (3:1+) */}
|
|
25
|
+
<h1 className="text-2xl font-bold text-gray-700 bg-white">제목</h1>
|
|
26
|
+
|
|
27
|
+
{/* ❌ 대비 부족 (2:1) */}
|
|
28
|
+
<p className="text-gray-400 bg-white">읽기 어려움</p>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**도구:** [Contrast Finder](https://app.contrast-finder.org/), Chrome DevTools
|
|
32
|
+
|
|
33
|
+
</contrast>
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
<keyboard>
|
|
38
|
+
|
|
39
|
+
**Tab 순서:** 논리적 순서 유지, tabindex 명시 금지
|
|
40
|
+
|
|
41
|
+
| 키 | 동작 |
|
|
42
|
+
|------|------|
|
|
43
|
+
| Tab | 다음 요소 |
|
|
44
|
+
| Shift+Tab | 이전 요소 |
|
|
45
|
+
| Enter | 버튼/링크 활성화 |
|
|
46
|
+
| Space | 버튼 활성화, 체크박스 토글 |
|
|
47
|
+
| Esc | 모달/드롭다운 닫기 |
|
|
48
|
+
| Arrow | 라디오, 탭 이동 |
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
{/* ✅ 명확한 포커스 */}
|
|
52
|
+
<button className="focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2">
|
|
53
|
+
버튼
|
|
54
|
+
</button>
|
|
55
|
+
|
|
56
|
+
{/* ❌ 포커스 스타일 제거 금지 */}
|
|
57
|
+
<button className="focus:outline-none">버튼</button>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
</keyboard>
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
<semantic_html>
|
|
65
|
+
|
|
66
|
+
```tsx
|
|
67
|
+
{/* ✅ Semantic HTML */}
|
|
68
|
+
<header>
|
|
69
|
+
<nav><ul><li><a href="/">홈</a></li></ul></nav>
|
|
70
|
+
</header>
|
|
71
|
+
<main><article><h1>제목</h1><p>본문</p></article></main>
|
|
72
|
+
<footer><p>© 2026 회사명</p></footer>
|
|
73
|
+
|
|
74
|
+
{/* ❌ Div만 사용 */}
|
|
75
|
+
<div className="header"><div className="nav"><div>홈</div></div></div>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
</semantic_html>
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
<aria>
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
{/* aria-label */}
|
|
86
|
+
<button aria-label="메뉴 열기"><svg className="w-6 h-6" /></button>
|
|
87
|
+
|
|
88
|
+
{/* aria-labelledby */}
|
|
89
|
+
<div aria-labelledby="dialog-title">
|
|
90
|
+
<h2 id="dialog-title">확인</h2>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
{/* aria-describedby */}
|
|
94
|
+
<input aria-describedby="email-hint" />
|
|
95
|
+
<span id="email-hint">example@email.com 형식</span>
|
|
96
|
+
|
|
97
|
+
{/* aria-hidden */}
|
|
98
|
+
<svg aria-hidden="true" className="w-5 h-5" />
|
|
99
|
+
|
|
100
|
+
{/* 상태 표시 */}
|
|
101
|
+
<button aria-expanded={isOpen} aria-controls="menu">메뉴</button>
|
|
102
|
+
<div role="tab" aria-selected={isActive}>탭</div>
|
|
103
|
+
<div role="checkbox" aria-checked={isChecked}>옵션</div>
|
|
104
|
+
|
|
105
|
+
{/* Live Regions */}
|
|
106
|
+
<div role="status" aria-live="polite" aria-atomic="true" className="sr-only">
|
|
107
|
+
{message}
|
|
108
|
+
</div>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**aria-live:** polite (사용자 작업 후) | assertive (즉시) | off (없음)
|
|
112
|
+
|
|
113
|
+
</aria>
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
<screen_reader>
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
{/* 스크린 리더 전용 텍스트 */}
|
|
121
|
+
<span className="sr-only">현재 페이지: 홈</span>
|
|
122
|
+
|
|
123
|
+
/* Tailwind CSS */
|
|
124
|
+
.sr-only {
|
|
125
|
+
position: absolute;
|
|
126
|
+
width: 1px;
|
|
127
|
+
height: 1px;
|
|
128
|
+
padding: 0;
|
|
129
|
+
margin: -1px;
|
|
130
|
+
overflow: hidden;
|
|
131
|
+
clip: rect(0, 0, 0, 0);
|
|
132
|
+
white-space: nowrap;
|
|
133
|
+
border-width: 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
{/* 의미있는 아이콘 */}
|
|
137
|
+
<button aria-label="검색"><svg aria-hidden="true" className="w-5 h-5" /></button>
|
|
138
|
+
|
|
139
|
+
{/* 장식용 아이콘 */}
|
|
140
|
+
<button><svg aria-hidden="true" className="w-5 h-5" /><span>검색</span></button>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
</screen_reader>
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
<forms>
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
{/* ✅ label + input 연결 */}
|
|
151
|
+
<div>
|
|
152
|
+
<label htmlFor="email" className="block text-sm font-medium mb-2">이메일</label>
|
|
153
|
+
<input id="email" type="email" className="w-full h-11 px-3 border rounded-lg" />
|
|
154
|
+
</div>
|
|
155
|
+
|
|
156
|
+
{/* 필수 필드 */}
|
|
157
|
+
<div>
|
|
158
|
+
<label htmlFor="name">
|
|
159
|
+
이름 <span className="text-red-500" aria-label="필수">*</span>
|
|
160
|
+
</label>
|
|
161
|
+
<input id="name" required aria-required="true" />
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
{/* 에러 메시지 */}
|
|
165
|
+
<div>
|
|
166
|
+
<label htmlFor="password">비밀번호</label>
|
|
167
|
+
<input
|
|
168
|
+
id="password"
|
|
169
|
+
aria-invalid={hasError}
|
|
170
|
+
aria-describedby="password-error"
|
|
171
|
+
className={hasError ? 'border-red-500' : 'border-gray-300'}
|
|
172
|
+
/>
|
|
173
|
+
{hasError && (
|
|
174
|
+
<p id="password-error" className="text-sm text-red-600 mt-1" role="alert">
|
|
175
|
+
비밀번호는 8자 이상이어야 합니다
|
|
176
|
+
</p>
|
|
177
|
+
)}
|
|
178
|
+
</div>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
</forms>
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
<color_independence>
|
|
186
|
+
|
|
187
|
+
```tsx
|
|
188
|
+
{/* ❌ 색상만 */}
|
|
189
|
+
<span className="text-red-500">오류</span>
|
|
190
|
+
|
|
191
|
+
{/* ✅ 아이콘 + 텍스트 */}
|
|
192
|
+
<div className="flex items-center gap-2 text-red-500">
|
|
193
|
+
<svg className="w-5 h-5" aria-hidden="true" />
|
|
194
|
+
<span>오류가 발생했습니다</span>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
{/* ✅ 패턴/모양 추가 */}
|
|
198
|
+
<button className="border-2 border-dashed border-primary-500">선택됨</button>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
</color_independence>
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
<images>
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
{/* ✅ 의미있는 이미지 */}
|
|
209
|
+
<img src="/logo.png" alt="회사 로고" />
|
|
210
|
+
|
|
211
|
+
{/* ✅ 정보 전달 */}
|
|
212
|
+
<img src="/graph.png" alt="2026년 1월 매출 15% 증가를 보여주는 그래프" />
|
|
213
|
+
|
|
214
|
+
{/* ✅ 장식용 */}
|
|
215
|
+
<img src="/decoration.png" alt="" role="presentation" />
|
|
216
|
+
|
|
217
|
+
{/* ❌ 불명확 */}
|
|
218
|
+
<img src="/photo.png" alt="이미지" />
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
</images>
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
<modal>
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
<div
|
|
229
|
+
role="dialog"
|
|
230
|
+
aria-modal="true"
|
|
231
|
+
aria-labelledby="modal-title"
|
|
232
|
+
className="fixed inset-0 z-50"
|
|
233
|
+
>
|
|
234
|
+
<div className="fixed inset-0 bg-black/50" onClick={onClose} aria-hidden="true" />
|
|
235
|
+
<div className="fixed inset-0 flex items-center justify-center p-4">
|
|
236
|
+
<div className="bg-white rounded-2xl max-w-md w-full p-6">
|
|
237
|
+
<h2 id="modal-title" className="text-xl font-semibold">제목</h2>
|
|
238
|
+
<div>{children}</div>
|
|
239
|
+
<button onClick={onClose} aria-label="모달 닫기" className="absolute top-4 right-4">
|
|
240
|
+
✕
|
|
241
|
+
</button>
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
</div>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
</modal>
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
<responsive_text>
|
|
252
|
+
|
|
253
|
+
```tsx
|
|
254
|
+
{/* ✅ 상대 단위 (rem, em) */}
|
|
255
|
+
<p className="text-base">{/* 1rem = 16px */}본문</p>
|
|
256
|
+
|
|
257
|
+
{/* ❌ 고정 픽셀 */}
|
|
258
|
+
<p style={{ fontSize: '14px' }}>본문</p>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
</responsive_text>
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
<checklist>
|
|
266
|
+
|
|
267
|
+
### 필수
|
|
268
|
+
|
|
269
|
+
- [ ] 명암 대비 4.5:1+ (AA)
|
|
270
|
+
- [ ] 키보드 모든 기능 접근
|
|
271
|
+
- [ ] 포커스 스타일 명확
|
|
272
|
+
- [ ] Semantic HTML
|
|
273
|
+
- [ ] 모든 이미지 alt
|
|
274
|
+
- [ ] 폼 레이블 + input 연결
|
|
275
|
+
- [ ] 색상만 정보 전달 금지
|
|
276
|
+
- [ ] 스크린 리더 테스트
|
|
277
|
+
|
|
278
|
+
### 권장
|
|
279
|
+
|
|
280
|
+
- [ ] 명암 대비 7:1+ (AAA)
|
|
281
|
+
- [ ] ARIA 적절 사용
|
|
282
|
+
- [ ] Skip to content 링크
|
|
283
|
+
- [ ] 반응형 텍스트 (rem)
|
|
284
|
+
- [ ] 키보드 단축키
|
|
285
|
+
|
|
286
|
+
</checklist>
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
<sources>
|
|
291
|
+
|
|
292
|
+
- [WCAG 2.2 한국어](https://a11ykr.github.io/wcag22/)
|
|
293
|
+
- [한국디지털접근성진흥원](http://www.kwacc.or.kr/)
|
|
294
|
+
- [WCAG 2.1 Korean Translation](http://www.kwacc.or.kr/WAI/wcag21/)
|
|
295
|
+
- [MDN - 웹 접근성](https://developer.mozilla.org/ko/docs/Web/Accessibility/Guides/Understanding_WCAG)
|
|
296
|
+
- [Contrast Finder](https://app.contrast-finder.org/)
|
|
297
|
+
|
|
298
|
+
</sources>
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# 화면별 체크리스트
|
|
2
|
+
|
|
3
|
+
<all_screens>
|
|
4
|
+
|
|
5
|
+
- [ ] 페이지 제목 명확
|
|
6
|
+
- [ ] 주요 액션 눈에 띔
|
|
7
|
+
- [ ] 로딩/에러/빈 상태 디자인
|
|
8
|
+
- [ ] 모바일 터치 44px+
|
|
9
|
+
- [ ] 헤더/네비게이션 스크롤 처리
|
|
10
|
+
|
|
11
|
+
</all_screens>
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<forms>
|
|
16
|
+
|
|
17
|
+
- [ ] 레이블 명확
|
|
18
|
+
- [ ] 필수/선택 구분
|
|
19
|
+
- [ ] 에러 메시지 인풋 근처
|
|
20
|
+
- [ ] 키보드 타입 적절
|
|
21
|
+
- [ ] 제출 버튼 항상 보임
|
|
22
|
+
- [ ] 비활성 상태 명확
|
|
23
|
+
|
|
24
|
+
</forms>
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
<lists>
|
|
29
|
+
|
|
30
|
+
- [ ] 아이템 간 시각적 구분
|
|
31
|
+
- [ ] 빈 상태 메시지
|
|
32
|
+
- [ ] 무한 스크롤/페이지네이션
|
|
33
|
+
- [ ] 검색/필터
|
|
34
|
+
- [ ] 스켈레톤 UI
|
|
35
|
+
- [ ] 클릭 영역 충분
|
|
36
|
+
|
|
37
|
+
</lists>
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
<detail>
|
|
42
|
+
|
|
43
|
+
- [ ] 뒤로가기 명확
|
|
44
|
+
- [ ] 핵심 정보 상단
|
|
45
|
+
- [ ] 액션 버튼 접근 용이
|
|
46
|
+
- [ ] 관련 정보 네비게이션
|
|
47
|
+
- [ ] 부가 액션 (공유/즐겨찾기)
|
|
48
|
+
|
|
49
|
+
</detail>
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
<dashboard>
|
|
54
|
+
|
|
55
|
+
- [ ] 중요 지표 상단
|
|
56
|
+
- [ ] 섹션별 명확 구분
|
|
57
|
+
- [ ] 빠른 액션 버튼
|
|
58
|
+
- [ ] 최근 활동/알림
|
|
59
|
+
- [ ] 반응형 그리드 변환
|
|
60
|
+
|
|
61
|
+
</dashboard>
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
<settings>
|
|
66
|
+
|
|
67
|
+
- [ ] 섹션별 그룹핑
|
|
68
|
+
- [ ] 항목 설명 명확
|
|
69
|
+
- [ ] 토글/스위치 터치 용이
|
|
70
|
+
- [ ] 위험 액션 구분
|
|
71
|
+
- [ ] 자동 저장 여부 명시
|
|
72
|
+
|
|
73
|
+
</settings>
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
<modal>
|
|
78
|
+
|
|
79
|
+
- [ ] 닫기 버튼 명확
|
|
80
|
+
- [ ] 외부 클릭 시 닫힘
|
|
81
|
+
- [ ] ESC 키 닫힘
|
|
82
|
+
- [ ] 모바일 스와이프 닫기
|
|
83
|
+
- [ ] 백드롭 적절한 투명도
|
|
84
|
+
|
|
85
|
+
</modal>
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
<error_state>
|
|
90
|
+
|
|
91
|
+
- [ ] 에러 메시지 이해 쉬움
|
|
92
|
+
- [ ] 해결 방법 제시
|
|
93
|
+
- [ ] 재시도 버튼
|
|
94
|
+
- [ ] 에러 아이콘
|
|
95
|
+
|
|
96
|
+
</error_state>
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
<empty_state>
|
|
101
|
+
|
|
102
|
+
- [ ] 빈 상태 메시지 친근
|
|
103
|
+
- [ ] 액션 버튼 제공
|
|
104
|
+
- [ ] 일러스트/아이콘
|
|
105
|
+
- [ ] 다음 단계 명확
|
|
106
|
+
|
|
107
|
+
</empty_state>
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# 색상 시스템
|
|
2
|
+
|
|
3
|
+
<color_structure>
|
|
4
|
+
|
|
5
|
+
| 색상 | 용도 | 비율 |
|
|
6
|
+
|------|------|------|
|
|
7
|
+
| **Primary** | 버튼, 링크, 활성 상태 | 10% |
|
|
8
|
+
| **Secondary** | 필터, 칩, 보조 버튼 | 30% |
|
|
9
|
+
| **Background** | 배경 | 60% |
|
|
10
|
+
| **Semantic** | Success/Error/Warning/Info | 필요시 |
|
|
11
|
+
|
|
12
|
+
**60-30-10 규칙:** Background 60% | Secondary 30% | Primary 10%
|
|
13
|
+
|
|
14
|
+
</color_structure>
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<semantic_colors>
|
|
19
|
+
|
|
20
|
+
| 용도 | 색상 | 용례 |
|
|
21
|
+
|------|------|------|
|
|
22
|
+
| Success | Green | 성공 메시지, 완료 상태 |
|
|
23
|
+
| Error | Red | 에러 메시지, 위험 경고 |
|
|
24
|
+
| Warning | Yellow/Orange | 주의 알림, 중요 정보 |
|
|
25
|
+
| Info | Blue | 일반 정보, 도움말 |
|
|
26
|
+
|
|
27
|
+
</semantic_colors>
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
<krds>
|
|
32
|
+
|
|
33
|
+
**한국 정부 표준 (KRDS):** 240개 색상 (24개 × 10단계), 50이 기본, WCAG AA
|
|
34
|
+
|
|
35
|
+
```css
|
|
36
|
+
/* Primary Blue */
|
|
37
|
+
--primary-50: #2196F3; /* 기본 */
|
|
38
|
+
--primary-500: #2196F3;
|
|
39
|
+
--primary-600: #1E88E5;
|
|
40
|
+
|
|
41
|
+
/* Grayscale */
|
|
42
|
+
--gray-50: #9E9E9E;
|
|
43
|
+
--gray-600: #757575;
|
|
44
|
+
--gray-900: #212121;
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
</krds>
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
<service_colors>
|
|
52
|
+
|
|
53
|
+
| 서비스 | Primary | Secondary | 특징 |
|
|
54
|
+
|--------|---------|-----------|------|
|
|
55
|
+
| **토스** | Blue #3182F6 | Gray | 신뢰감, 단순 명확, 강한 파란색 |
|
|
56
|
+
| **카카오** | Yellow #FEE500 | Brown #3C1E1E | 친근함, 말풍선, radius 12px |
|
|
57
|
+
| **배민** | Teal #2AC1BC | Coral/Pink | 신선함, 손글씨 폰트, 일러스트 |
|
|
58
|
+
|
|
59
|
+
</service_colors>
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
<tailwind_config>
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
// tailwind.config.js
|
|
67
|
+
colors: {
|
|
68
|
+
primary: {
|
|
69
|
+
DEFAULT: '#2196F3',
|
|
70
|
+
50: '#E3F2FD',
|
|
71
|
+
500: '#2196F3',
|
|
72
|
+
600: '#1E88E5',
|
|
73
|
+
},
|
|
74
|
+
success: { DEFAULT: '#4CAF50', light: '#81C784', dark: '#388E3C' },
|
|
75
|
+
error: { DEFAULT: '#F44336', light: '#E57373', dark: '#D32F2F' },
|
|
76
|
+
warning: { DEFAULT: '#FF9800', light: '#FFB74D', dark: '#F57C00' },
|
|
77
|
+
info: { DEFAULT: '#2196F3', light: '#64B5F6', dark: '#1976D2' },
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
</tailwind_config>
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
<dark_mode>
|
|
86
|
+
|
|
87
|
+
| 모드 | 배경 | 텍스트 |
|
|
88
|
+
|------|------|--------|
|
|
89
|
+
| **Light** | #FFFFFF, #F5F5F5 | #212121, #757575 |
|
|
90
|
+
| **Dark** | #121212, #1E1E1E | #FFFFFF, #B0B0B0 |
|
|
91
|
+
|
|
92
|
+
**특징:** 순수 검정(#000) 지양 → #121212, Primary 약간 밝게
|
|
93
|
+
|
|
94
|
+
</dark_mode>
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
<accessibility>
|
|
99
|
+
|
|
100
|
+
**WCAG AA:** 일반 텍스트 4.5:1+ | 큰 텍스트 3:1+
|
|
101
|
+
**WCAG AAA:** 일반 텍스트 7:1+ | 큰 텍스트 4.5:1+
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
{/* ❌ 색상만 */}
|
|
105
|
+
<span className="text-red-500">오류</span>
|
|
106
|
+
|
|
107
|
+
{/* ✅ 아이콘 + 텍스트 */}
|
|
108
|
+
<div className="flex items-center gap-2 text-red-500">
|
|
109
|
+
<svg className="w-5 h-5" />
|
|
110
|
+
<span>오류가 발생했습니다</span>
|
|
111
|
+
</div>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**색약 고려:** 빨강-초록 색맹, 파랑-노랑 구분, 형태/아이콘 추가
|
|
115
|
+
|
|
116
|
+
</accessibility>
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
<examples>
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
{/* Primary Button */}
|
|
124
|
+
<button className="bg-primary-500 hover:bg-primary-600 text-white">저장하기</button>
|
|
125
|
+
|
|
126
|
+
{/* Secondary Button */}
|
|
127
|
+
<button className="bg-secondary-200 hover:bg-secondary-300 text-secondary-900">취소</button>
|
|
128
|
+
|
|
129
|
+
{/* Success State */}
|
|
130
|
+
<div className="bg-success-light/10 border border-success text-success-dark p-3 rounded-lg">
|
|
131
|
+
<div className="flex items-center gap-2">
|
|
132
|
+
<svg className="w-5 h-5" />
|
|
133
|
+
<span>성공적으로 저장되었습니다</span>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
{/* Error State */}
|
|
138
|
+
<div className="bg-error-light/10 border border-error text-error-dark p-3 rounded-lg">
|
|
139
|
+
<div className="flex items-center gap-2">
|
|
140
|
+
<svg className="w-5 h-5" />
|
|
141
|
+
<span>오류가 발생했습니다</span>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
</examples>
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
<sources>
|
|
151
|
+
|
|
152
|
+
- [KRDS 색상 가이드](https://www.krds.go.kr/html/site/style/style_02.html)
|
|
153
|
+
- [Gmarket Design System - Colors](https://gds.gmarket.co.kr/foundation/color)
|
|
154
|
+
- [리메인 - 브랜드 컬러](https://www.remain.co.kr/page/designsystem/brand-color.php)
|
|
155
|
+
|
|
156
|
+
</sources>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# 디자인 철학
|
|
2
|
+
|
|
3
|
+
<principles>
|
|
4
|
+
|
|
5
|
+
| 원칙 | 적용 |
|
|
6
|
+
|------|------|
|
|
7
|
+
| **정보 밀도** | 계층 구분, 한 화면에 핵심만, 상세는 펼침/모달 |
|
|
8
|
+
| **미니멀리즘** | 불필요한 장식 제거, 미세한 보더로 구분 |
|
|
9
|
+
| **곡선** | border-radius 8-16px, pill 형태는 태그/뱃지만 |
|
|
10
|
+
| **UX 라이팅** | "입력하세요" → "어떤 이름으로 불러드릴까요?" |
|
|
11
|
+
|
|
12
|
+
</principles>
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<avoid>
|
|
17
|
+
|
|
18
|
+
| 분류 | 금지 |
|
|
19
|
+
|------|------|
|
|
20
|
+
| **레이아웃** | 1400px+ 콘텐츠, 좁은 여백, 불규칙 정렬, 모바일 가로 스크롤 |
|
|
21
|
+
| **스타일** | 강한 그림자, 화려한 그라데이션, rounded-full 남발, 순수 검정(#000) |
|
|
22
|
+
| **타이포** | 12px 미만, 3+ 폰트 웨이트, 모든 텍스트 중앙 정렬 |
|
|
23
|
+
| **인터랙션** | 300ms+ 애니메이션, 강한 바운스, 자동 재생, 호버 상태 없음 |
|
|
24
|
+
|
|
25
|
+
</avoid>
|